2010-12-26 16 views
2

Ich habe diesen Code in ein Skript im Körper geladen.IE manchmal nicht onload feuern!

(function() { 
attach = function() { 
     blablablablbalabl; 
}; 

if (window.addEventListener){ 
    window.addEventListener('load', attach, false); 
} else if (window.attachEvent){  
    window.attachEvent('onload', attach); 
} 
})(); 

Problem ist, manchmal (4 von 5 Versuchen) Ich bin erfrischend IE, wird es nicht anhängen()! während in anderen Browsern es 100% der Zeiten anruft!

Ich werde verrückt!

Dank

+0

Sind Sie 100% sicher, dass dies der attachEvent-Teil ist und nicht das, was Sie in 'attach()' tun? –

+0

ja. Ich stelle Alarm innerhalb von Attach, um zu sehen, dass es heißt. aber es ist nicht! – Himberjack

+0

Was ruft Ihre Funktion auf, (function())() wird nicht selbst ausgeführt. –

Antwort

1

jQuery verwendet ein paar Tricks zu lösen dieses Problem.

Es verbindet sich mit sowie onload.

// If IE event model is used 
    } else if (document.attachEvent) { 
     // ensure firing before onload, 
     // maybe late but safe also for iframes 
     document.attachEvent("onreadystatechange", DOMContentLoaded); 

     // A fallback to window.onload, that will always work 
     window.attachEvent("onload", jQuery.ready); 

     // If IE and not a frame 
     // continually check to see if the document is ready 
     var toplevel = false; 

     try { 
      toplevel = window.frameElement == null; 
     } catch(e) {} 

     if (document.documentElement.doScroll && toplevel) { 
      doScrollCheck(); 
     } 
    } 

Darüber hinaus überprüft es kontinuierlich, ob die Seite gescrollt werden kann. Sobald das DOM geladen ist, wird die Seite scrollbar, so dass jQuery.ready ausgelöst wird.

// The DOM ready check for Internet Explorer 
function doScrollCheck() { 
    if (jQuery.isReady) { 
     return; 
    } 

    try { 
     // If IE is used, use the trick by Diego Perini 
     // http://javascript.nwbox.com/IEContentLoaded/ 
     document.documentElement.doScroll("left"); 
    } catch(e) { 
     setTimeout(doScrollCheck, 1); 
     return; 
    } 

    // and execute any waiting functions 
    jQuery.ready(); 
} 

Sie könnten versuchen, dieses Verhalten in Ihrer App zu implementieren oder jQuery direkt zu verwenden.

+1

Ich würde für die Verwendung von jQuery direkt wählen, wenn Sie alle diese Sachen selbst reinimplementieren, fragt nur nach Ärger. –

+0

Ja, das gleiche hier. –

+0

Internet Explorer Himmel ... Können wir nicht aufhören, es zu benutzen? –

0

Wird diese Arbeit?

+0

isnt window.onload nicht sehr gut in IE? – Himberjack

+0

Ich bin mir nicht sicher. Ich habe dieses Problem ein paar Mal beim Einstellen von Onload sogar für Bildobjekt konfrontiert. Das Onload-Ereignis wird nicht ausgelöst, wenn das Image aus dem Cache geladen wird. –

0

Ich habe in letzter Zeit etwas Ähnliches erlebt, bei dem ein externes Skript, das einen Listener für das load -Ereignis einrichtet, nicht im IE ausgelöst wird.

Ich bemerkte, dass wenn ich das Skript in den Dokumentkörper inline, dann würde es zuverlässig feuern. Führe mich zu der Annahme, dass es sich um eine Race-Bedingung handelt, bei der das Onload-Ereignis ausgelöst wird, bevor das externe Skript vollständig analysiert wurde.

Andere Dinge zu prüfen ist, ob es ein anderes Skript ist die Ereignispropagierung Cancelling und ob Ihre Callback-Funktion eine Ausnahme in IE wirft, wie fälschlicherweise angenommen, was diese "Punkt