Bug Tracker

Ticket #3379: bubble.patch

File bubble.patch, 3.0 KB (added by danwrong, 7 years ago)

Version of patch where tests clean up after themselves

  • test/unit/event.js

     
    346346                start();
    347347        }).click();
    348348});
     349
     350test("custom event bubbling", function() {
     351  expect(6);
     352 
     353  jQuery(document).bind('acustomevent', function(e) {
     354    ok(false, 'customevent should not bubble to document as a previous handler returned false');
     355  });
     356 
     357  jQuery('#main').bind('acustomevent', function(e, data) {
     358    ok(true, 'acustomevent has bubbled to the parent element');
     359    equals(e.target, jQuery('#firstp')[0], 'target is the original element that triggered the event');
     360    equals(e.type, 'acustomevent', 'event type is preserved in bubble');
     361    equals(data, 5, 'data is bubbled up with event');
     362    return false;
     363  });
     364 
     365  jQuery('#firstp').trigger('acustomevent', 5);
     366 
     367  jQuery(document).bind('anothercustomevent', function(e) {
     368    ok(false, 'anothercustomevent should not bubble to document');
     369  });
     370 
     371  jQuery('#main').bind('anothercustomevent', function(e) {
     372    ok(true, 'anothercustomevent has bubbled to the parent element as a previous handler called stopPropagation');
     373    e.stopPropagation();
     374  });
     375 
     376  jQuery('#firstp').trigger('anothercustomevent');
     377 
     378  jQuery(document).bind('onemorecustomevent', function() {
     379    ok(true, 'onemorecustomevent still bubbles to document even if no handler bound to original target');
     380  });
     381 
     382  jQuery('#firstp').trigger('onemorecustomevent');
     383 
     384  jQuery(document).unbind('acustomevent');
     385  jQuery(document).unbind('anothercustomevent');
     386  jQuery(document).unbind('onemorecustomevent');
     387  jQuery('#main').unbind('acustomevent');
     388  jQuery('#main').unbind('anothercustomevent');
     389});
  • src/event.js

     
    188188                                data.unshift({
    189189                                        type: type,
    190190                                        target: elem,
    191                                         preventDefault: function(){},
    192                                         stopPropagation: function(){},
     191                                        preventDefault: function(){ this._preventDefault = true },
     192                                        stopPropagation: function(){ this._stopPropagation = true },
    193193                                        timeStamp: now()
    194194                                });
    195195                                data[0][expando] = true; // no need to fix fake event
     
    202202
    203203                        // Trigger the event, it is assumed that "handle" is a function
    204204                        var handle = jQuery.data(elem, "handle");
    205                         if ( handle )
    206                                 val = handle.apply( elem, data );
     205                       
     206                        if ( handle )
     207                          val = handle.apply( elem, data );
     208                       
     209                        // handle the bubble if need be
     210                  if (data[0]._stopPropagation !== true && val !== false && elem.parentNode)
     211                    jQuery.event.trigger( type, data, elem.parentNode );
     212                   
     213                  if (data[0]._preventDefault === true) donative == false;
    207214
    208215                        // Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
    209216                        if ( (!fn || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )