| define( [ |
| "../core", |
| "../core/stripAndCollapse", |
| "../var/isFunction", |
| "../var/rnothtmlwhite", |
| "../data/var/dataPriv", |
| "../core/init" |
| ], function( jQuery, stripAndCollapse, isFunction, rnothtmlwhite, dataPriv ) { |
| |
| "use strict"; |
| |
| function getClass( elem ) { |
| return elem.getAttribute && elem.getAttribute( "class" ) || ""; |
| } |
| |
| function classesToArray( value ) { |
| if ( Array.isArray( value ) ) { |
| return value; |
| } |
| if ( typeof value === "string" ) { |
| return value.match( rnothtmlwhite ) || []; |
| } |
| return []; |
| } |
| |
| jQuery.fn.extend( { |
| addClass: function( value ) { |
| var classes, elem, cur, curValue, clazz, j, finalValue, |
| i = 0; |
| |
| if ( isFunction( value ) ) { |
| return this.each( function( j ) { |
| jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); |
| } ); |
| } |
| |
| classes = classesToArray( value ); |
| |
| if ( classes.length ) { |
| while ( ( elem = this[ i++ ] ) ) { |
| curValue = getClass( elem ); |
| cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); |
| |
| if ( cur ) { |
| j = 0; |
| while ( ( clazz = classes[ j++ ] ) ) { |
| if ( cur.indexOf( " " + clazz + " " ) < 0 ) { |
| cur += clazz + " "; |
| } |
| } |
| |
| // Only assign if different to avoid unneeded rendering. |
| finalValue = stripAndCollapse( cur ); |
| if ( curValue !== finalValue ) { |
| elem.setAttribute( "class", finalValue ); |
| } |
| } |
| } |
| } |
| |
| return this; |
| }, |
| |
| removeClass: function( value ) { |
| var classes, elem, cur, curValue, clazz, j, finalValue, |
| i = 0; |
| |
| if ( isFunction( value ) ) { |
| return this.each( function( j ) { |
| jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); |
| } ); |
| } |
| |
| if ( !arguments.length ) { |
| return this.attr( "class", "" ); |
| } |
| |
| classes = classesToArray( value ); |
| |
| if ( classes.length ) { |
| while ( ( elem = this[ i++ ] ) ) { |
| curValue = getClass( elem ); |
| |
| // This expression is here for better compressibility (see addClass) |
| cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); |
| |
| if ( cur ) { |
| j = 0; |
| while ( ( clazz = classes[ j++ ] ) ) { |
| |
| // Remove *all* instances |
| while ( cur.indexOf( " " + clazz + " " ) > -1 ) { |
| cur = cur.replace( " " + clazz + " ", " " ); |
| } |
| } |
| |
| // Only assign if different to avoid unneeded rendering. |
| finalValue = stripAndCollapse( cur ); |
| if ( curValue !== finalValue ) { |
| elem.setAttribute( "class", finalValue ); |
| } |
| } |
| } |
| } |
| |
| return this; |
| }, |
| |
| toggleClass: function( value, stateVal ) { |
| var type = typeof value, |
| isValidValue = type === "string" || Array.isArray( value ); |
| |
| if ( typeof stateVal === "boolean" && isValidValue ) { |
| return stateVal ? this.addClass( value ) : this.removeClass( value ); |
| } |
| |
| if ( isFunction( value ) ) { |
| return this.each( function( i ) { |
| jQuery( this ).toggleClass( |
| value.call( this, i, getClass( this ), stateVal ), |
| stateVal |
| ); |
| } ); |
| } |
| |
| return this.each( function() { |
| var className, i, self, classNames; |
| |
| if ( isValidValue ) { |
| |
| // Toggle individual class names |
| i = 0; |
| self = jQuery( this ); |
| classNames = classesToArray( value ); |
| |
| while ( ( className = classNames[ i++ ] ) ) { |
| |
| // Check each className given, space separated list |
| if ( self.hasClass( className ) ) { |
| self.removeClass( className ); |
| } else { |
| self.addClass( className ); |
| } |
| } |
| |
| // Toggle whole class name |
| } else if ( value === undefined || type === "boolean" ) { |
| className = getClass( this ); |
| if ( className ) { |
| |
| // Store className if set |
| dataPriv.set( this, "__className__", className ); |
| } |
| |
| // If the element has a class name or if we're passed `false`, |
| // then remove the whole classname (if there was one, the above saved it). |
| // Otherwise bring back whatever was previously saved (if anything), |
| // falling back to the empty string if nothing was stored. |
| if ( this.setAttribute ) { |
| this.setAttribute( "class", |
| className || value === false ? |
| "" : |
| dataPriv.get( this, "__className__" ) || "" |
| ); |
| } |
| } |
| } ); |
| }, |
| |
| hasClass: function( selector ) { |
| var className, elem, |
| i = 0; |
| |
| className = " " + selector + " "; |
| while ( ( elem = this[ i++ ] ) ) { |
| if ( elem.nodeType === 1 && |
| ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { |
| return true; |
| } |
| } |
| |
| return false; |
| } |
| } ); |
| |
| } ); |