@@ -391,13 +391,19 @@ jQuery.event = {
391391 delegateCount = handlers . delegateCount ,
392392 args = [ ] . slice . call ( arguments , 0 ) ,
393393 run_all = ! event . exclusive && ! event . namespace ,
394+ special = jQuery . event . special [ event . type ] || { } ,
394395 handlerQueue = [ ] ,
395396 i , j , cur , jqcur , ret , selMatch , matched , matches , handleObj , sel , related ;
396397
397398 // Use the fix-ed jQuery.Event rather than the (read-only) native event
398399 args [ 0 ] = event ;
399400 event . delegateTarget = this ;
400401
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+
401407 // Determine handlers that should run if there are delegated events
402408 // Avoid non-left-click bubbling in Firefox (#3861)
403409 if ( delegateCount && ! ( event . button && event . type === "click" ) ) {
@@ -407,7 +413,7 @@ jQuery.event = {
407413 jqcur . context = this . ownerDocument || this ;
408414
409415 for ( cur = event . target ; cur != this ; cur = cur . parentNode || this ) {
410-
416+
411417 // Don't process events on disabled elements (#6911, #8165)
412418 if ( cur . disabled !== true ) {
413419 selMatch = { } ;
@@ -467,6 +473,11 @@ jQuery.event = {
467473 }
468474 }
469475
476+ // Call the postDispatch hook for the mapped type
477+ if ( special . postDispatch ) {
478+ special . postDispatch . call ( this , event ) ;
479+ }
480+
470481 return event . result ;
471482 } ,
472483
@@ -758,16 +769,23 @@ if ( !jQuery.support.submitBubbles ) {
758769 form = jQuery . nodeName ( elem , "input" ) || jQuery . nodeName ( elem , "button" ) ? elem . form : undefined ;
759770 if ( form && ! form . _submit_attached ) {
760771 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 ;
765773 } ) ;
766774 form . _submit_attached = true ;
767775 }
768776 } ) ;
769777 // return undefined since we don't need an event listener
770778 } ,
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+ } ,
771789
772790 teardown : function ( ) {
773791 // Only need this for delegated form submit events
0 commit comments