Make sure that jQuery works even when the individual modules are loaded separately...
[jquery.git] / src / attributes.js
index 3ae0542..73b4cdf 100644 (file)
@@ -1,3 +1,5 @@
+(function( jQuery ) {
+
 var rclass = /[\n\t]/g,
        rspace = /\s+/,
        rreturn = /\r/g,
@@ -9,17 +11,10 @@ var rclass = /[\n\t]/g,
 
 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 = "";
@@ -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
@@ -284,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;
@@ -327,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 ) :
@@ -337,7 +343,9 @@ jQuery.extend({
                }
 
                // elem is actually elem.style ... set the style
-               // Using attr for specific style information is now deprecated. Use style insead.
+               // Using attr for specific style information is now deprecated. Use style instead.
                return jQuery.style( elem, name, value );
        }
 });
+
+})( jQuery );