Widget: Improve remove event bindings for classes options

Fixes #15078
Fixes #15082
Fixes #15095
Fixes #15136
Fixes #15152
Closes gh-1769
This commit is contained in:
Scott González 2016-11-16 14:42:34 -05:00
parent c426b9a203
commit ef2e9bab92

View File

@ -493,11 +493,29 @@ $.Widget.prototype = {
classes: this.options.classes || {} classes: this.options.classes || {}
}, options ); }, options );
function bindRemoveEvent() {
options.element.each( function( _, element ) {
var isTracked = $.map( that.classesElementLookup, function( elements ) {
return elements;
} )
.some( function( elements ) {
return elements.is( element );
} );
if ( !isTracked ) {
that._on( $( element ), {
remove: "_untrackClassesElement"
} );
}
} );
}
function processClassString( classes, checkOption ) { function processClassString( classes, checkOption ) {
var current, i; var current, i;
for ( i = 0; i < classes.length; i++ ) { for ( i = 0; i < classes.length; i++ ) {
current = that.classesElementLookup[ classes[ i ] ] || $(); current = that.classesElementLookup[ classes[ i ] ] || $();
if ( options.add ) { if ( options.add ) {
bindRemoveEvent();
current = $( $.unique( current.get().concat( options.element.get() ) ) ); current = $( $.unique( current.get().concat( options.element.get() ) ) );
} else { } else {
current = $( current.not( options.element ).get() ); current = $( current.not( options.element ).get() );
@ -510,10 +528,6 @@ $.Widget.prototype = {
} }
} }
this._on( options.element, {
"remove": "_untrackClassesElement"
} );
if ( options.keys ) { if ( options.keys ) {
processClassString( options.keys.match( /\S+/g ) || [], true ); processClassString( options.keys.match( /\S+/g ) || [], true );
} }
@ -531,6 +545,8 @@ $.Widget.prototype = {
that.classesElementLookup[ key ] = $( value.not( event.target ).get() ); that.classesElementLookup[ key ] = $( value.not( event.target ).get() );
} }
} ); } );
this._off( $( event.target ) );
}, },
_removeClass: function( element, keys, extra ) { _removeClass: function( element, keys, extra ) {
@ -611,7 +627,7 @@ $.Widget.prototype = {
_off: function( element, eventName ) { _off: function( element, eventName ) {
eventName = ( eventName || "" ).split( " " ).join( this.eventNamespace + " " ) + eventName = ( eventName || "" ).split( " " ).join( this.eventNamespace + " " ) +
this.eventNamespace; this.eventNamespace;
element.off( eventName ).off( eventName ); element.off( eventName );
// Clear the stack to avoid memory leaks (#10056) // Clear the stack to avoid memory leaks (#10056)
this.bindings = $( this.bindings.not( element ).get() ); this.bindings = $( this.bindings.not( element ).get() );