diff options
author | Timmy Willison <timmywillisn@gmail.com> | 2015-10-28 13:54:04 -0400 |
---|---|---|
committer | Timmy Willison <timmywillisn@gmail.com> | 2015-10-29 10:21:50 -0400 |
commit | dabd5ba96c05279b3ffb052db5b8d17f75996694 (patch) | |
tree | c644a0791d2e8231f0258c546730ea71086bf68c | |
parent | 87bd130289c6ed9bfc355c1f8587ae6ce00a4776 (diff) | |
download | jquery-dabd5ba96c05279b3ffb052db5b8d17f75996694.tar.gz jquery-dabd5ba96c05279b3ffb052db5b8d17f75996694.zip |
Core: use interactive to evaluate dom ready, barring IE9-10
Fixes gh-2100
-rw-r--r-- | src/core/ready.js | 8 | ||||
-rw-r--r-- | test/data/event/interactiveReady.html | 23 | ||||
-rw-r--r-- | test/unit/event.js | 12 |
3 files changed, 39 insertions, 4 deletions
diff --git a/src/core/ready.js b/src/core/ready.js index 7a7ef5869..73c3d706a 100644 --- a/src/core/ready.js +++ b/src/core/ready.js @@ -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 ); diff --git a/test/data/event/interactiveReady.html b/test/data/event/interactiveReady.html new file mode 100644 index 000000000..77b37104d --- /dev/null +++ b/test/data/event/interactiveReady.html @@ -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> diff --git a/test/unit/event.js b/test/unit/event.js index ebaf42f6b..479f805db 100644 --- a/test/unit/event.js +++ b/test/unit/event.js @@ -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", |