+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+/);
},
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+/);
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] + " ", " ");
}
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;
}
}
// Typecast once if the value is a number
if ( typeof value === "number" ) {
value += '';
- }
+ }
var val = value;
return this.each(function(){
// 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;
}
jQuery.each({
removeAttr: function( name ) {
jQuery.attr( this, name, "" );
- if (this.nodeType == 1) {
+ if ( this.nodeType === 1 ) {
this.removeAttribute( name );
}
},
}
}
}, 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,
+ css: true,
+ html: true,
+ text: true,
+ data: true,
+ width: true,
+ height: true,
+ offset: 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;
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.