From 93750cee36f0b2edc1afd2dad64d9306865a39b9 Mon Sep 17 00:00:00 2001 From: timmywil Date: Mon, 31 Oct 2011 09:50:21 -0400 Subject: [PATCH] Run offset support tests at doc ready. Fixes #10613. --- src/support.js | 57 ++++++++++++++++++++++++------------------------- test/index.html | 1 + 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/support.js b/src/support.js index 20cf2b526..dcc61fbfe 100644 --- a/src/support.js +++ b/src/support.js @@ -20,8 +20,7 @@ jQuery.support = (function() { events, eventName, i, - isSupported, - offsetSupport; + isSupported; // Preliminary tests div.setAttribute("className", "t"); @@ -231,9 +230,6 @@ jQuery.support = (function() { ( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; } - // Remove the body element we added - testElement.innerHTML = ""; - // Technique from Juriy Zaytsev // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ // We only care about the case where non-standard event systems @@ -256,29 +252,31 @@ jQuery.support = (function() { } } - // Determine fixed-position support early - testElement.style.position = "static"; - testElement.style.top = "0px"; - testElement.style.marginTop = "1px"; - offsetSupport = (function( body, container ) { - - var outer, inner, table, td, supports, - bodyMarginTop = parseFloat( body.style.marginTop ) || 0, + // Run fixed position tests at doc ready to avoid a crash + // related to the invisible body in IE8 + jQuery(function() { + var outer, inner, table, td, offsetSupport, + bodyMarginTop = 1, ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;", style = "style='" + ptlm + "border:5px solid #000;padding:0;'", html = "
" + "" + - "
"; - - container.style.cssText = ptlm + "border:0;visibility:hidden"; - - container.innerHTML = html; - body.insertBefore( container, body.firstChild ); - outer = container.firstChild; + ""; + + body = document.getElementsByTagName("body")[0]; + testElement = document.createElement("div"); + body.style.position = "static"; + body.style.top = "0px"; + body.style.marginTop = bodyMarginTop + "px"; + testElement.style.cssText = ptlm + "border:0;visibility:hidden"; + + testElement.innerHTML = html; + body.appendChild( testElement ); + outer = testElement.firstChild; inner = outer.firstChild; - td = outer.nextSibling.firstChild.firstChild; + td = outer.nextSibling.firstChild.firstChild.firstChild; - supports = { + offsetSupport = { doesNotAddBorder: ( inner.offsetTop !== 5 ), doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) }; @@ -287,20 +285,21 @@ jQuery.support = (function() { inner.style.top = "20px"; // safari subtracts parent border width here which is 5px - supports.supportsFixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); + offsetSupport.supportsFixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); inner.style.position = inner.style.top = ""; outer.style.overflow = "hidden"; outer.style.position = "relative"; - supports.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); - supports.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== bodyMarginTop ); - - return supports; + offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); + offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== bodyMarginTop ); - })( testElement, div ); + body.removeChild( testElement ); + jQuery.extend( jQuery.offset, offsetSupport ); + jQuery.extend( support, offsetSupport ); + }); - jQuery.extend( support, offsetSupport ); + testElement.innerHTML = ""; testElementParent.removeChild( testElement ); // Null connected elements to avoid leaks in IE diff --git a/test/index.html b/test/index.html index 40e6803c7..e6cbc013f 100644 --- a/test/index.html +++ b/test/index.html @@ -298,5 +298,6 @@ Z
+ -- 2.39.5