Core: use interactive to evaluate dom ready, barring IE9-10

Fixes gh-2100
This commit is contained in:
Timmy Willison 2015-10-28 13:54:04 -04:00
parent 87bd130289
commit dabd5ba96c
3 changed files with 39 additions and 4 deletions

View File

@ -70,10 +70,10 @@ jQuery.ready.promise = function( obj ) {
// Catch cases where $(document).ready() is called
// after the browser event has already occurred.
// We once tried to use readyState "interactive" here,
// but it caused issues like the one
// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
if ( document.readyState === "complete" ) {
// Support: IE9-10 only
// Older IE sometimes signals "interactive" too soon
if ( document.readyState === "complete" ||
( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
// Handle it asynchronously to allow scripts the opportunity to delay ready
window.setTimeout( jQuery.ready );

View File

@ -0,0 +1,23 @@
<!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 gh-2100</title>
<script src="../../jquery.js"></script>
</head>
<body>
<script type="text/javascript">
jQuery( document ).ready(function () {
window.parent.iframeCallback( jQuery("#container").length === 1 );
});
</script>
<!-- external resources that come before elements trick
oldIE into thinking the dom is ready, but it's not...
leaving this check here for future trailblazers to attempt
fixing this...-->
<script type="text/javascript" src="../longLoadScript.php?sleep=1"></script>
<div id="container" style="height: 300px"></div>
</body>
</html>

View File

@ -2518,6 +2518,18 @@ testIframeWithCallback(
}
);
// need PHP here to make the incepted IFRAME hang
if ( hasPHP ) {
testIframeWithCallback(
"jQuery.ready uses interactive",
"event/interactiveReady.html",
function( isOk, assert ) {
assert.expect( 1 );
assert.ok( isOk, "jQuery fires ready when the DOM can truly be interacted with" );
}
);
}
testIframeWithCallback(
"Focusing iframe element",
"event/focusElem.html",