From 4daae7a79f43815935a2890d16904c5a052717f3 Mon Sep 17 00:00:00 2001
From: jeresig <jeresig@gmail.com>
Date: Thu, 3 Dec 2009 10:51:04 -0500
Subject: [PATCH] No need to do the closest match if no selectors are passed
 in.

---
 src/event.js      |   49 +++++++++++++++++++++++++++++++++----------------
 src/traversing.js |    2 +-
 2 files changed, 34 insertions(+), 17 deletions(-)

diff --git a/src/event.js b/src/event.js
index 2bb8a0e..24e5ef1 100644
--- a/src/event.js
+++ b/src/event.js
@@ -749,13 +749,30 @@ jQuery.fn.extend({
 });
 
 function liveHandler( event ) {
-	var stop = true, elems = [], args = arguments;
+	var stop = true, elems = [], selectors = [], args = arguments,
+		related, match, fn, elem, j, i,
+		live = jQuery.extend({}, jQuery.data( this, "events" ).live);
 
-	jQuery.each( jQuery.data( this, "events" ).live || [], function( i, fn ) {
-		if ( fn.live === event.type ) {
-			var elem = jQuery( event.target ).closest( fn.selector, event.currentTarget )[0],
-				related;
-			if ( elem ) {
+	for ( j in live ) {
+		if ( live[j].live === event.type ) {
+			selectors.push( live[j].selector );
+		}
+	}
+
+	console.log( event.type, selectors+"" );
+
+	// TODO: Make sure that duplicate selectors aren't run
+	match = jQuery( event.target ).closest( selectors, event.currentTarget );
+
+	console.log( "match", match, selectors+"" );
+
+	for ( i = 0, l = match.length; i < l; i++ ) {
+		for ( j in live ) {
+			fn = live[j];
+			elem = match[i].elem;
+			related = null;
+
+			if ( match[i].selector === fn.selector) {
 				// Those two events require additional checking
 				if ( fn.live === "mouseenter" || fn.live === "mouseleave" ) {
 					related = jQuery( event.relatedTarget ).closest( fn.selector )[0];
@@ -766,19 +783,19 @@ function liveHandler( event ) {
 				}
 			}
 		}
-	});
+	}
 
-	elems.sort(function( a, b ) {
-		return a.closer - b.closer;
-	});
+	console.log( "elems", elems );
 
-	jQuery.each(elems, function() {
-		event.currentTarget = this.elem;
-		event.data = this.fn.data;
-		if ( this.fn.apply( this.elem, args ) === false ) {
-			return (stop = false);
+	for ( i = 0, l = elems.length; i < l; i++ ) {
+		match = elems[i];
+		event.currentTarget = match.elem;
+		event.data = match.fn.data;
+		if ( match.fn.apply( match.elem, args ) === false ) {
+			stop = false;
+			break;
 		}
-	});
+	}
 
 	return stop;
 }
diff --git a/src/traversing.js b/src/traversing.js
index 737efa4..796ae2f 100644
--- a/src/traversing.js
+++ b/src/traversing.js
@@ -58,7 +58,7 @@ jQuery.fn.extend({
 		if ( jQuery.isArray( selectors ) ) {
 			var ret = [], cur = this[0], selector;
 
-			if ( cur ) {
+			if ( cur && selectors.length ) {
 				for ( var i = 0, l = selectors.length; i < l; i++ ) {
 					selectors[i] = jQuery.expr.match.POS.test( selector ) ? 
 						jQuery( selector, context || this.context ) :
-- 
1.7.10.4