2011-01-30 11 views
45

He estado usando this function para adjuntar el controlador onload a una etiqueta de script, parece ser la forma recomendada en internet.
Sin embargo, no funciona en Internet Explorer, si la página ya está cargada (probada en ie 8). Puede ver que funciona en navegadores normales (alerta de incendios cuando se carga el script).controlador 'onload' para la etiqueta 'script' en Internet Explorer

¿Echo de menos algo?
Gracias

+2

proceso de carga no es compatible con Internet Explorer 8 y por debajo. Funciona en el modo de estándares IE9. – EricLaw

+1

@EricLaw No estoy seguro de lo que quiere decir, window.attachEvent ('onload', fn); me ha funcionado hasta ahora (IE 8). También se menciona en [MSDN] (http://msdn.microsoft.com/en-us/library/cc197055 (v = vs.85) .aspx) –

+1

@NikitaRybak También estoy tratando de implementar una forma de cargar jquery en un script (si aún no está cargado) y luego llama a una función cuando se carga. No hay 'onload' para los scripts, es decir, desafortunadamente. ¿Has encontrado una manera de hacer eso? – Etherealone

Respuesta

83

Debe llamar al jQuery.getScript, que hace exactamente lo que está buscando.

EDITAR: Aquí está el código fuente relevante de jQuery:

var head = document.getElementsByTagName("head")[0] || document.documentElement; 
var script = document.createElement("script"); 
if (s.scriptCharset) { 
    script.charset = s.scriptCharset; 
} 
script.src = s.url; 

// Handle Script loading 
    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; 
     jQuery.handleSuccess(s, xhr, status, data); 
     jQuery.handleComplete(s, xhr, status, data); 

     // Handle memory leak in IE 
     script.onload = script.onreadystatechange = null; 
     if (head && script.parentNode) { 
      head.removeChild(script); 
     } 
    } 
}; 

// Use insertBefore instead of appendChild to circumvent an IE6 bug. 
// This arises when a base node is used (#2709 and #4378). 
head.insertBefore(script, head.firstChild); 
+4

Realmente no va a funcionar, porque jquery no está disponible inicialmente: tengo que cargarlo así. Pero verifico las fuentes y veo si funciona en IE. +1 para la referencia interesante, gracias! –

+1

Una gran respuesta, gracias hombre, no tiene que usar jQuery para aprender de este enfoque perfectamente válido, y luego escriba algo similar. :) –

+1

Creo que "jQuery.handleSuccess (s, xhr, status, data); jQuery.handleComplete (s, xhr, status, data);" probablemente no sea necesario, y causará errores si se usa literalmente –

10

También tuve problemas con script.onload = runFunction; en IE8.

Intenté jQuery.getScript y funcionó perfectamente para mis necesidades. El único inconveniente es tener que esperar a que se cargue jQuery antes de agregar el script.

Sin embargo, dado que mis funciones de devolución de llamada utilizan jQuery en gran medida de todos modos, considero que esto es una desventaja extremadamente aceptable y muy leve ya que crea una solución de navegador cruzada muy fácil de usar.

Actualización:

Esta es una manera de hacerlo sin utilizar jQuery:

(una solución modificada de: https://stackoverflow.com/a/13031185/1339954)

var url = 'http://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js'; 
var headID = document.getElementsByTagName("head")[0]; 
var script = document.createElement('script'); 
script.type='text/javascript'; 
script.src=url; 

//for nonIE browsers 
script.onload=function(){ 
     addVideo(); 
    } 

//for IE Browsers 
ieLoadBugFix(script, function(){ 
    addVideo();} 
); 

function ieLoadBugFix(scriptElement, callback){ 
     if (scriptElement.readyState=='loaded' || scriptElement.readyState=='completed') { 
      callback(); 
     }else { 
      setTimeout(function() {ieLoadBugFix(scriptElement, callback); }, 100); 
     } 


} 

headID.appendChild(script); 
+2

Parece que jQuery logra resolverlo sin sondeo. Pruebe onreadystatechange en lugar de establecer el tiempo de espera – Dan

Cuestiones relacionadas