Bug Tracker

Ticket #3379: bubble.patch

File bubble.patch, 3.0 KB (added by danwrong, 6 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 )