2010-11-11 2 views
6

Voglio rilevare se un tag di script (creato e aggiunto dinamicamente al DOM) non viene caricato. L'evento onerror funziona, tranne con file: // URL in Firefox.Come rilevare un caricamento di script di un file: // URL non riesce in Firefox?

Sfortunatamente nessuna delle tecniche described here (eccetto i timeout, che sono inaccettabili nel mio caso) sembra funzionare in Firefox se l'src del tag script è un file: // URL (o relativo URL e la pagina è stata caricata tramite un file: // URL)

test case:

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); 

caricare questo in una pagina HTML con un file: // URL. L'evento onerror non verrà eseguito in Firefox. Carica da un server web, o su Safari o Chrome, e lo farà.

Questo mi sembra un insetto. C'è un modo noto intorno ad esso?

+7

Dovresti accettare le risposte alle tue domande. – SLaks

+0

@Marcel Korpel: Ha detto che i timeout non sono un'opzione, quindi non funzionerà. – PleaseStand

+2

Per riferimento, il problema con Firefox che non genera un evento 'error' quando un URL' file: // 'non riesce a caricare è [Bugzilla bug 621276] (http://bugzilla.mozilla.org/show_bug.cgi? id = 621.276). –

risposta

1

Cosa succede se si utilizza la soluzione Pauls per recuperare il documento ma ignorato il risultato. Se carica, crea il tuo tag script. Lo svantaggio è che il file si caricherà due volte.

+0

Sì, questa è la soluzione con cui sono andato per ora, ma non ne sono felice;) – 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!'); }); 

Bit di un hack, ma sembra funzionare.

+0

Come Tom sottolinea, uno svantaggio di questo metodo è che si perdono i metadati di debug per lo script se vengono caricati tramite XHR. –

Problemi correlati