]> source.dussan.org Git - jquery.git/commitdiff
Improve relative string performance in .css and some code cleanup 297/head
authorDan Heberden <danheberden@gmail.com>
Mon, 4 Apr 2011 23:48:24 +0000 (16:48 -0700)
committerDan Heberden <danheberden@gmail.com>
Mon, 4 Apr 2011 23:48:24 +0000 (16:48 -0700)
src/css.js
test/unit/css.js

index d23549fa4f08b5be3cf5b84d16780d11e407bed6..65ec20f575fab872a9b14fdf457e352b09d52a20 100644 (file)
@@ -7,8 +7,8 @@ var ralpha = /alpha\([^)]*\)/i,
        rupper = /([A-Z]|^ms)/g,
        rnumpx = /^-?\d+(?:px)?$/i,
        rnum = /^-?\d/,
-       rrelNum = /=/,
-       rrelString = /[^+\-\de]+/g,
+       rrelNum = /^[+\-]=/,
+       rrelNumFilter = /[^+\-\.\de]+/g,
 
        cssShow = { position: "absolute", visibility: "hidden", display: "block" },
        cssWidth = [ "Left", "Right" ],
@@ -77,26 +77,27 @@ jQuery.extend({
                }
 
                // Make sure that we're working with the right name
-               var ret, parsed, type, origName = jQuery.camelCase( name ),
+               var ret, type, origName = jQuery.camelCase( name ),
                        style = elem.style, hooks = jQuery.cssHooks[ origName ];
 
                name = jQuery.cssProps[ origName ] || origName;
 
                // Check if we're setting a value
                if ( value !== undefined ) {
+                       type = typeof value;
+
                        // Make sure that NaN and null values aren't set. See: #7116
-                       if ( typeof value === "number" && isNaN( value ) || value == null ) {
+                       if ( type === "number" && isNaN( value ) || value == null ) {
                                return;
                        }
 
-                       // convert string to number or relative number
-                       if ( type === "string" ) {
-                               parsed = +value.replace( rrelString, '' );
-                               value = rrelNum.test( value ) ? parsed + jQuery.css( elem, name ) : parsed;
+                       // convert relative number strings (+= or -=) to relative numbers. #7345
+                       if ( type === "string" && rrelNum.test( value ) ) {
+                               value = +value.replace( rrelNumFilter, '' ) + parseFloat( jQuery.css( elem, name ) );
                        }
 
                        // If a number was passed in, add 'px' to the (except for certain CSS properties)
-                       if ( typeof value === "number" && !jQuery.cssNumber[ origName ] ) {
+                       if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
                                value += "px";
                        }
 
index c4724fcd05053860fbc54ba2de090d81d0a302fb..08f50ef2575f6bf9ff4ca3dcfb1b59ec38e5e19d 100644 (file)
@@ -106,24 +106,35 @@ test("css(String|Hash)", function() {
 });
 
 test("css() explicit and relative values", function() {
+       expect(9);
        var $elem = jQuery('#nothiddendiv');
-       
+
        $elem.css({ width: 1, height: 1 });
-       ok( [$elem.width(), $elem.height()], [1,1] );
-       $elem.css({ width: "+=9", height: "+=9" });
-       ok( [$elem.width(), $elem.height()], [10,10] );
-       $elem.css({ width: "-=9", height: "-=9" });
-       ok( [$elem.width(), $elem.height()], [1,1] );
-       $elem.css({ width: "+=9px", height: "+=9px" });
-       ok( [$elem.width(), $elem.height()], [10,10] );
-       $elem.css({ width: "-=9px", height: "-=9px" });
-       ok( [$elem.width(), $elem.height()], [1,1] );
-       $elem.css("width", "+=9").css("height", "+=9");
-       ok( [$elem.width(), $elem.height()], [10,10] );
-       $elem.css("width", "+9").css("height", "+9");
-       ok( [$elem.width(), $elem.height()], [9,9] );
-       $elem.css("width", "-9").css("height", "-9");
-       ok( [$elem.width(), $elem.height()], [0,0] );
+       equals( $elem.width(), 1, "Initial css set or width/height works (hash)" );
+
+       $elem.css({ width: "+=9" });
+       equals( $elem.width(), 10, "'+=9' on width (hash)" );
+
+       $elem.css({ width: "-=9" });
+       equals( $elem.width(), 1, "'-=9' on width (hash)" );
+
+       $elem.css({ width: "+=9px" });
+       equals( $elem.width(), 10, "'+=9px' on width (hash)" );
+
+       $elem.css({ width: "-=9px" });
+       equals( $elem.width(), 1, "'-=9px' on width (hash)" );
+
+       $elem.css( "width", "+=9" );
+       equals( $elem.width(), 10, "'+=9' on width (params)" );
+
+       $elem.css( "width", "-=9" ) ;
+       equals( $elem.width(), 1, "'-=9' on width (params)" );
+
+       $elem.css( "width", "+=9px" );
+       equals( $elem.width(), 10, "'+=9px' on width (params)" );
+
+       $elem.css( "width", "-=9px" );
+       equals( $elem.width(), 1, "'-=9px' on width (params)" );
 });
 
 test("css(String, Object)", function() {