]> source.dussan.org Git - jquery.git/commitdiff
Fix #12282. IE has premature .readyState == "interactive". Close gh-901.
authorMike Sherov <mike.sherov@gmail.com>
Sun, 19 Aug 2012 21:41:43 +0000 (17:41 -0400)
committerDave Methvin <dave.methvin@gmail.com>
Mon, 20 Aug 2012 12:16:07 +0000 (08:16 -0400)
src/core.js
test/data/event/partialLoadReady.php [new file with mode: 0644]
test/data/testinit.js
test/unit/event.js
test/unit/support.js

index f9ee2485271d624127c904cd060fbd02334316a0..4334ae26105762292dfde8ea156333472832187e 100644 (file)
@@ -830,9 +830,10 @@ jQuery.ready.promise = function( obj ) {
 
                readyList = jQuery.Deferred();
 
-               // Catch cases where $(document).ready() is called after the
-               // browser event has already occurred.
-               if ( document.readyState === "complete" || ( document.readyState !== "loading" && document.addEventListener ) ) {
+               // Catch cases where $(document).ready() is called after the browser event has already occurred.
+               // IE10 and lower don't handle "interactive" properly... use a weak inference to detect it
+               // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+               if ( document.attachEvent ? document.readyState === "complete" : document.readyState !== "loading" ) {
                        // Handle it asynchronously to allow scripts the opportunity to delay ready
                        setTimeout( jQuery.ready, 1 );
 
diff --git a/test/data/event/partialLoadReady.php b/test/data/event/partialLoadReady.php
new file mode 100644 (file)
index 0000000..000ee56
--- /dev/null
@@ -0,0 +1,40 @@
+<?php
+//try very hard to disable output buffering
+@ini_set("output_buffering", 0);
+@apache_setenv("no-gzip", 1);
+@ini_set("zlib.output_compression", 0);
+ob_start();
+?>
+
+<!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 #12282</title>
+</head>
+<body>
+
+<h1>TEST</h1>
+<script type="text/javascript" src="../../../dist/jquery.js"></script>
+<script type="text/javascript">
+jQuery( document ).ready(function() {
+       window.parent.iframeCallback( jQuery('#container').length === 1 );
+});
+</script>
+
+<?php
+//send the top of the document without sending the bottom portion
+echo str_repeat(" ", 1024 * 8), "\n";
+ob_flush();
+?>
+
+<h2>Sleeping for 1 seconds (simulating server side process)</h2>
+
+<?php
+//sleep for a bit, simulating a server side process
+sleep(1);
+?>
+
+<div id="container">ready</h2>
+</body>
+</html>
\ No newline at end of file
index 18f9e28459903648aa7e1bb15ba1036e0caf84e4..fbc8586650d2f28a4c5eb9834aa483cea9e45d18 100644 (file)
@@ -223,7 +223,7 @@ function url( value ) {
                                }, 0 );
                        };
                        iframe = jQuery( "<div/>" ).append(
-                               jQuery( "<iframe/>" ).attr( "src", url("./data/" + fileName + ".html") )
+                               jQuery( "<iframe/>" ).attr( "src", url( "./data/" + fileName ) )
                        ).appendTo( "body" );
                });
        }
index c1981623da568c98091e18aa712fe71107ebddc9..f58eb59e60dc0994478992d0ce6365c78cac63e8 100644 (file)
@@ -2888,28 +2888,33 @@ test("fixHooks extensions", function() {
 // which breaks order of execution on async loaded files
 // also need PHP to make the incepted IFRAME hang
 if ( hasPHP ) {
-       testIframeWithCallback( "jQuery.ready promise", "event/promiseReady", function( isOk ) {
+       testIframeWithCallback( "jQuery.ready promise", "event/promiseReady.html", function( isOk ) {
                expect(1);
                ok( isOk, "$.when( $.ready ) works" );
        });
 
-       // oldIE needs all subresources to be loaded before it can gaurantee the document is truly ready to be interacted with
-       if( document.addEventListener ) {
-               testIframeWithCallback( "jQuery.ready synchronous load with long loading iframe", "event/syncReadyLongLoad", function( isOk ) {
+       testIframeWithCallback( "jQuery.ready synchronous load with long loading subresources", "event/syncReady.html", function( isOk ) {
+               expect(1);
+               ok( isOk, "jQuery loaded synchronously fires ready when the DOM can truly be interacted with" );
+       });
+
+       testIframeWithCallback( "jQuery.ready synchronous load with partially loaded page", "event/partialLoadReady.php", function( isOk ) {
+               expect(1);
+               ok( isOk, "jQuery loaded synchronously fires ready when the DOM can truly be interacted with" );
+       });
+
+       // allIE needs all subresources and full page to be loaded before it can gaurantee the document is truly ready to be interacted with
+       if( !document.attachEvent ) {
+               testIframeWithCallback( "jQuery.ready synchronous load with long loading iframe", "event/syncReadyLongLoad.html", function( isOk ) {
                        expect(1);
                        ok( isOk, "jQuery loaded synchronously fires ready before all sub-resources are loaded" );
                });
 
-               testIframeWithCallback( "jQuery.ready asynchronous load with long loading iframe", "event/asyncReady", function( isOk ) {
+               testIframeWithCallback( "jQuery.ready asynchronous load with long loading iframe", "event/asyncReady.html", function( isOk ) {
                        expect(1);
                        ok( isOk, "jQuery loaded asynchronously fires ready before all sub-resources are loaded" );
                });
        }
-
-       testIframeWithCallback( "jQuery.ready synchronous load with long loading subresources", "event/syncReady", function( isOk ) {
-               expect(1);
-               ok( isOk, "jQuery loaded synchronously fires ready when the DOM can truly be interacted with" );
-       });
 }
 
 (function(){
index 8c0d9ab73f37e1ec331065546f36a6cc145c7519..ac1d0e0ac53c96b546cb330287add878dd5f4a2c 100644 (file)
@@ -7,7 +7,7 @@ test("boxModel", function() {
 });
 
 if ( jQuery.css ) {
-       testIframeWithCallback( "body background is not lost if set prior to loading jQuery (#9238)", "support/bodyBackground", function( color, support ) {
+       testIframeWithCallback( "body background is not lost if set prior to loading jQuery (#9238)", "support/bodyBackground.html", function( color, support ) {
                expect( 2 );
                var i,
                        passed = true,
@@ -33,7 +33,7 @@ if ( jQuery.css ) {
        });
 }
 
-testIframeWithCallback( "A background on the testElement does not cause IE8 to crash (#9823)", "support/testElementCrash", function() {
+testIframeWithCallback( "A background on the testElement does not cause IE8 to crash (#9823)", "support/testElementCrash.html", function() {
        expect(1);
        ok( true, "IE8 does not crash" );
 });