From 600d3145386a9dca8143918cc3e339168f886a63 Mon Sep 17 00:00:00 2001 From: jeresig Date: Wed, 6 Jan 2010 15:08:07 -0500 Subject: [PATCH] A first pass at making sure that all the setter function arguments receive the index of the element and a relevant value to work with. Fixes #5763. --- src/attributes.js | 114 ++++++++++++++++++++++++++++----------------------- src/core.js | 2 +- src/manipulation.js | 16 ++++---- 3 files changed, 72 insertions(+), 60 deletions(-) diff --git a/src/attributes.js b/src/attributes.js index a2108fe..664a024 100644 --- a/src/attributes.js +++ b/src/attributes.js @@ -12,10 +12,27 @@ jQuery.fn.extend({ return 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)) ); + }); + } + + return this.each(function(){ + jQuery.attr( this, name, "" ); + if ( this.nodeType === 1 ) { + this.removeAttribute( name ); + } + }); + }, + addClass: function( value ) { if ( jQuery.isFunction(value) ) { - return this.each(function() { - jQuery(this).addClass( value.call(this) ); + return this.each(function(i) { + var self = jQuery(this); + self.addClass( value.call(this, i, self.attr("class")) ); }); } @@ -46,8 +63,9 @@ jQuery.fn.extend({ removeClass: function( value ) { if ( jQuery.isFunction(value) ) { - return this.each(function() { - jQuery(this).removeClass( value.call(this) ); + return this.each(function(i) { + var self = jQuery(this); + self.removeClass( value.call(this, i, self.attr("class")) ); }); } @@ -75,6 +93,40 @@ jQuery.fn.extend({ return this; }, + toggleClass: function( classNames, state ) { + var type = typeof classNames; + + if ( jQuery.isFunction( classNames ) ) { + return this.each(function(i) { + var self = jQuery(this); + self.toggleClass( classNames.call(this, i, self.attr("class")), state ); + }); + } + + return this.each(function(){ + if ( type === "string" ) { + // toggle individual class names + var isBool = typeof state === "boolean", className, i = 0, + classNames = classNames.split( rspace ); + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space seperated list + state = isBool ? state : !jQuery(this).hasClass( className ); + jQuery(this)[ state ? "addClass" : "removeClass" ]( className ); + } + + } else if ( type === "undefined" || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery.data( this, "__className__", this.className ); + } + + // toggle whole className + this.className = this.className || classNames === false ? "" : jQuery.data( this, "__className__" ) || ""; + } + }); + }, + hasClass: function( selector ) { var className = " " + selector + " "; for ( var i = 0, l = this.length; i < l; i++ ) { @@ -149,9 +201,11 @@ jQuery.fn.extend({ var val = value; - return this.each(function() { + return this.each(function(i) { + var self = jQuery(this); + if ( jQuery.isFunction(value) ) { - val = value.call(this); + val = value.call(this, i, self.val()); // Typecast each time if the value is a Function and the appended // value is therefore different each time. @@ -165,13 +219,13 @@ jQuery.fn.extend({ } if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) { - this.checked = jQuery.inArray( jQuery(this).val(), val ) >= 0; + this.checked = jQuery.inArray( self.val(), val ) >= 0; } else if ( jQuery.nodeName( this, "select" ) ) { var values = jQuery.makeArray(val); jQuery( "option", this ).each(function() { - this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + this.selected = jQuery.inArray( self.val(), values ) >= 0; }); if ( !values.length ) { @@ -185,50 +239,6 @@ jQuery.fn.extend({ } }); -jQuery.each({ - removeAttr: function( name ) { - jQuery.attr( this, name, "" ); - if ( this.nodeType === 1 ) { - this.removeAttribute( name ); - } - }, - - toggleClass: function( classNames, state ) { - var type = typeof classNames; - - if ( type === "string" ) { - // toggle individual class names - var isBool = typeof state === "boolean", className, i = 0, - classNames = classNames.split( rspace ); - - while ( (className = classNames[ i++ ]) ) { - // check each className given, space seperated list - state = isBool ? state : !jQuery(this).hasClass( className ); - jQuery(this)[ state ? "addClass" : "removeClass" ]( className ); - } - - } else if ( type === "undefined" || type === "boolean" ) { - if ( this.className ) { - // store className if set - jQuery.data( this, "__className__", this.className ); - } - - // toggle whole className - this.className = this.className || classNames === false ? "" : jQuery.data( this, "__className__" ) || ""; - } - } -}, function( name, fn ) { - 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, diff --git a/src/core.js b/src/core.js index 58cbbc7..831570e 100644 --- a/src/core.js +++ b/src/core.js @@ -775,7 +775,7 @@ function access( elems, key, value, exec, fn, pass ) { exec = exec && jQuery.isFunction(value); for ( var i = 0; i < length; i++ ) { - fn( elems[i], key, exec ? value.call( elems[i], i ) : value, pass ); + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); } return elems; diff --git a/src/manipulation.js b/src/manipulation.js index 2af2d7e..730dfca 100644 --- a/src/manipulation.js +++ b/src/manipulation.js @@ -33,8 +33,9 @@ if ( !jQuery.support.htmlSerialize ) { jQuery.fn.extend({ text: function( text ) { if ( jQuery.isFunction(text) ) { - return this.each(function() { - return jQuery(this).text( text.call(this) ); + return this.each(function(i) { + var self = jQuery(this); + return self.text( text.call(this, i, self.text()) ); }); } @@ -47,8 +48,8 @@ jQuery.fn.extend({ wrapAll: function( html ) { if ( jQuery.isFunction( html ) ) { - return this.each(function() { - jQuery(this).wrapAll( html.apply(this, arguments) ); + return this.each(function(i) { + jQuery(this).wrapAll( html.call(this, i) ); }); } @@ -228,9 +229,10 @@ jQuery.fn.extend({ var results, first, value = args[0], scripts = []; if ( jQuery.isFunction(value) ) { - return this.each(function() { - args[0] = value.call(this); - return jQuery(this).domManip( args, table, callback ); + return this.each(function(i) { + var self = jQuery(this); + args[0] = value.call(this, i, table ? self.html() : undefined); + return self.domManip( args, table, callback ); }); } -- 1.7.10.4