From: Irae Brasil Date: Sat, 23 Jan 2010 16:56:24 +0000 (-0500) Subject: Added support for multiple live event handlers, live hover, and live focus/blur ... X-Git-Url: http://git.asbjorn.biz/?p=jquery.git;a=commitdiff_plain;h=01f72026ec939e87da85a7afc1a5262872ea3ce5 Added support for multiple live event handlers, live hover, and live focus/blur (mapped to focusin/focusout). Fixes #5804, #5801, #5852. --- diff --git a/src/event.js b/src/event.js index 31ab8a3..0128dc5 100644 --- a/src/event.js +++ b/src/event.js @@ -838,23 +838,38 @@ jQuery.fn.extend({ hover: function( fnOver, fnOut ) { return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); - }, + } +}); + +jQuery.each(["live", "die"], function( i, name ) { + jQuery.fn[ name ] = function( types, data, fn ) { + var type, i = 0; - live: function( type, data, fn ) { if ( jQuery.isFunction( data ) ) { fn = data; data = undefined; } - jQuery( this.context ).bind( liveConvert( type, this.selector ), { - data: data, selector: this.selector, live: type - }, fn ); + types = types.split( /\s+/ ); - return this; - }, + while ( (type = types[ i++ ]) ) { + type = type === "focus" ? "focusin" : // focus --> focusin + type === "blur" ? "focusout" : // blur --> focusout + type === "hover" ? types.push("mouseleave") && "mouseenter" : // hover support + type; + + if ( name === "live" ) { + // bind live handler + jQuery( this.context ).bind( liveConvert( type, this.selector ), { + data: data, selector: this.selector, live: type + }, fn ); - die: function( type, fn ) { - jQuery( this.context ).unbind( liveConvert( type, this.selector ), fn ? { guid: fn.guid + this.selector + type } : null ); + } else { + // unbind live handler + jQuery( this.context ).unbind( liveConvert( type, this.selector ), fn ? { guid: fn.guid + this.selector + type } : null ); + } + } + return this; } }); diff --git a/test/delegatetest.html b/test/delegatetest.html index 7b35c8e..5e2cd82 100644 --- a/test/delegatetest.html +++ b/test/delegatetest.html @@ -83,6 +83,7 @@ RADIO TEXT TEXTAREA + DOCUMENT Focusout: @@ -92,6 +93,25 @@ RADIO TEXT TEXTAREA + DOCUMENT + + + Live Focus: + SELECT + MULTI + CHECKBOX + RADIO + TEXT + TEXTAREA + + + Live Blur: + SELECT + MULTI + CHECKBOX + RADIO + TEXT + TEXTAREA

Submit Tests

@@ -136,6 +156,12 @@ jQuery(id + "blur").blink(); }); + this.bind("focus", function(){ + jQuery(id + "lfocus").blink(); + }).bind("blur", function(){ + jQuery(id + "lblur").blink(); + }); + return this.bind("change", function(e){ jQuery(id + "bind").blink(); }).live("change", function(e){ @@ -163,7 +189,23 @@ next(); }); }; + + $(document).bind("focusin", function() { + jQuery("#boundFocus").blink(); + }); + $(document).bind("focusout", function() { + jQuery("#boundBlur").blink(); + }); + + $("td.red").live("hover", function(e) { + if ( e.type === "mouseenter" ) { + $(this).css("backgroundColor","green"); + } else { + $(this).css("backgroundColor",""); + } + }); + $(".select_test").addChangeTest("#select"); $(".mselect_test").addChangeTest("#mselect"); $(".checkbox_test").addChangeTest("#checkbox"); diff --git a/test/unit/event.js b/test/unit/event.js index 5518c3d..799851d 100644 --- a/test/unit/event.js +++ b/test/unit/event.js @@ -864,6 +864,20 @@ test(".live()/.die()", function() { jQuery("#nothiddendiv div").die("click"); }); +test("live with multiple events", function(){ + expect(1); + + var count = 0; + var div = jQuery("div#nothiddendivchild") + + div.live("click submit", function(){ count++; }); + + div.trigger("click"); + div.trigger("submit"); + + equals( count, 2, "Make sure both the click and submit were triggered." ); +}); + test("live with change", function(){ var selectChange = 0, checkboxChange = 0;