mirror of
https://github.com/jquery/jquery.git
synced 2024-11-23 02:54:22 +00:00
Transform $.bindReady into $.ready.promise. It is now possible to use $.ready.promise or $.when( $.ready ) to get the ready promise. Costs *1* byte min/gzipped. Unit test added.
This commit is contained in:
parent
714b8ffd2b
commit
e3cf0e220c
96
src/core.js
96
src/core.js
@ -251,11 +251,8 @@ jQuery.fn = jQuery.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
ready: function( fn ) {
|
ready: function( fn ) {
|
||||||
// Attach the listeners
|
|
||||||
jQuery.bindReady();
|
|
||||||
|
|
||||||
// Add the callback
|
// Add the callback
|
||||||
readyList.add( fn );
|
jQuery.ready.promise().done( fn );
|
||||||
|
|
||||||
return this;
|
return this;
|
||||||
},
|
},
|
||||||
@ -412,7 +409,7 @@ jQuery.extend({
|
|||||||
}
|
}
|
||||||
|
|
||||||
// If there are functions bound, to execute
|
// If there are functions bound, to execute
|
||||||
readyList.fireWith( document, [ jQuery ] );
|
readyList.resolveWith( document, [ jQuery ] );
|
||||||
|
|
||||||
// Trigger any bound ready events
|
// Trigger any bound ready events
|
||||||
if ( jQuery.fn.trigger ) {
|
if ( jQuery.fn.trigger ) {
|
||||||
@ -421,51 +418,6 @@ jQuery.extend({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
bindReady: function() {
|
|
||||||
if ( readyList ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
readyList = jQuery.Callbacks( "once memory" );
|
|
||||||
|
|
||||||
// Catch cases where $(document).ready() is called after the
|
|
||||||
// browser event has already occurred.
|
|
||||||
if ( document.readyState !== "loading" ) {
|
|
||||||
// Handle it asynchronously to allow scripts the opportunity to delay ready
|
|
||||||
return setTimeout( jQuery.ready, 1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mozilla, Opera and webkit nightlies currently support this event
|
|
||||||
if ( document.addEventListener ) {
|
|
||||||
// Use the handy event callback
|
|
||||||
document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
|
|
||||||
|
|
||||||
// A fallback to window.onload, that will always work
|
|
||||||
window.addEventListener( "load", jQuery.ready, false );
|
|
||||||
|
|
||||||
// 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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// See test/unit/core.js for details concerning isFunction.
|
// See test/unit/core.js for details concerning isFunction.
|
||||||
// Since version 1.3, DOM methods and functions like alert
|
// Since version 1.3, DOM methods and functions like alert
|
||||||
// aren't supported. They return false on IE (#2968).
|
// aren't supported. They return false on IE (#2968).
|
||||||
@ -897,6 +849,50 @@ jQuery.extend({
|
|||||||
browser: {}
|
browser: {}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
jQuery.ready.promise = function( object ) {
|
||||||
|
if ( !readyList ) {
|
||||||
|
|
||||||
|
readyList = jQuery.Deferred();
|
||||||
|
|
||||||
|
// Catch cases where $(document).ready() is called after the
|
||||||
|
// browser event has already occurred.
|
||||||
|
if ( document.readyState !== "loading" ) {
|
||||||
|
// Handle it asynchronously to allow scripts the opportunity to delay ready
|
||||||
|
setTimeout( jQuery.ready, 1 );
|
||||||
|
|
||||||
|
// Mozilla, Opera and webkit nightlies currently support this event
|
||||||
|
} else if ( document.addEventListener ) {
|
||||||
|
// Use the handy event callback
|
||||||
|
document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
|
||||||
|
|
||||||
|
// A fallback to window.onload, that will always work
|
||||||
|
window.addEventListener( "load", jQuery.ready, false );
|
||||||
|
|
||||||
|
// 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return readyList.promise( object );
|
||||||
|
};
|
||||||
|
|
||||||
// Populate the class2type map
|
// Populate the class2type map
|
||||||
jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
|
jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
|
||||||
class2type[ "[object " + name + "]" ] = name.toLowerCase();
|
class2type[ "[object " + name + "]" ] = name.toLowerCase();
|
||||||
|
17
test/data/event/promiseReady.html
Normal file
17
test/data/event/promiseReady.html
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
||||||
|
<title>Test case for jQuery ticket #11470</title>
|
||||||
|
<script type="text/javascript" src="../include_js.php"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
jQuery.when( jQuery.ready ).done(function() {
|
||||||
|
jQuery("body").append("<div>modifying DOM</div>");
|
||||||
|
window.parent.iframeCallback( $("div").text() === "modifying DOM" );
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<!-- long loading iframe -->
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -2800,6 +2800,11 @@ test("fixHooks extensions", function() {
|
|||||||
// which breaks order of execution on async loaded files
|
// which breaks order of execution on async loaded files
|
||||||
// also need PHP to make the incepted IFRAME hang
|
// also need PHP to make the incepted IFRAME hang
|
||||||
if ( hasPHP ) {
|
if ( hasPHP ) {
|
||||||
|
testIframeWithCallback( "jQuery.ready promise", "event/promiseReady", function( isOk ) {
|
||||||
|
expect(1);
|
||||||
|
ok( isOk, "$.when( $.ready ) works" );
|
||||||
|
});
|
||||||
|
|
||||||
testIframeWithCallback( "jQuery.ready synchronous load with long loading iframe", "event/syncReady", function( isOk ) {
|
testIframeWithCallback( "jQuery.ready synchronous load with long loading iframe", "event/syncReady", function( isOk ) {
|
||||||
expect(1);
|
expect(1);
|
||||||
ok( isOk, "jQuery loaded synchronously fires ready before all sub-resources are loaded" );
|
ok( isOk, "jQuery loaded synchronously fires ready before all sub-resources are loaded" );
|
||||||
|
Loading…
Reference in New Issue
Block a user