@@ -391,13 +391,19 @@ jQuery.event = {
391
391
delegateCount = handlers . delegateCount ,
392
392
args = [ ] . slice . call ( arguments , 0 ) ,
393
393
run_all = ! event . exclusive && ! event . namespace ,
394
+ special = jQuery . event . special [ event . type ] || { } ,
394
395
handlerQueue = [ ] ,
395
396
i , j , cur , jqcur , ret , selMatch , matched , matches , handleObj , sel , related ;
396
397
397
398
// Use the fix-ed jQuery.Event rather than the (read-only) native event
398
399
args [ 0 ] = event ;
399
400
event . delegateTarget = this ;
400
401
402
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
403
+ if ( special . preDispatch && special . preDispatch . call ( this , event ) === false ) {
404
+ return ;
405
+ }
406
+
401
407
// Determine handlers that should run if there are delegated events
402
408
// Avoid non-left-click bubbling in Firefox (#3861)
403
409
if ( delegateCount && ! ( event . button && event . type === "click" ) ) {
@@ -407,7 +413,7 @@ jQuery.event = {
407
413
jqcur . context = this . ownerDocument || this ;
408
414
409
415
for ( cur = event . target ; cur != this ; cur = cur . parentNode || this ) {
410
-
416
+
411
417
// Don't process events on disabled elements (#6911, #8165)
412
418
if ( cur . disabled !== true ) {
413
419
selMatch = { } ;
@@ -467,6 +473,11 @@ jQuery.event = {
467
473
}
468
474
}
469
475
476
+ // Call the postDispatch hook for the mapped type
477
+ if ( special . postDispatch ) {
478
+ special . postDispatch . call ( this , event ) ;
479
+ }
480
+
470
481
return event . result ;
471
482
} ,
472
483
@@ -758,16 +769,23 @@ if ( !jQuery.support.submitBubbles ) {
758
769
form = jQuery . nodeName ( elem , "input" ) || jQuery . nodeName ( elem , "button" ) ? elem . form : undefined ;
759
770
if ( form && ! form . _submit_attached ) {
760
771
jQuery . event . add ( form , "submit._submit" , function ( event ) {
761
- // If form was submitted by the user, bubble the event up the tree
762
- if ( this . parentNode && ! event . isTrigger ) {
763
- jQuery . event . simulate ( "submit" , this . parentNode , event , true ) ;
764
- }
772
+ event . _submit_bubble = true ;
765
773
} ) ;
766
774
form . _submit_attached = true ;
767
775
}
768
776
} ) ;
769
777
// return undefined since we don't need an event listener
770
778
} ,
779
+
780
+ postDispatch : function ( event ) {
781
+ // If form was submitted by the user, bubble the event up the tree
782
+ if ( event . _submit_bubble ) {
783
+ delete event . _submit_bubble ;
784
+ if ( this . parentNode && ! event . isTrigger ) {
785
+ jQuery . event . simulate ( "submit" , this . parentNode , event , true ) ;
786
+ }
787
+ }
788
+ } ,
771
789
772
790
teardown : function ( ) {
773
791
// Only need this for delegated form submit events
0 commit comments