2011-01-30 19 views
45

Używałem this function do dołączania modułu obsługi zdarzenia do znacznika skryptu, wydaje się, że jest to zalecany sposób przez Internet.
Jednak nie działa w przeglądarce Internet Explorer, jeśli strona jest już załadowana (testowane w 8). Możesz zobaczyć, że działa w zwykłych przeglądarkach (alarmy ostrzegają o załadowaniu skryptu).Funkcja "onload" dla znacznika "skryptu" w eksploratorze internetowym

Czy brakuje mi czegoś?
Dziękujemy

+2

onload nie jest obsługiwana w IE8 i niżej. Działa w trybie standardów IE9. – EricLaw

+1

@EricLaw Nie jestem pewien, co masz na myśli, window.attachEvent ("onload", fn); do tej pory pracował dla mnie (IE 8). Jest również wspomniany w [MSDN] (http://msdn.microsoft.com/en-us/library/cc197055 (v = vs.85) .aspx) –

+1

@NikitaRybak Próbuję również zaimplementować sposób ładowania jquery w skrypt (jeśli jeszcze nie został załadowany), a następnie wywołaj funkcję, gdy jest załadowana. Nie ma "onload" dla skryptów w niestety. Czy znalazłeś sposób, aby to zrobić? – Etherealone

Odpowiedz

83

Należy zadzwonić pod numer jQuery.getScript, który spełnia dokładnie to, czego szukasz.

EDIT: Oto odpowiedni kod źródłowy z 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

Naprawdę nie zadziała, ponieważ jquery nie jest dostępny początkowo: muszę załadować go w ten sposób. Ale sprawdzę źródła i sprawdzę, czy działa w IE. +1 za ciekawe referencje, dzięki! –

+1

Świetna odpowiedź, dzięki człowieku, nie musisz używać jQuery, aby uczyć się z tego całkowicie poprawnego podejścia, a następnie napisać coś podobnego. :) –

+1

Myślę, że "jQuery.handleSuccess (s, xhr, status, dane); jQuery.handleComplete (s, xhr, status, dane);" prawdopodobnie nie jest konieczne, i spowoduje błędy, jeśli jest używany verbatim –

10

Miałem również problemy z script.onload = runFunction; w IE8.

Próbowałem jQuery.getScript i działało idealnie dla moich potrzeb. Jedynym minusem jest oczekiwanie na załadowanie jQuery przed dodaniem skryptu.

Jednakże, ponieważ moje funkcje wywołania zwrotnego wykorzystują jQuery bardzo mocno, i tak uważam to za bardzo akceptowalną i bardzo niewielką wadę, ponieważ tworzy bardzo łatwe w użyciu, wieloprzeglądowe rozwiązanie.

Aktualizacja:

Oto sposób to zrobić bez użycia jQuery:

(modyfikowany roztwór z: 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

Wygląda na to, że jQuery udaje się go przetworzyć bez odpytywania. Wypróbuj onreadystatechange zamiast ustawiania limitu czasu – Dan

Powiązane problemy