Landed a fix for when a DOM element gets accidentally removed by another live event handler. Thanks to Irae for the patches. Fixed #3820.
This commit is contained in:
parent
29bf601f34
commit
b1018cad12
16
src/event.js
16
src/event.js
|
@ -560,15 +560,23 @@ jQuery.fn.extend({
|
||||||
|
|
||||||
function liveHandler( event ){
|
function liveHandler( event ){
|
||||||
var check = RegExp("(^|\\.)" + event.type + "(\\.|$)"),
|
var check = RegExp("(^|\\.)" + event.type + "(\\.|$)"),
|
||||||
stop = true;
|
stop = true,
|
||||||
|
elems = [];
|
||||||
|
|
||||||
jQuery.each(jQuery.data(this, "events").live || [], function(i, fn){
|
jQuery.each(jQuery.data(this, "events").live || [], function(i, fn){
|
||||||
if ( !event.isImmediatePropagationStopped() && check.test(fn.type) ) {
|
if ( check.test(fn.type) ) {
|
||||||
var elem = jQuery(event.target).closest(fn.data)[0];
|
var elem = jQuery(event.target).closest(fn.data)[0];
|
||||||
if ( elem && fn.call(elem, event, fn.data) === false )
|
if ( elem )
|
||||||
stop = false;
|
elems.push({ elem: elem, fn: fn });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
jQuery.each(elems, function(){
|
||||||
|
if ( !event.isImmediatePropagationStopped() &&
|
||||||
|
this.fn.call(this.elem, event, this.fn.data) === false )
|
||||||
|
stop = false;
|
||||||
|
});
|
||||||
|
|
||||||
return stop;
|
return stop;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -474,7 +474,7 @@ test("toggle(Function, Function, ...)", function() {
|
||||||
});
|
});
|
||||||
|
|
||||||
test(".live()/.die()", function() {
|
test(".live()/.die()", function() {
|
||||||
expect(36);
|
expect(38);
|
||||||
|
|
||||||
var submit = 0, div = 0, livea = 0, liveb = 0;
|
var submit = 0, div = 0, livea = 0, liveb = 0;
|
||||||
|
|
||||||
|
@ -588,6 +588,20 @@ test(".live()/.die()", function() {
|
||||||
|
|
||||||
// Cleanup
|
// Cleanup
|
||||||
jQuery("#nothiddendiv").die("foo", callback);
|
jQuery("#nothiddendiv").die("foo", callback);
|
||||||
|
|
||||||
|
// Make sure we don't loose the target by DOM modifications
|
||||||
|
// after the bubble already reached the liveHandler
|
||||||
|
var livec = 0, elemDiv = jQuery("#nothiddendivchild").html('<span></span>').get(0);
|
||||||
|
|
||||||
|
jQuery("#nothiddendivchild").live("click", function(e){ jQuery("#nothiddendivchild").html(''); });
|
||||||
|
jQuery("#nothiddendivchild").live("click", function(e){ if(e.target) {livec++;} });
|
||||||
|
|
||||||
|
jQuery("#nothiddendiv span").click();
|
||||||
|
equals( jQuery("#nothiddendiv span").length, 0, "Verify that first handler occurred and modified the DOM." );
|
||||||
|
equals( livec, 1, "Verify that second handler occurred even with nuked target." );
|
||||||
|
|
||||||
|
// Cleanup
|
||||||
|
jQuery("#nothiddendivchild").die("click");
|
||||||
});
|
});
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue