2010-11-11 9 views
6

Quiero detectar si una etiqueta de script (que se creó dinámicamente y se agregó al DOM) no se carga. El evento onerror funciona, excepto con file: // URLs en Firefox.Cómo detectar una carga de scripts de un archivo: // ¿La URL falla en Firefox?

Desafortunadamente ninguna de las técnicas described here (excepto los tiempos de espera, que son inaceptables en mi caso) parecen funcionar en Firefox si el src de la etiqueta del script es un archivo: // URL (o URL relativa y la página se cargó una URL file: //)

caso de prueba:

var script = document.createElement('script'); 
script.setAttribute('type', 'text/javascript'); 
script.setAttribute('src', 'doesnotexist.js'); 
script.onerror = function() { alert("Loading failed!"); } 
document.getElementsByTagName('head')[0].appendChild(script); 

carga esto en una página HTML con una URL file: //. El evento onerror no se ejecutará en Firefox. Cargar desde un servidor web, o en Safari o Chrome, y lo hará.

Esto me parece un error. ¿Hay alguna forma conocida de rodearlo?

+7

Debe aceptar respuestas a sus preguntas. – SLaks

+0

@Marcel Korpel: Dijo que los tiempos de espera no son una opción, así que eso no funcionará. – PleaseStand

+2

Como referencia, el problema con Firefox que no activa un evento 'error' cuando una URL' file: // 'no se carga es [bugzilla bug 621276] (http://bugzilla.mozilla.org/show_bug.cgi? id = 621276). –

Respuesta

1

¿Qué pasa si usó la solución de Pauls para recuperar el documento pero ignoró el resultado? Si se carga, crea tu etiqueta de script. La desventaja es que el archivo se cargará dos veces.

+0

Sí, esta es la solución que usé por ahora, pero no estoy contento con eso;) – tlrobinson

2
var loadScript = function(scriptURL, failureCallback) { 
    var script = document.createElement('script'), 
     scriptProtocol = scriptURL.match(/^([a-zA-Z]+:)\/\//); 
    script.setAttribute('type', 'text/javascript'); 

    if (navigator.product === 'Gecko' && 
     navigator.userAgent.indexOf('KHTML') === -1 && 
     window.location.protocol === 'file:' && 
     (!scriptProtocol || scriptProtocol[1] === 'file:')) { 

     var req = new XMLHttpRequest(); 
     req.open('GET', scriptURL, true); 
     req.onreadystatechange = function() { 
      if (req.readyState === 4) { 
       if (req.status === 0) 
        script.textContent = req.responseText; 
       else 
        failureCallback(); 
      } 
     }; 
     try { 
      req.send(null); 
     } 
     catch (e) { 
      failureCallback(); 
     } 
    } 
    else { 
     script.setAttribute('src', scriptURL); 
     script.onerror = failureCallback; 
    } 

    document.getElementsByTagName('head')[0].appendChild(script); 
}; 

loadScript('doesnotexist.js', function() { alert('Loading failed!'); }); 

Es un truco, pero parece que funciona.

+0

Como señala Tom, una desventaja de este método es que se pierden los metadatos de depuración para el script si se carga a través de XHR. –

Cuestiones relacionadas