|
509 | 509 | classes: this.options.classes || {}
|
510 | 510 | }, options );
|
511 | 511 |
|
| 512 | + function bindRemoveEvent() { |
| 513 | + options.element.each( function( _, element ) { |
| 514 | + var isTracked = $.map( that.classesElementLookup, function( elements ) { |
| 515 | + return elements; |
| 516 | + } ) |
| 517 | + .some( function( elements ) { |
| 518 | + return elements.is( element ); |
| 519 | + } ); |
| 520 | + |
| 521 | + if ( !isTracked ) { |
| 522 | + that._on( $( element ), { |
| 523 | + remove: "_untrackClassesElement" |
| 524 | + } ); |
| 525 | + } |
| 526 | + } ); |
| 527 | + } |
| 528 | + |
512 | 529 | function processClassString( classes, checkOption ) {
|
513 | 530 | var current, i;
|
514 | 531 | for ( i = 0; i < classes.length; i++ ) {
|
515 | 532 | current = that.classesElementLookup[ classes[ i ] ] || $();
|
516 | 533 | if ( options.add ) {
|
| 534 | + bindRemoveEvent(); |
517 | 535 | current = $( $.unique( current.get().concat( options.element.get() ) ) );
|
518 | 536 | } else {
|
519 | 537 | current = $( current.not( options.element ).get() );
|
|
526 | 544 | }
|
527 | 545 | }
|
528 | 546 |
|
529 |
| - this._on( options.element, { |
530 |
| - "remove": "_untrackClassesElement" |
531 |
| - } ); |
532 |
| - |
533 | 547 | if ( options.keys ) {
|
534 | 548 | processClassString( options.keys.match( /\S+/g ) || [], true );
|
535 | 549 | }
|
|
547 | 561 | that.classesElementLookup[ key ] = $( value.not( event.target ).get() );
|
548 | 562 | }
|
549 | 563 | } );
|
| 564 | + |
| 565 | + this._off( $( event.target ) ); |
550 | 566 | },
|
551 | 567 |
|
552 | 568 | _removeClass: function( element, keys, extra ) {
|
|
627 | 643 | _off: function( element, eventName ) {
|
628 | 644 | eventName = ( eventName || "" ).split( " " ).join( this.eventNamespace + " " ) +
|
629 | 645 | this.eventNamespace;
|
630 |
| - element.off( eventName ).off( eventName ); |
| 646 | + element.off( eventName ); |
631 | 647 |
|
632 | 648 | // Clear the stack to avoid memory leaks (#10056)
|
633 | 649 | this.bindings = $( this.bindings.not( element ).get() );
|
|
0 commit comments