X-Git-Url: http://git.asbjorn.it/?a=blobdiff_plain;f=src%2Fattributes.js;h=17c18c9bf3cab6094dbb71d10ff50b36823c31d1;hb=649024909d376032e6e9c41f209182d584e51043;hp=b5a29e159e56e38139525aeea7317b22800af0ff;hpb=ddb86f8d5bd1bd21b2beeeea55baf505b47dfed5;p=jquery.git diff --git a/src/attributes.js b/src/attributes.js index b5a29e1..17c18c9 100644 --- a/src/attributes.js +++ b/src/attributes.js @@ -1,9 +1,17 @@ +var rclass = /[\n\t]/g; + jQuery.fn.extend({ attr: function( name, value ) { return access(this, name, value, true, jQuery.attr); }, addClass: function( value ) { + if(jQuery.isFunction(value)) { + return this.each(function() { + jQuery(this).addClass( value.call(this) ); + }); + } + if ( value && typeof value === "string" ) { var classNames = (value || "").split(/\s+/); @@ -29,6 +37,12 @@ jQuery.fn.extend({ }, removeClass: function( value ) { + if(jQuery.isFunction(value)) { + return this.each(function() { + jQuery(this).removeClass( value.call(this) ); + }); + } + if ( (value && typeof value === "string") || value === undefined ) { var classNames = (value || "").split(/\s+/); @@ -37,7 +51,7 @@ jQuery.fn.extend({ if ( elem.nodeType === 1 && elem.className ) { if ( value ) { - var className = " " + elem.className + " "; + var className = (" " + elem.className + " ").replace(rclass, " "); for ( var c = 0, cl = classNames.length; c < cl; c++ ) { className = className.replace(" " + classNames[c] + " ", " "); } @@ -55,7 +69,7 @@ jQuery.fn.extend({ hasClass: function( selector ) { var className = " " + selector + " "; for ( var i = 0, l = this.length; i < l; i++ ) { - if ( (" " + this[i].className + " ").indexOf( className ) > -1 ) { + if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { return true; } } @@ -113,7 +127,7 @@ jQuery.fn.extend({ // Typecast once if the value is a number if ( typeof value === "number" ) { value += ''; - } + } var val = value; return this.each(function(){ @@ -122,10 +136,10 @@ jQuery.fn.extend({ // Typecast each time if the value is a Function and the appended // value is therefore different each time. if( typeof val === "number" ) { - val += ''; + val += ''; } } - + if ( this.nodeType != 1 ) { return; } @@ -151,8 +165,8 @@ jQuery.fn.extend({ jQuery.each({ removeAttr: function( name ) { - jQuery.attr( this, name, "" ); - if (this.nodeType == 1) { + if ( this.nodeType === 1 ) { + this[ jQuery.isXMLDoc( this ) ? name : jQuery.props[ name ] || name ] = null; this.removeAttribute( name ); } }, @@ -178,21 +192,41 @@ jQuery.each({ } } }, function(name, fn){ - jQuery.fn[ name ] = function(){ + jQuery.fn[ name ] = function(val, state){ + if( jQuery.isFunction( val ) ) { + return this.each(function() { jQuery(this)[ name ]( val.call(this), state ); }); + } + return this.each( fn, arguments ); }; }); jQuery.extend({ + attrFn: { + val: true, + addClass: true, + css: true, + html: true, + text: true, + append: true, + prepend: true, + data: true, + width: true, + height: true, + offset: true, + bind: true + }, + attr: function( elem, name, value ) { // don't set attributes on text and comment nodes if (!elem || elem.nodeType == 3 || elem.nodeType == 8) { return undefined; } - if ( name in jQuery.fn && name !== "attr" ) { + + if ( name in jQuery.attrFn && value !== undefined ) { return jQuery(elem)[name](value); } - + var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ), // Whether we are setting (or getting) set = value !== undefined; @@ -218,7 +252,13 @@ jQuery.extend({ if ( name == "type" && /(button|input)/i.test(elem.nodeName) && elem.parentNode ) { throw "type property can't be changed"; } - elem[ name ] = value; + // browsers index elements by id/name on forms, give priority to attributes. + if( jQuery.nodeName( elem, "form" ) ) { + // convert the value to a string (all browsers do this but IE) see #1070 + elem.setAttribute( name, "" + value ); + } else { + elem[ name ] = value; + } } // browsers index elements by id/name on forms, give priority to attributes.