2012-05-30 10 views
8

Ich lief derzeit in ein Problem, wo ein faul geladenes Javascript würde zweimal mit Internet Explorer ausführen - und nur Internet Explorer (derzeit Version 9). Firefox und Chrome funktioniert. Hier ist mein Code:Javascript wird zweimal im Internet Explorer ausgeführt

injectExternalJavaScript: function(fileUrl) { 
    return jQuery.Deferred(function(deferred) { 
     var script = document.createElement('script'); 
     script['src'] = fileUrl; 
     script['type'] = 'text/javascript'; 
     var head = document.getElementsByTagName("head")[0]; 
     var done = false; 
     // Attach handlers for all browsers 
     script['onload'] = script['onreadystatechange'] = function() { 
      if (!done && (!this.readyState || this.readyState === "loaded" || this.readyState === 'complete')) { 
       done = true; 
       script['onload'] = script['onreadystatechange'] = null; 
       head.removeChild(script); 
       deferred.resolve(); 
      } 
     }; 
     head.appendChild(script); 
    }).promise(); 
} 

Ich fand schon this posting und änderte mein Code nach es aber nach wie vor also ist mein Skript zweimal ausführen. Habt ihr irgendwelche Ideen?

Edit: Das ist meine Lösung

injectExternalJavaScript: function(fileUrl) { 
    return jQuery.Deferred(function(deferred) { 
     var script = document.createElement('script'); 
     script['src'] = fileUrl; 
     script['type'] = 'text/javascript'; 
     var head = document.getElementsByTagName("head")[0]; 
     var done = false; 
     // Attach handlers for all browsers 
     var cb = function() { 
      if (!done && (!this.readyState || this.readyState === "loaded" || this.readyState === 'complete')) { 
       done = true; 
       script['onload'] = script['onreadystatechange'] = null; 
       head.removeChild(script); 
       deferred.resolve(); 
      } 
     } 
     if (script.addEventListener) { 
      script.addEventListener('load', cb, false); 
     } else { 
      script['onreadystatechange'] = cb; 
     } 
     head.appendChild(script); 
    }).promise(); 
} 
+0

Als Alternative können Sie den [head.js] (http://headjs.com/) JS Loader mögen. –

+0

Das ist keine Lösung, weil ich nicht mehr Skripte laden will als nötig. – mayrs

Antwort

2

dies von http://msdn.microsoft.com/en-us/library/ie/hh180173(v=vs.85).aspx

s = document.createElement("script"); 
s.src="myscript.js"; 
if(s.addEventListener) { 
    s.addEventListener("load",callback,false); 
}else if(s.readyState) { 
    s.onreadystatechange = callback; 
} 
document.body.appendChild(s); 
function callback() { console.log("loaded"); } 

genommen Versuchen Sie, die für Sie wäre ...

injectExternalJavaScript: function(fileUrl) { 
    return jQuery.Deferred(function(deferred) { 
     var script = document.createElement('script'); 
     script['src'] = fileUrl; 
     script['type'] = 'text/javascript'; 
     var head = document.getElementsByTagName("head")[0]; 
     var done = false; 
     // Attach handlers for all browsers 
     var cb = function() { 
      if (!done && (!this.readyState || this.readyState === "loaded" || this.readyState === 'complete')) { 
       done = true; 
       script['onload'] = script['onreadystatechange'] = null; 
       head.removeChild(script); 
       deferred.resolve(); 
      } 
     }; 
     if (script.addEventListener) { 
      script.addEventListener('load',cb, false); 
     } else { 
      script.onreadystatechange = cb; 
     } 
     head.appendChild(script); 
    }).promise(); 
} 
+0

Hat nicht funktioniert, immer noch zweimal ausgeführt, wenn ich Ihre Lösung verwende. – mayrs

+0

Können Sie Ihre Frage mit dem ausgeführten Skript aktualisieren? Ich kann das Problem mit beiden Codearten nicht replizieren (in ie8, derzeit installiere ich ie9 auf meinem vm). http://jsfiddle.net/3n1gm4/V9nMk/9/ –

+1

Okay, nachdem ich einige defered in den Code geändert hat, hat es tatsächlich funktioniert! Ich denke, es gab einen Fehler in der verzögerten selbst statt der Injektionsfunktion. Akzeptierte deine Antwort. Danke für Ihre Hilfe! – mayrs