aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Methvin <dave.methvin@gmail.com>2011-02-02 21:57:44 -0500
committerDave Methvin <dave.methvin@gmail.com>2011-04-07 11:26:42 -0400
commit14193e449efe76105df61d745ebd7031dd7fe783 (patch)
tree7e815de898328446c0e2c1bcf99840d36de1da9e
parentbbd9c776ea22296a6807d5b760bd4e82ee5f4414 (diff)
downloadjquery-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.js18
-rw-r--r--test/data/readywaitloader.js6
-rw-r--r--test/readywait.html18
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>