From 9ebb2fc654d51244618e208705e2258fe733058f Mon Sep 17 00:00:00 2001 From: Ariel Flesler Date: Wed, 16 Sep 2009 02:19:18 +0000 Subject: [PATCH] jquery event: closes #5250. bind(), unbind() and one() support Object Literals (needs some refactor though) --- src/event.js | 25 +++++++++++++++++++++++++ test/unit/event.js | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+) diff --git a/src/event.js b/src/event.js index c3c978b..76b1dfb 100644 --- a/src/event.js +++ b/src/event.js @@ -564,7 +564,16 @@ jQuery.each({ }); jQuery.fn.extend({ + // TODO: make bind(), unbind() and one() DRY! bind: function( type, data, fn, thisObject ) { + // Handle object literals + if ( typeof type === "object" ) { + for ( var key in type ) { + this.bind(key, data, type[key], fn); + } + return this; + } + if ( jQuery.isFunction( data ) ) { thisObject = fn; fn = data; @@ -577,6 +586,14 @@ jQuery.fn.extend({ }, one: function( type, data, fn, thisObject ) { + // Handle object literals + if ( typeof type === "object" ) { + for ( var key in type ) { + this.one(key, data, type[key], fn); + } + return this; + } + if ( jQuery.isFunction( data ) ) { thisObject = fn; fn = data; @@ -593,6 +610,14 @@ jQuery.fn.extend({ }, unbind: function( type, fn ) { + // Handle object literals + if ( typeof type === "object" && !type.preventDefault ) { + for ( var key in type ) { + this.unbind(key, type[key]); + } + return this; + } + return this.each(function() { jQuery.event.remove( this, type, fn ); }); diff --git a/test/unit/event.js b/test/unit/event.js index 16cfb6c..197406b 100644 --- a/test/unit/event.js +++ b/test/unit/event.js @@ -45,6 +45,59 @@ test("bind(), no data", function() { jQuery("#firstp").bind("click", handler).trigger("click"); }); +test("bind/one/unbind(Object)", function(){ + expect(6); + + var clickCounter = 0, mouseoverCounter = 0; + function handler(event) { + if (event.type == "click") + clickCounter++; + else if (event.type == "mouseover") + mouseoverCounter++; + }; + + function handlerWithData(event) { + if (event.type == "click") + clickCounter += event.data; + else if (event.type == "mouseover") + mouseoverCounter += event.data; + }; + + function trigger(){ + $elem.trigger("click").trigger("mouseover"); + } + + var $elem = jQuery("#firstp") + // Regular bind + .bind({ + click:handler, + mouseover:handler + }) + // Bind with data + .one({ + click:handlerWithData, + mouseover:handlerWithData + }, 2 ); + + trigger(); + + equals( clickCounter, 3, "bind(Object)" ); + equals( mouseoverCounter, 3, "bind(Object)" ); + + trigger(); + equals( clickCounter, 4, "bind(Object)" ); + equals( mouseoverCounter, 4, "bind(Object)" ); + + jQuery("#firstp").unbind({ + click:handler, + mouseover:handler + }); + + trigger(); + equals( clickCounter, 4, "bind(Object)" ); + equals( mouseoverCounter, 4, "bind(Object)" ); +}); + test("bind(), iframes", function() { // events don't work with iframes, see #939 - this test fails in IE because of contentDocument var doc = jQuery("#loadediframe").contents(); -- 1.7.10.4