2012-05-30 42 views
8

Actualmente me encontré con un problema donde un javascript con carga lenta se ejecutaría dos veces con Internet Explorer, y SOLO con Internet Explorer (actualmente versión 9). Firefox y Chrome funcionan. Aquí está mi código:Javascript se ejecuta dos veces en 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(); 
} 

ya he encontrado this posting y cambiado de código de acuerdo con él, pero todavía es decir, está ejecutando mi guión dos veces. Ustedes tienen alguna idea?

Editar: Esta es mi solución

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

Como alternativa, es posible que le guste el cargador de [head.js] (http://headjs.com/) JS. –

+0

Esto no es una solución porque no quiero cargar más scripts de los necesarios. – mayrs

Respuesta

2

probar este

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

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

el que para usted sería ...

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

No funcionó, sigue ejecutándose dos veces cuando uso su solución. – mayrs

+0

¿Puedes actualizar tu pregunta con la secuencia de comandos que se está ejecutando? No puedo replicar (en ie8, actualmente instalando ie9 en mi vm) el problema con cualquier conjunto de código. http://jsfiddle.net/3n1gm4/V9nMk/9/ –

+1

¡Está bien después de haber cambiado algunos diferidos en el código, realmente funcionó! Creo que hubo un error en el diferido en vez de la función de inyección. Aceptó tu respuesta. ¡Gracias por tu ayuda! – mayrs

Cuestiones relacionadas