2012-03-01 22 views
44

Estoy creando un complemento jquery y quiero verificar que se haya cargado un script externo. Esto es para una aplicación web interna y puedo mantener la coherencia entre el nombre y la ubicación del script (mysscript.js). Este es también un complemento ajaxy que se puede invocar muchas veces en la página.Verificar que se haya cargado el script externo

Si puedo verificar el guión no está cargado voy a cargarlo usando:

jQuery.getScript() 

¿Cómo puedo comprobar que se carga el guión porque no quiero el mismo guión cargado en la página más ¿de una vez? ¿Es algo de lo que no debería preocuparme debido al almacenamiento en caché del script?

Actualización: Puede que no tenga el control sobre quién utiliza este plugin en nuestra organización y puede que no sea capaz de hacer cumplir que el guión no está ya en la página con o sin un ID específico, pero el nombre del script siempre estará en el mismo lugar con el mismo nombre. Espero poder usar el nombre del script para verificar que esté realmente cargado.

Respuesta

101

Si el script crea ninguna variable o funciones en el espacio global se puede comprobar por su existencia:

JS externo (en ámbito global) -

var myCustomFlag = true; 

Y para comprobar si esto ha funcionado:

if (typeof window.myCustomFlag == 'undefined') { 
    //the flag was not found, so the code has not run 
    $.getScript('<external JS>'); 
} 

actualización

Puede comprobar la existencia de la etiqueta <script> en cuestión mediante la selección de todos los <script> elementos y comprobando sus src atributos:

//get the number of `<script>` elements that have the correct `src` attribute 
var len = $('script').filter(function() { 
    return ($(this).attr('src') == '<external JS>'); 
}).length; 

//if there are no scripts that match, the load it 
if (len === 0) { 
    $.getScript('<external JS>'); 
} 

o simplemente puede hornear este .filter() funcionalidad correcta en el selector:

var len = $('script[src="<external JS>"]').length; 
+0

Sin votos, de lo contrario, le daría +1 a esta respuesta. – shanabus

+0

Esta fue una buena respuesta, desafortunadamente el método jquery.getScript agrega la secuencia de comandos sin fuente especificada. Entonces no pude encontrarlo Utilicé parte de tu respuesta para resolver esto, así que +1. – AGoodDisplayName

+0

@AGoodDisplayName En la devolución de llamada para '$ .getScript()' puede establecer un indicador global que se puede marcar: '$ .getScript (', function() {window.myCustomFlag = true;}')'. Luego puede verificar la existencia del elemento '

3

¿Cree la etiqueta del script con un ID específico y luego verifique si existe ese ID?

O bien, recorra las etiquetas de scripts y compruebe la secuencia de comandos 'src' y asegúrese de que no estén cargadas con el mismo valor que el que desea evitar.

Editar: después de retroalimentación que un ejemplo de código sería útil:

(function(){ 
    var desiredSource = 'https://sitename.com/js/script.js'; 
    var scripts  = document.getElementsByTagName('script'); 
    var alreadyLoaded = false; 

    if(scripts.length){ 
     for(var scriptIndex in scripts) { 
      if(!alreadyLoaded && desiredSource === scripts[scriptIndex].src) { 
       alreadyLoaded = true; 
      } 
     } 
    } 
    if(!alreadyLoaded){ 
     // Run your code in this block? 
    } 
})(); 
+1

+1 para una buena respuesta ante la pregunta se actualiza – zeroef

+0

Esta es la solución perfecta. Recomiendo el segundo. –

+0

Sería genial si se puede poner el código con estas ideas. –

6

Esto era muy simple ahora que me doy cuenta de cómo hacerlo, gracias a todas las respuestas por llevarme a la solución. Tuve que abandonar $ .getScript() para especificar el origen del script ... a veces hacer las cosas manualmente es lo mejor.

Solución

//great suggestion @Jasper 
var len = $('script[src*="Javascript/MyScript.js"]').length; 

if (len === 0) { 
     alert('script not loaded'); 

     loadScript('Javascript/MyScript.js'); 

     if ($('script[src*="Javascript/MyScript.js"]').length === 0) { 
      alert('still not loaded'); 
     } 
     else { 
      alert('loaded now'); 
     } 
    } 
    else { 
     alert('script loaded'); 
    } 


function loadScript(scriptLocationAndName) { 
    var head = document.getElementsByTagName('head')[0]; 
    var script = document.createElement('script'); 
    script.type = 'text/javascript'; 
    script.src = scriptLocationAndName; 
    head.appendChild(script); 
} 
2

Otra forma de comprobar un script externo se carga o no, puede utilizar los datos función de jQuery y almacenar un indicador de validación. Ejemplo como:

if(!$("body").data("google-map")) 
    { 
     console.log("no js"); 

     $.getScript("https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&callback=initilize",function(){ 
      $("body").data("google-map",true); 

      },function(){ 
       alert("error while loading script"); 
      }); 
     } 
    } 
    else 
    { 
     console.log("js already loaded"); 
    } 
+1

Funciona bien para lo que necesitaba hacer. Gracias –

1

La fusión de varias respuestas desde arriba en un formato fácil de usar función

function GetScriptIfNotLoaded(scriptLocationAndName) 
{ 
    var len = $('script[src*="' + scriptLocationAndName +'"]').length; 

    //script already loaded! 
    if (len > 0) 
     return; 

    var head = document.getElementsByTagName('head')[0]; 
    var script = document.createElement('script'); 
    script.type = 'text/javascript'; 
    script.src = scriptLocationAndName; 
    head.appendChild(script); 
} 
Cuestiones relacionadas