2011-01-30 8 views
45

Sto usando this function per collegare il gestore di onload a un tag script, sembra essere il modo consigliato su Internet.
Tuttavia, non funziona in Internet Explorer, se la pagina è già stata caricata (testata cioè 8). Puoi vedere che funziona nei normali browser (avvisa quando viene caricato lo script).'onload' handler per tag 'script' in internet explorer

Mi manca qualcosa?
Grazie

+2

onload non è supportato in IE8 e al di sotto. Funziona in modalità standard IE9. – EricLaw

+1

@EricLaw Non sono sicuro di cosa intendi, window.attachEvent ('onload', fn); ha funzionato per me finora (IE 8). Viene anche menzionato su [MSDN] (http://msdn.microsoft.com/en-us/library/cc197055 (v = vs.85) .aspx) –

+1

@NikitaRybak Sto anche cercando di implementare un modo per caricare jquery in uno script (se non già caricato) e quindi chiama una funzione quando viene caricata. Non c'è "onload" per gli script, ad esempio, sfortunatamente. Hai trovato un modo per farlo? – Etherealone

risposta

83

Si consiglia di chiamare jQuery.getScript, che fa esattamente quello che stai cercando.

EDIT: Ecco il codice sorgente di rilevante dal 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

Non funzionerà davvero, perché jquery non è inizialmente disponibile: devo caricarlo in questo modo. Ma controllerò le fonti e vedrò se funziona in IE. +1 per l'interessante riferimento, grazie! –

+1

Una bella risposta, grazie, non devi usare jQuery per imparare da questo approccio perfettamente valido, e poi scrivere qualcosa di simile. :) –

+1

Penso che "jQuery.handleSuccess (s, xhr, status, data); jQuery.handleComplete (s, xhr, status, data);" probabilmente non è neccesary, e causerà bug se questo viene usato letteralmente –

10

Ho anche avuto problemi con script.onload = runFunction; in IE8.

Ho provato jQuery.getScript e ha funzionato perfettamente per le mie esigenze. L'unico lato negativo è dover aspettare il caricamento di jQuery prima di aggiungere lo script.

Tuttavia, dal momento che le mie funzioni di callback utilizzano jQuery in modo molto pesante, tuttavia, ritengo che questo sia un aspetto estremamente accettabile e molto minore in quanto crea una soluzione cross-browser di facile utilizzo.

Aggiornamento:

Ecco un modo per farlo senza l'utilizzo di jQuery:

(una soluzione modificata da: 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

Sembra che jQuery riesca a risolverlo senza eseguire il polling. Prova onreadystatechange invece di impostare il timeout – Dan