diff --git a/src/css/defaultDisplay.js b/src/css/defaultDisplay.js index 78acb2bcd..45af9f90f 100644 --- a/src/css/defaultDisplay.js +++ b/src/css/defaultDisplay.js @@ -4,17 +4,28 @@ define([ ], function( jQuery ) { var iframe, - elemdisplay = { BODY: "block" }; + elemdisplay = {}; /** * Retrieve the actual display of a element * @param {String} name nodeName of the element * @param {Object} doc Document object */ +// Called only from within defaultDisplay function actualDisplay( name, doc ) { var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), - display = jQuery.css( elem[0], "display" ); - elem.remove(); + + // getDefaultComputedStyle might be reliably used only on attached element + display = window.getDefaultComputedStyle ? + + // Use of this method is a temporary fix (more like optmization) until something better comes along, + // since it was removed from specification and supported only in FF + window.getDefaultComputedStyle( elem[ 0 ] ).display : jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + return display; } @@ -31,15 +42,15 @@ function defaultDisplay( nodeName ) { // If the simple way fails, read from inside an iframe if ( display === "none" || !display ) { + // Use the already-created iframe if possible - iframe = ( iframe || - jQuery("") - .css( "cssText", "display:block !important" ) - ).appendTo( doc.documentElement ); + iframe = (iframe || jQuery( "" )).appendTo( doc.documentElement ); // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse - doc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document; - doc.write("
"); + doc = iframe[ 0 ].contentDocument; + + // Support: IE + doc.write(); doc.close(); display = actualDisplay( nodeName, doc ); diff --git a/test/unit/css.js b/test/unit/css.js index 3a106c04d..460e5d60b 100644 --- a/test/unit/css.js +++ b/test/unit/css.js @@ -543,21 +543,25 @@ test( "show() resolves correct default display for detached nodes", function(){ span.remove(); }); -test("show() resolves correct default display #10227", function() { - expect(2); +test("show() resolves correct default display #10227", 4, function() { + var html = jQuery( document.documentElement ), + body = jQuery( "body" ); - var body = jQuery("body"); - body.append( - "a
" - ); + body.append( "a
" ); - equal( body.css("display"), "none", "Initial display: none" ); + equal( body.css("display"), "none", "Initial display for body element: none" ); body.show(); - equal( body.css("display"), "block", "Correct display: block" ); + equal( body.css("display"), "block", "Correct display for body element: block" ); - jQuery("#ddisplay").remove(); - QUnit.expectJqData( body[0], "olddisplay" ); + body.append( "a
" ); + + equal( html.css("display"), "none", "Initial display for html element: none" ); + + html.show(); + equal( html.css( "display" ), "block", "Correct display for html element: block" ); + + jQuery( ".ddisplay" ).remove(); }); test("show() resolves correct default display when iframe display:none #12904", function() {