2010-11-11 4 views
6

Ich möchte feststellen, ob ein Skript-Tag (das dynamisch erstellt und dem DOM hinzugefügt wurde) nicht geladen werden kann. Das onerror-Ereignis funktioniert, außer mit file: // URLs in Firefox.Wie erkennt man das Laden einer Datei in eine Datei: // URL schlägt in Firefox fehl?

Leider scheint keine der Techniken described here (außer Timeouts, die in meinem Fall inakzeptabel sind) in Firefox zu funktionieren, wenn der src des Script-Tags eine Datei: // URL (oder relative URL und die Seite wurde geladen über eine file: // URL)

Testfall:

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

laden diese in einer HTML-Seite mit einer file: // URL. Das Onerror-Ereignis wird in Firefox nicht ausgeführt. Laden von einem Webserver oder Safari oder Chrome, und es wird.

Das scheint wie ein Fehler für mich. Gibt es einen bekannten Weg?

+7

Sie sollten Antworten auf Ihre Fragen akzeptieren. – SLaks

+0

@Marcel Korpel: Er sagte, dass Timeouts keine Option sind, also wird das nicht funktionieren. – PleaseStand

+2

Als Hinweis, das Problem mit Firefox nicht ein "Fehler" -Ereignis feuern, wenn eine 'file: //' -basierte URL nicht geladen wird, ist [Bugzilla Bug 621276] (http://bugzilla.mozilla.org/show_bug.cgi? id = 621276). –

Antwort

1

Was wäre, wenn Sie Pauls Lösung verwendet, um das Dokument abzurufen, aber das Ergebnis ignoriert. Wenn es geladen wird, erstellen Sie Ihr Skript-Tag. Der Nachteil ist, dass die Datei zweimal geladen wird.

+0

Ja, das ist die Lösung, mit der ich jetzt gegangen bin, aber ich bin nicht glücklich darüber;) – 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 eines Hacks, aber es scheint zu funktionieren.

+0

Wie Tom hervorhebt, besteht ein Nachteil dieser Methode darin, dass Sie Debugging-Metadaten für das Skript verlieren, wenn es über XHR geladen wird. –

Verwandte Themen