aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Methvin <dave.methvin@gmail.com>2011-09-21 21:15:00 -0400
committerDave Methvin <dave.methvin@gmail.com>2011-09-21 21:15:00 -0400
commita4cdbf09ee97471ec041d83ceb8f3feb9825b2a1 (patch)
tree339e5fb434835883fdaab89a4542ea77811ca0cf
parenta588336a6dcc6f29e870e8fcdd243f96bec5e833 (diff)
downloadjquery-a4cdbf09ee97471ec041d83ceb8f3feb9825b2a1.tar.gz
jquery-a4cdbf09ee97471ec041d83ceb8f3feb9825b2a1.zip
Fix #7061. Lazy-attach to the genuine submit event for delegation.
Avoids the problems that arise when we try to trigger submit behavior at clicky-time.
-rw-r--r--src/event.js27
1 files changed, 19 insertions, 8 deletions
diff --git a/src/event.js b/src/event.js
index 02c26dc23..ffb818d96 100644
--- a/src/event.js
+++ b/src/event.js
@@ -721,7 +721,7 @@ jQuery.each({
};
});
-// submit delegation
+// IE submit delegation
if ( !jQuery.support.submitBubbles ) {
jQuery.event.special.submit = {
@@ -731,23 +731,34 @@ if ( !jQuery.support.submitBubbles ) {
return false;
}
+ // Lazy-add a submit handler when a descendant form may potentially be submitted
jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+ // Node name check avoids a VML-related crash in IE (#9807)
var elem = e.target,
- type = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.type : "";
-
- // Do the elem.form check after type to avoid VML-related crash in IE (#9807)
- if ( (e.type === "click" && (type === "submit" || type === "image") && elem.form) ||
- (e.type === "keypress" && e.keyCode === 13 && (type === "text" || type === "password") && elem.form) ) {
- simulate( "submit", this, e );
+ form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+ if ( form && !form._submit_attached ) {
+ jQuery.event.add( form, "submit._submit", function( event ) {
+ // Form was submitted, bubble the event up the tree
+ if ( this.parentNode ) {
+ simulate( "submit", this.parentNode, event, true );
+ }
+ });
+ form._submit_attached = true;
}
});
+ // return undefined since we don't need an event listener
},
teardown: function() {
+ // Only need this for delegated form submit events
+ if ( jQuery.nodeName( this, "form" ) ) {
+ return false;
+ }
+
+ // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
jQuery.event.remove( this, "._submit" );
}
};
-
}
// IE change delegation and checkbox/radio fix