aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Methvin <dave.methvin@gmail.com>2011-02-09 21:25:29 -0500
committerAnton M <obhvsbypqghgc@gmail.com>2011-02-15 22:08:39 +0100
commit12c0e1a692aa045e9d3cf166a41748d7f5fe31cc (patch)
treecc241a4b34037089d930883d7cd0a28bf5ba4400
parent1ddfdabbb983e2d3bf7f7200a3da5051f274e6fe (diff)
downloadjquery-12c0e1a692aa045e9d3cf166a41748d7f5fe31cc.tar.gz
jquery-12c0e1a692aa045e9d3cf166a41748d7f5fe31cc.zip
Fixes #7922. Copy the donor event when simulating a bubbling submit in IE so that we don't accidentally stop propagation on it. Remove a bunch of return statements that could also cancel the event. DRY out the liveFired change from #6359 by moving it to the trigger() function.
-rw-r--r--src/event.js26
-rw-r--r--test/unit/event.js11
2 files changed, 28 insertions, 9 deletions
diff --git a/src/event.js b/src/event.js
index a15603fc1..758c8f560 100644
--- a/src/event.js
+++ b/src/event.js
@@ -709,8 +709,7 @@ if ( !jQuery.support.submitBubbles ) {
type = elem.type;
if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
- e.liveFired = undefined;
- return trigger( "submit", this, arguments );
+ trigger( "submit", this, arguments );
}
});
@@ -719,8 +718,7 @@ if ( !jQuery.support.submitBubbles ) {
type = elem.type;
if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
- e.liveFired = undefined;
- return trigger( "submit", this, arguments );
+ trigger( "submit", this, arguments );
}
});
@@ -783,7 +781,7 @@ if ( !jQuery.support.changeBubbles ) {
if ( data != null || val ) {
e.type = "change";
e.liveFired = undefined;
- return jQuery.event.trigger( e, arguments[1], elem );
+ jQuery.event.trigger( e, arguments[1], elem );
}
};
@@ -797,7 +795,7 @@ if ( !jQuery.support.changeBubbles ) {
var elem = e.target, type = elem.type;
if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) {
- return testChange.call( this, e );
+ testChange.call( this, e );
}
},
@@ -809,7 +807,7 @@ if ( !jQuery.support.changeBubbles ) {
if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") ||
(e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
type === "select-multiple" ) {
- return testChange.call( this, e );
+ testChange.call( this, e );
}
},
@@ -848,8 +846,18 @@ if ( !jQuery.support.changeBubbles ) {
}
function trigger( type, elem, args ) {
- args[0].type = type;
- return jQuery.event.handle.apply( elem, args );
+ // Piggyback on a donor event to simulate a different one.
+ // Fake originalEvent to avoid donor's stopPropagation, but if the
+ // simulated event prevents default then we do the same on the donor.
+ // Don't pass args or remember liveFired; they apply to the donor event.
+ var event = jQuery.extend( {}, args[ 0 ] );
+ event.type = type;
+ event.originalEvent = {};
+ event.liveFired = undefined;
+ jQuery.event.handle.call( elem, event );
+ if ( event.isDefaultPrevented() ) {
+ args[ 0 ].preventDefault();
+ }
}
// Create "bubbling" focus and blur events
diff --git a/test/unit/event.js b/test/unit/event.js
index 8d69807e5..6b78a2495 100644
--- a/test/unit/event.js
+++ b/test/unit/event.js
@@ -1455,6 +1455,8 @@ test("live with change", function(){
});
test("live with submit", function() {
+ expect(5);
+
var count1 = 0, count2 = 0;
jQuery("#testForm").live("submit", function(ev) {
@@ -1471,7 +1473,16 @@ test("live with submit", function() {
equals( count1, 1, "Verify form submit." );
equals( count2, 1, "Verify body submit." );
+ jQuery("#testForm input[name=sub1]").live("click", function(ev) {
+ ok( true, "cancelling submit still calls click handler" );
+ });
+
+ jQuery("#testForm input[name=sub1]")[0].click();
+ equals( count1, 2, "Verify form submit." );
+ equals( count2, 2, "Verify body submit." );
+
jQuery("#testForm").die("submit");
+ jQuery("#testForm input[name=sub1]").die("click");
jQuery("body").die("submit");
});