mirror of
https://github.com/jquery/jquery-ui.git
synced 2024-11-21 11:04:24 +00:00
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:
parent
c426b9a203
commit
ef2e9bab92
26
ui/widget.js
26
ui/widget.js
@ -493,11 +493,29 @@ $.Widget.prototype = {
|
||||
classes: this.options.classes || {}
|
||||
}, 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 ) {
|
||||
var current, i;
|
||||
for ( i = 0; i < classes.length; i++ ) {
|
||||
current = that.classesElementLookup[ classes[ i ] ] || $();
|
||||
if ( options.add ) {
|
||||
bindRemoveEvent();
|
||||
current = $( $.unique( current.get().concat( options.element.get() ) ) );
|
||||
} else {
|
||||
current = $( current.not( options.element ).get() );
|
||||
@ -510,10 +528,6 @@ $.Widget.prototype = {
|
||||
}
|
||||
}
|
||||
|
||||
this._on( options.element, {
|
||||
"remove": "_untrackClassesElement"
|
||||
} );
|
||||
|
||||
if ( options.keys ) {
|
||||
processClassString( options.keys.match( /\S+/g ) || [], true );
|
||||
}
|
||||
@ -531,6 +545,8 @@ $.Widget.prototype = {
|
||||
that.classesElementLookup[ key ] = $( value.not( event.target ).get() );
|
||||
}
|
||||
} );
|
||||
|
||||
this._off( $( event.target ) );
|
||||
},
|
||||
|
||||
_removeClass: function( element, keys, extra ) {
|
||||
@ -611,7 +627,7 @@ $.Widget.prototype = {
|
||||
_off: function( element, eventName ) {
|
||||
eventName = ( eventName || "" ).split( " " ).join( this.eventNamespace + " " ) +
|
||||
this.eventNamespace;
|
||||
element.off( eventName ).off( eventName );
|
||||
element.off( eventName );
|
||||
|
||||
// Clear the stack to avoid memory leaks (#10056)
|
||||
this.bindings = $( this.bindings.not( element ).get() );
|
||||
|
Loading…
Reference in New Issue
Block a user