diff options
author | Dave Methvin <dave.methvin@gmail.com> | 2011-02-02 21:57:44 -0500 |
---|---|---|
committer | Dave Methvin <dave.methvin@gmail.com> | 2011-04-07 11:26:42 -0400 |
commit | 14193e449efe76105df61d745ebd7031dd7fe783 (patch) | |
tree | 7e815de898328446c0e2c1bcf99840d36de1da9e | |
parent | bbd9c776ea22296a6807d5b760bd4e82ee5f4414 (diff) | |
download | jquery-14193e449efe76105df61d745ebd7031dd7fe783.tar.gz jquery-14193e449efe76105df61d745ebd7031dd7fe783.zip |
Create jQuery.holdReady(true/false) method to encapsulate jQuery.readyWait++ / jQuery.ready(true) logic. Fix problem where jQuery.ready may trigger twice, causing the (unsupported) document.onready to run twice. Fixes #8803 .
-rw-r--r-- | src/core.js | 18 | ||||
-rw-r--r-- | test/data/readywaitloader.js | 6 | ||||
-rw-r--r-- | test/readywait.html | 18 |
3 files changed, 24 insertions, 18 deletions
diff --git a/src/core.js b/src/core.js index a893fc9b3..b81fa7644 100644 --- a/src/core.js +++ b/src/core.js @@ -374,15 +374,19 @@ jQuery.extend({ // the ready event fires. See #6781 readyWait: 1, - // Handle when the DOM is ready - ready: function( wait ) { - // A third-party is pushing the ready event forwards - if ( wait === true ) { - jQuery.readyWait--; + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); } + }, - // Make sure that the DOM is not already loaded - if ( !jQuery.readyWait || (wait !== true && !jQuery.isReady) ) { + // Handle when the DOM is ready + ready: function( wait ) { + // Either a released hold or an DOMready/load event and not yet ready + if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). if ( !document.body ) { return setTimeout( jQuery.ready, 1 ); diff --git a/test/data/readywaitloader.js b/test/data/readywaitloader.js index 483e07c4d..e07dac7a9 100644 --- a/test/data/readywaitloader.js +++ b/test/data/readywaitloader.js @@ -1,14 +1,14 @@ -// Simple script loader that uses jQuery.readyWait +// Simple script loader that uses jQuery.readyWait via jQuery.holdReady() //Hold on jQuery! -jQuery.readyWait++; +jQuery.holdReady(true); var readyRegExp = /^(complete|loaded)$/; function assetLoaded( evt ){ var node = evt.currentTarget || evt.srcElement; if ( evt.type === "load" || readyRegExp.test(node.readyState) ) { - jQuery.ready(true); + jQuery.holdReady(false); } } diff --git a/test/readywait.html b/test/readywait.html index 4f124767a..b4d8111eb 100644 --- a/test/readywait.html +++ b/test/readywait.html @@ -1,13 +1,13 @@ <!DOCTYPE html> <html> <!-- - Test for jQuery.readyWait. Needs to be a + Test for jQuery.holdReady. Needs to be a standalone test since it deals with DOM ready. --> <head> <title> - jQuery.readyWait Test + jQuery.holdReady Test </title> <style> div { margin-top: 10px; } @@ -52,15 +52,17 @@ </head> <body> <h1> - jQuery.readyWait Test + jQuery.holdReady Test </h1> <p> - This is a test page for jQuery.readyWait, that was - added due to this ticket - <a href="http://bugs.jquery.com/ticket/6781">#6781</a>. + This is a test page for jQuery.readyWait and jQuery.holdReady, + see + <a href="http://bugs.jquery.com/ticket/6781">#6781</a> + and + <a href="http://bugs.jquery.com/ticket/8803">#8803</a>. </p> <p> - Test for jQuery.readyWait, which can be used + Test for jQuery.holdReady, which can be used by plugins and other scripts to indicate something important to the page is still loading and needs to block the DOM ready callbacks that are registered @@ -68,7 +70,7 @@ </p> <p> Script loaders are the most likely kind of script - to use jQuery.readyWait, but it could be used by + to use jQuery.holdReady, but it could be used by other things like a script that loads a CSS file and wants to pause the DOM ready callbacks. </p> |