2012-05-30 16 views
8

Attualmente mi sono imbattuto in un problema in cui un javascript pigro veniva eseguito due volte utilizzando Internet Explorer - e SOLO Internet Explorer (attualmente versione 9). Firefox e Chrome funzionano. Qui è il mio codice:Javascript esegue due volte in Internet Explorer

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

ho già trovato this posting e ha cambiato il mio codice in base ad esso, ma ancora è cioè l'esecuzione di mio script due volte. Ragazzi avete qualche idea?

Edit: Questa è la mia soluzione

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

In alternativa potresti apprezzare il caricatore JS [head.js] (http://headjs.com/). –

+0

Questa non è una soluzione perché non voglio caricare più script del necessario. – mayrs

risposta

2

Prova questa

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

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

che per voi sarebbe ...

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

Non ha funzionato, è ancora in esecuzione due volte quando utilizzo la soluzione. – mayrs

+0

Puoi aggiornare la tua domanda con lo script che si sta eseguendo? Non riesco a replicare (in ie8, attualmente installando ie9 sul mio VM) il problema con entrambi i set di codice. http://jsfiddle.net/3n1gm4/V9nMk/9/ –

+1

Okay dopo che ho cambiato alcuni differiti nel codice che ha effettivamente funzionato! Penso che ci fosse un bug nella stessa differita piuttosto che nella funzione di iniezione. Accettata la tua risposta Grazie per l'aiuto! – mayrs

Problemi correlati