Skip to content

Commit f3c776d

Browse files
markelogdmethvin
authored andcommitted
Fix #13356. Clean up after load/ready handlers. Close jquerygh-1152.
1 parent 8226666 commit f3c776d

File tree

1 file changed

+24
-13
lines changed

1 file changed

+24
-13
lines changed

src/core.js

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -74,17 +74,25 @@ var
7474
return letter.toUpperCase();
7575
},
7676

77-
// The ready event handler and self cleanup method
78-
DOMContentLoaded = function() {
79-
if ( document.addEventListener ) {
80-
document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
81-
jQuery.ready();
82-
} else if ( document.readyState === "complete" ) {
83-
// we're here because readyState === "complete" in oldIE
84-
// which is good enough for us to call the dom ready!
85-
document.detachEvent( "onreadystatechange", DOMContentLoaded );
77+
// The ready event handler
78+
completed = function( event ) {
79+
80+
// readyState === "complete" is good enough for us to call the dom ready in oldIE
81+
if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
82+
detach();
8683
jQuery.ready();
8784
}
85+
},
86+
// Clean-up method for dom ready events
87+
detach = function() {
88+
if ( document.addEventListener ) {
89+
document.removeEventListener( "DOMContentLoaded", completed, false );
90+
window.removeEventListener( "load", completed, false );
91+
92+
} else {
93+
document.detachEvent( "onreadystatechange", completed );
94+
window.detachEvent( "onload", completed );
95+
}
8896
};
8997

9098
jQuery.fn = jQuery.prototype = {
@@ -869,18 +877,18 @@ jQuery.ready.promise = function( obj ) {
869877
// Standards-based browsers support DOMContentLoaded
870878
} else if ( document.addEventListener ) {
871879
// Use the handy event callback
872-
document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
880+
document.addEventListener( "DOMContentLoaded", completed, false );
873881

874882
// A fallback to window.onload, that will always work
875-
window.addEventListener( "load", jQuery.ready, false );
883+
window.addEventListener( "load", completed, false );
876884

877885
// If IE event model is used
878886
} else {
879887
// Ensure firing before onload, maybe late but safe also for iframes
880-
document.attachEvent( "onreadystatechange", DOMContentLoaded );
888+
document.attachEvent( "onreadystatechange", completed );
881889

882890
// A fallback to window.onload, that will always work
883-
window.attachEvent( "onload", jQuery.ready );
891+
window.attachEvent( "onload", completed );
884892

885893
// If IE and not a frame
886894
// continually check to see if the document is ready
@@ -902,6 +910,9 @@ jQuery.ready.promise = function( obj ) {
902910
return setTimeout( doScrollCheck, 50 );
903911
}
904912

913+
// detach all dom ready events
914+
detach();
915+
905916
// and execute any waiting functions
906917
jQuery.ready();
907918
}

0 commit comments

Comments
 (0)