Bug Tracker

Ticket #3980: live_ordering.diff

File live_ordering.diff, 3.2 KB (added by iraebrasil, 10 years ago)

sort live handlers to mimic natural propagation

  • test/unit/event.js

     
    474474});
    475475
    476476test(".live()/.die()", function() {
    477         expect(42);
     477        expect(46);
    478478
    479479        var submit = 0, div = 0, livea = 0, liveb = 0;
    480480
     
    611611       
    612612        // Cleanup
    613613        jQuery("#nothiddendivchild").die("click");
     614
     615        // Verify that .live() ocurs and cancel buble in the same order as
     616        // we would expect .bind() and .click() without delegation
     617        var lived = 0, livee = 0;
     618       
     619        // bind one pair in one order
     620        jQuery('span#liveSpan1 a').live('click', function(){ lived++; return false; });
     621        jQuery('span#liveSpan1').live('click', function(){      livee++; });
     622
     623        jQuery('span#liveSpan1 a').click();
     624        equals( lived, 1, "Verify that only one first handler occurred." );
     625        equals( livee, 0, "Verify that second handler don't." );
     626
     627        // and one pair in inverse
     628        jQuery('#liveHandlerOrder span#liveSpan2').live('click', function(){    livee++; });
     629        jQuery('#liveHandlerOrder span#liveSpan2 a').live('click', function(){ lived++; return false; });
     630
     631        jQuery('span#liveSpan2 a').click();
     632        equals( lived, 2, "Verify that only one first handler occurred." );
     633        equals( livee, 0, "Verify that second handler don't." );
     634       
     635        // Cleanup
     636        jQuery("span#liveSpan1 a, span#liveSpan1, span#liveSpan2 a, span#liveSpan2").die("click");
    614637});
    615638
    616639/*
  • test/index.html

     
    213213                        <span>...</span><a id="linkWithNoHrefWithTabIndex" tabindex="1">Eat some funyuns</a><span>...</span>
    214214                        <span>...</span><a id="linkWithNoHrefWithNegativeTabIndex" tabindex="-1">Eat some funyuns</a><span>...</span>
    215215                </div>
     216               
     217                <div id="liveHandlerOrder">
     218                        <span id="liveSpan1"><a href="#"></a></span>
     219                        <span id="liveSpan2"><a href="#"></a></span>
     220                </div>
    216221        </div>
    217222        </dl>
    218223       
  • src/core.js

     
    342342        },
    343343
    344344        closest: function( selector ) {
    345                 var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null;
     345                var closer = 0, pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null;
    346346
    347347                return this.map(function(){
    348348                        var cur = this;
    349349                        while ( cur && cur.ownerDocument ) {
    350                                 if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) )
     350                                if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) {
     351                                        jQuery(cur).data('howClose',closer);
    351352                                        return cur;
     353                                }
    352354                                cur = cur.parentNode;
     355                                closer++;
    353356                        }
    354357                });
    355358        },
  • src/event.js

     
    571571                }
    572572        });
    573573
     574        elems.sort(function(a,b) {
     575                return jQuery(a.elem).data('howClose') - jQuery(b.elem).data('howClose');
     576        });
     577       
    574578        jQuery.each(elems, function(){
    575                 if ( this.fn.call(this.elem, event, this.fn.data) === false )
    576                         stop = false;
     579                if ( this.fn.call(this.elem, event, this.fn.data) === false ) {
     580                        return stop = false;;
     581                }
    577582        });
    578583
    579584        return stop;