Applied the RegExp issues reported by Jeff Robinson here: http://jmrware.com/articles...
[jquery.git] / src / attributes.js
index a5a6662..b0a0e91 100644 (file)
@@ -1,25 +1,20 @@
+(function( jQuery ) {
+
 var rclass = /[\n\t]/g,
        rspace = /\s+/,
        rreturn = /\r/g,
-       rspecialurl = /href|src|style/,
-       rtype = /(button|input)/i,
-       rfocusable = /(button|input|object|select|textarea)/i,
-       rclickable = /^(a|area)$/i,
-       rradiocheck = /radio|checkbox/;
+       rspecialurl = /^(?:href|src|style)$/,
+       rtype = /^(?:button|input)$/i,
+       rfocusable = /^(?:button|input|object|select|textarea)$/i,
+       rclickable = /^a(?:rea)?$/i,
+       rradiocheck = /^(?:radio|checkbox)$/i;
 
 jQuery.fn.extend({
        attr: function( name, value ) {
-               return access( this, name, value, true, jQuery.attr );
+               return jQuery.access( this, name, value, true, jQuery.attr );
        },
 
-       removeAttr: function( name ) {
-               if ( jQuery.isFunction( name ) ) {
-                       return this.each(function(i) {
-                               var self = jQuery(this);
-                               self.removeAttr( name.call(this, i, self.attr(name)) );
-                       });
-               }
-
+       removeAttr: function( name, fn ) {
                return this.each(function(){
                        jQuery.attr( this, name, "" );
                        if ( this.nodeType === 1 ) {
@@ -47,12 +42,13 @@ jQuery.fn.extend({
                                                elem.className = value;
 
                                        } else {
-                                               var className = " " + elem.className + " ";
+                                               var className = " " + elem.className + " ", setClass = elem.className;
                                                for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
                                                        if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
-                                                               elem.className += " " + classNames[c];
+                                                               setClass += " " + classNames[c];
                                                        }
                                                }
+                                               elem.className = jQuery.trim( setClass );
                                        }
                                }
                        }
@@ -81,7 +77,7 @@ jQuery.fn.extend({
                                                for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
                                                        className = className.replace(" " + classNames[c] + " ", " ");
                                                }
-                                               elem.className = className.substring(1, className.length - 1);
+                                               elem.className = jQuery.trim( className );
 
                                        } else {
                                                elem.className = "";
@@ -99,7 +95,7 @@ jQuery.fn.extend({
                if ( jQuery.isFunction( value ) ) {
                        return this.each(function(i) {
                                var self = jQuery(this);
-                               self.toggleClass( value.call(this, i, self.attr("class")), stateVal );
+                               self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
                        });
                }
 
@@ -145,7 +141,10 @@ jQuery.fn.extend({
 
                        if ( elem ) {
                                if ( jQuery.nodeName( elem, "option" ) ) {
-                                       return (elem.attributes.value || {}).specified ? elem.value : elem.text;
+                                       // attributes.value is undefined in Blackberry 4.7 but
+                                       // uses .value. See #6932
+                                       var val = elem.attributes.value;
+                                       return !val || val.specified ? elem.value : elem.text;
                                }
 
                                // We need to handle select boxes special
@@ -195,28 +194,23 @@ jQuery.fn.extend({
                        return undefined;
                }
 
-               // Typecast once if the value is a number
-               if ( typeof value === "number" ) {
-                       value += "";
-               }
-
-               var val = value;
+               var isFunction = jQuery.isFunction(value);
 
                return this.each(function(i) {
-                       var self = jQuery(this);
+                       var self = jQuery(this), val = value;
 
-                       if ( jQuery.isFunction(value) ) {
-                               val = value.call(this, i, self.val());
+                       if ( this.nodeType !== 1 ) {
+                               return;
+                       }
 
-                               // Typecast each time if the value is a Function and the appended
-                               // value is therefore different each time.
-                               if ( typeof val === "number" ) {
-                                       val += "";
-                               }
+                       if ( isFunction ) {
+                               val = value.call(this, i, self.val());
                        }
 
-                       if ( this.nodeType !== 1 ) {
-                               return;
+                       // Typecast each time if the value is a Function and the appended
+                       // value is therefore different each time.
+                       if ( typeof val === "number" ) {
+                               val += "";
                        }
 
                        if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) {
@@ -226,7 +220,7 @@ jQuery.fn.extend({
                                var values = jQuery.makeArray(val);
 
                                jQuery( "option", this ).each(function() {
-                                       this.selected = jQuery.inArray( self.val(), values ) >= 0;
+                                       this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
                                });
 
                                if ( !values.length ) {
@@ -289,11 +283,12 @@ jQuery.extend({
                        }
 
                        // If applicable, access the attribute via the DOM 0 way
-                       if ( name in elem && notxml && !special ) {
+                       // 'in' checks fail in Blackberry 4.7 #6931
+                       if ( (name in elem || elem[ name ] !== undefined) && notxml && !special ) {
                                if ( set ) {
                                        // We can't allow the type property to be changed (since it causes problems in IE)
                                        if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) {
-                                               throw "type property can't be changed";
+                                               jQuery.error( "type property can't be changed" );
                                        }
 
                                        elem[ name ] = value;
@@ -332,6 +327,12 @@ jQuery.extend({
                                elem.setAttribute( name, "" + value );
                        }
 
+                       // Ensure that missing attributes return undefined
+                       // Blackberry 4.7 returns "" from getAttribute #6938
+                       if ( !elem.attributes[ name ] && !elem.hasAttribute( name ) ) {
+                               return undefined;
+                       }
+
                        var attr = !jQuery.support.hrefNormalized && notxml && special ?
                                        // Some attributes require a special call on IE
                                        elem.getAttribute( name, 2 ) :
@@ -340,9 +341,7 @@ jQuery.extend({
                        // Non-existent attributes return null, we normalize to undefined
                        return attr === null ? undefined : attr;
                }
-
-               // elem is actually elem.style ... set the style
-               // Using attr for specific style information is now deprecated. Use style insead.
-               return jQuery.style( elem, name, value );
        }
 });
+
+})( jQuery );