When a native browser event is bubbling up the DOM, make sure that the correct isDefa...
authorDave Methvin <dave.methvin@gmail.com>
Mon, 27 Dec 2010 19:30:05 +0000 (13:30 -0600)
committerColin Snover <github.com@zetafleet.com>
Mon, 27 Dec 2010 19:30:05 +0000 (13:30 -0600)
src/event.js
test/unit/event.js

index fd470e7..c904734 100644 (file)
@@ -600,6 +600,12 @@ jQuery.Event = function( src ) {
        if ( src && src.type ) {
                this.originalEvent = src;
                this.type = src.type;
+
+               // Events bubbling up the document may have been marked as prevented
+               // by a handler lower down the tree; reflect the correct value.
+               this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false ||
+                       src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse;
+
        // Event type
        } else {
                this.type = src;
index a647e5f..83f6096 100644 (file)
@@ -295,6 +295,41 @@ test("live/delegate immediate propagation", function() {
        $p.undelegate( "click" );
 });
 
+test("bind/delegate bubbling, isDefaultPrevented (Bug #7793)", function() {
+       expect(2);
+       var $anchor2 = jQuery( "#anchor2" ),
+               $main = jQuery( "#main" ),
+               fakeClick = function($jq) {
+                       // Use a native click so we don't get jQuery simulated bubbling
+                       if ( document.createEvent ) {
+                               var e = document.createEvent( "MouseEvents" );
+                               e.initEvent( "click", true, true ); 
+                               $jq[0].dispatchEvent(e);
+                       }
+                       else if ( $jq[0].click ) {
+                               $jq[0].click(); // IE
+                       }
+               };
+       $anchor2.click(function(e) {
+               e.preventDefault();
+       });
+       $main.delegate("#foo", "click", function(e) {
+               equals( e.isDefaultPrevented(), true, "isDefaultPrevented true passed to bubbled event" );
+       });
+       fakeClick( $anchor2 );
+       $anchor2.unbind( "click" );
+       $main.undelegate( "click" );
+       $anchor2.click(function(e) {
+               // Let the default action occur
+       });
+       $main.delegate("#foo", "click", function(e) {
+               equals( e.isDefaultPrevented(), false, "isDefaultPrevented false passed to bubbled event" );
+       });
+       fakeClick( $anchor2 );
+       $anchor2.unbind( "click" );
+       $main.undelegate( "click" );
+});
+
 test("bind(), iframes", function() {
        // events don't work with iframes, see #939 - this test fails in IE because of contentDocument
        var doc = jQuery("#loadediframe").contents();