Side navigation
#3007 closed bug (fixed)
Opened June 09, 2008 10:48AM UTC
Closed March 18, 2009 05:31PM UTC
Last modified March 14, 2012 04:42PM UTC
$.css( cssLikeName ) doesn't return same value than $.css( propertyLikeName )
Reported by: | shazam | Owned by: | |
---|---|---|---|
Priority: | minor | Milestone: | 1.3 |
Component: | core | Version: | 1.2.6 |
Keywords: | Cc: | ||
Blocked by: | Blocking: |
Description
Sample :
<html> <head> <title>.css dysfunction</title> <style> * { font-family:verdana; line-height:150%; } label { border:1px solid red; padding:3px; margin:2px; width:50px } div { border:1px solid green; } </style> <script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script> <script> $(function() { $('#p').text($('div').css('marginLeft')); $('#c').text($('div').css('margin-left')); }); </script> </head> <body> <div style='margin-left:5cm'>Div having a '5cm' left margin in 'style' attribute</div> $('div).css('marginLeft') = <label id='p'></label> <br/> $('div).css('margin-left') = <label id='c'></label> </body> </html>
$('div).css('marginLeft')
returns '5cm'
$('div).css('margin-left')
returns '189px' on my screen
I think that the $.curCss function should try propertyLikeName (equiv. to camelCased name in this case marginLeft) on elem.style before dealing with runtimeStyle or computedStyle.
I also don't understand why jQuery converts the css value to pixels in the curCss function (Dean Edwards hack).
so, I rewrote the $.curCss function like this :
curCSS: function( elem, name, force ) { var ret, style = elem.style, // css like name cName=name.replace( /([A-Z])/g, "-$1" ).toLowerCase(), // property like name pName=name.replace(/\\-(\\w)/g, function(all, letter){ return letter.toUpperCase(); }); // A helper method for determining if an element's values are broken function color( elem ) { if ( !jQuery.browser.safari ) return false; // defaultView is cached var ret = defaultView.getComputedStyle( elem, null ); return !ret || ret.getPropertyValue("color") == ""; } // We need to handle opacity special in IE if ( cName == "opacity" && jQuery.browser.msie ) { ret = jQuery.attr( style, "opacity" ); return ret == "" ? "1" : ret; } // Opera sometimes will give the wrong display answer, this fixes it, see #2037 if ( jQuery.browser.opera && cName == "display" ) { var save = style.outline; style.outline = "0 solid black"; style.outline = save; } // Make sure we're using the right name for getting the float value if ( pName.match( /float/i ) ) pName = styleFloat; if ( !force && style && style[ pName ] ) ret = style[ pName ]; else if ( defaultView.getComputedStyle ) { var computedStyle = defaultView.getComputedStyle( elem, null ); if ( computedStyle && !color( elem ) ) ret = computedStyle.getPropertyValue( cName ); // If the element isn't reporting its values properly in Safari // then some display: none elements are involved else { var swap = [], stack = [], a = elem, i = 0; // Locate all of the parent display: none elements for ( ; a && color(a); a = a.parentNode ) stack.unshift(a); // Go through and make them visible, but in reverse // (It would be better if we knew the exact display type that they had) for ( ; i < stack.length; i++ ) if ( color( stack[ i ] ) ) { swap[ i ] = stack[ i ].style.display; stack[ i ].style.display = "block"; } // Since we flip the display style, we have to handle that // one special, otherwise get the value ret = cName == "display" && swap[ stack.length - 1 ] != null ? "none" : ( computedStyle && computedStyle.getPropertyValue( cName ) ) || ""; // Finally, revert the display styles back for ( i = 0; i < swap.length; i++ ) if ( swap[ i ] != null ) stack[ i ].style.display = swap[ i ]; } // We should always get a number back from opacity if ( cName == "opacity" && ret == "" ) ret = "1"; } else if ( elem.currentStyle ) ret = elem.currentStyle[ pName ]; return ret; },
Attachments (1)
Change History (1)
Changed March 18, 2009 05:31PM UTC by comment:1
resolution: | → fixed |
---|---|
status: | new → closed |
jQuery 1.3.x converts css names to camelcase