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 || {}
|
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() );
|
||||||
|
Loading…
Reference in New Issue
Block a user