diff --git a/src/core.js b/src/core.js index 7f30edea2..e28c1b524 100644 --- a/src/core.js +++ b/src/core.js @@ -483,8 +483,8 @@ jQuery.extend({ return obj && typeof obj === "object" && "setInterval" in obj; }, - isNaN: function( obj ) { - return obj == null || !rdigit.test( obj ) || isNaN( obj ); + isNumeric: function( obj ) { + return obj != null && rdigit.test( obj ) && !isNaN( obj ); }, type: function( obj ) { diff --git a/src/css.js b/src/css.js index 76c2255ce..2adfdffe1 100644 --- a/src/css.js +++ b/src/css.js @@ -211,7 +211,7 @@ if ( !jQuery.support.opacity ) { set: function( elem, value ) { var style = elem.style, currentStyle = elem.currentStyle, - opacity = jQuery.isNaN( value ) ? "" : "alpha(opacity=" + value * 100 + ")", + opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "", filter = currentStyle && currentStyle.filter || style.filter || ""; // IE has trouble with opacity if it does not have layout diff --git a/src/data.js b/src/data.js index 0ce3b7d66..02f96a849 100644 --- a/src/data.js +++ b/src/data.js @@ -323,7 +323,7 @@ function dataAttr( elem, key, data ) { data = data === "true" ? true : data === "false" ? false : data === "null" ? null : - !jQuery.isNaN( data ) ? parseFloat( data ) : + jQuery.isNumeric( data ) ? parseFloat( data ) : rbrace.test( data ) ? jQuery.parseJSON( data ) : data; } catch( e ) {} diff --git a/src/dimensions.js b/src/dimensions.js index 7df0d5ddf..d339817c9 100644 --- a/src/dimensions.js +++ b/src/dimensions.js @@ -61,7 +61,7 @@ jQuery.each([ "Height", "Width" ], function( i, name ) { var orig = jQuery.css( elem, type ), ret = parseFloat( orig ); - return jQuery.isNaN( ret ) ? orig : ret; + return jQuery.isNumeric( ret ) ? ret : orig; // Set the width or height on the element (default to pixels if value is unitless) } else { diff --git a/test/unit/core.js b/test/unit/core.js index 0f4504a13..0756e7947 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -454,6 +454,46 @@ test("isFunction", function() { }); }); +test( "isNumeric", function() { + expect( 33 ); + + var t = jQuery.isNumeric; + + ok( t("-10"), "Negative integer string"); + ok( t("0"), "Zero string"); + ok( t("5"), "Positive integer string"); + ok( t(-16), "Negative integer number"); + ok( t(0), "Zero integer number"); + ok( t(32), "Positive integer number"); + ok( t("040"), "Octal integer literal string"); + ok( t(0144), "Octal integer literal"); + ok( t("0xFF"), "Hexadecimal integer literal string"); + ok( t(0xFFF), "Hexadecimal integer literal"); + ok( t("-1.6"), "Negative floating point string"); + ok( t("4.536"), "Positive floating point string"); + ok( t(-2.6), "Negative floating point number"); + ok( t(3.1415), "Positive floating point number"); + ok( t(8e5), "Exponential notation"); + ok( t("123e-2"), "Exponential notation string"); + equals( t(""), false, "Empty string"); + equals( t(" "), false, "Whitespace characters string"); + equals( t("\t\t"), false, "Tab characters string"); + equals( t("abcdefghijklm1234567890"), false, "Alphanumeric character string"); + equals( t("xabcdefx"), false, "Non-numeric character string"); + equals( t(true), false, "Boolean true literal"); + equals( t(false), false, "Boolean false literal"); + equals( t("bcfed5.2"), false, "Number with preceding non-numeric characters"); + equals( t("7.2acdgs"), false, "Number with trailling non-numeric characters"); + equals( t(undefined), false, "Undefined value"); + equals( t(null), false, "Null value"); + equals( t(NaN), false, "NaN value"); + equals( t(Infinity), false, "Infinity primitive"); + equals( t(Number.POSITIVE_INFINITY), false, "Positive Infinity"); + equals( t(Number.NEGATIVE_INFINITY), false, "Negative Infinity"); + equals( t({}), false, "Empty object"); + equals( t(function(){} ), false, "Instance of a function"); +}); + test("isXMLDoc - HTML", function() { expect(4);