From 9aa0c69c43bad9fce5ef7732692308afb2a38ec6 Mon Sep 17 00:00:00 2001 From: John Resig Date: Mon, 9 Feb 2009 23:29:57 +0000 Subject: Fixed bubbling of live events (if an inner element handles an event first - and stops progatation - then the parent event doesn't encounter the event). Thanks to Irae for the patch. Fixes bug #3980. --- src/core.js | 8 ++++++-- src/event.js | 6 +++++- 2 files changed, 11 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/core.js b/src/core.js index 3a9eaa7de..ac8ec6bc4 100644 --- a/src/core.js +++ b/src/core.js @@ -346,14 +346,18 @@ jQuery.fn = jQuery.prototype = { }, closest: function( selector ) { - var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null; + var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null, + closer = 0; return this.map(function(){ var cur = this; while ( cur && cur.ownerDocument ) { - if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) + if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) { + jQuery.data(cur, "closest", closer); return cur; + } cur = cur.parentNode; + closer++; } }); }, diff --git a/src/event.js b/src/event.js index a621eb93e..e707015c1 100644 --- a/src/event.js +++ b/src/event.js @@ -571,9 +571,13 @@ function liveHandler( event ){ } }); + elems.sort(function(a,b) { + return jQuery.data(a.elem, "closest") - jQuery.data(b.elem, "closest"); + }); + jQuery.each(elems, function(){ if ( this.fn.call(this.elem, event, this.fn.data) === false ) - stop = false; + return (stop = false); }); return stop; -- cgit v1.2.3