From 3970e8c68146a3645f09d54735a40d5cf7eeef9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Scott=20Gonz=C3=A1lez?= Date: Wed, 18 Mar 2015 10:05:36 -0400 Subject: [PATCH] Position: Simplify fraction support test Also makes the test lazy to avoid any potential layouts/recalculations during initialization. Fixes #9898 Ref #9899 --- ui/position.js | 61 +++++++++++++++++--------------------------------- 1 file changed, 21 insertions(+), 40 deletions(-) diff --git a/ui/position.js b/ui/position.js index 7423d02d1..367fc3978 100644 --- a/ui/position.js +++ b/ui/position.js @@ -41,6 +41,26 @@ var cachedScrollbarWidth, supportsOffsetFractions, rpercent = /%$/, _position = $.fn.position; +// Support: IE <=9 only +supportsOffsetFractions = function() { + var element = $( "
" ) + .css( "position", "absolute" ) + .appendTo( "body" ) + .offset( { + top: 1.5, + left: 1.5 + } ), + support = element.offset().top === 1.5; + + element.remove(); + + supportsOffsetFractions = function() { + return support; + }; + + return support; +}; + function getOffsets( offsets, width, height ) { return [ parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ), @@ -243,7 +263,7 @@ $.fn.position = function( options ) { position.top += myOffset[ 1 ]; // if the browser doesn't support fractions, then round for consistent results - if ( !supportsOffsetFractions ) { + if ( !supportsOffsetFractions() ) { position.left = round( position.left ); position.top = round( position.top ); } @@ -475,45 +495,6 @@ $.ui.position = { } }; -// fraction support test -( function() { - var testElement, testElementParent, testElementStyle, offsetLeft, i, - body = document.getElementsByTagName( "body" )[ 0 ], - div = document.createElement( "div" ); - - //Create a "fake body" for testing based on method used in jQuery.support - testElement = document.createElement( body ? "div" : "body" ); - testElementStyle = { - visibility: "hidden", - width: 0, - height: 0, - border: 0, - margin: 0, - background: "none" - }; - if ( body ) { - $.extend( testElementStyle, { - position: "absolute", - left: "-1000px", - top: "-1000px" - } ); - } - for ( i in testElementStyle ) { - testElement.style[ i ] = testElementStyle[ i ]; - } - testElement.appendChild( div ); - testElementParent = body || document.documentElement; - testElementParent.insertBefore( testElement, testElementParent.firstChild ); - - div.style.cssText = "position: absolute; left: 10.7432222px;"; - - offsetLeft = $( div ).offset().left; - supportsOffsetFractions = offsetLeft > 10 && offsetLeft < 11; - - testElement.innerHTML = ""; - testElementParent.removeChild( testElement ); -} )(); - } )(); return $.ui.position;