From: Jörn Zaefferer Date: Thu, 28 Dec 2006 11:37:07 +0000 (+0000) Subject: Implemented, tested and documented #202 X-Git-Url: http://git.asbjorn.biz/?p=jquery.git;a=commitdiff_plain;h=b8d46f7b6a38d92d9e0ad0b0df12c773bcf1c634 Implemented, tested and documented #202 --- diff --git a/src/event/eventTest.js b/src/event/eventTest.js index b597a25..13b47de 100644 --- a/src/event/eventTest.js +++ b/src/event/eventTest.js @@ -8,4 +8,47 @@ test("toggle(Function, Function) - add toggle event and fake a few clicks", func link = $('#mark'); link.click().toggle(fn1, fn2).click().click().click().click().click(); ok( count == 1, "Check for toggle(fn, fn)" ); +}); + +test("unbind(event)", function() { + expect(3); + var el = $("#firstp"); + el.click(function() { + ok( true, "Fake normal bind" ); + }); + el.click(function(event) { + el.unbind(event); + ok( true, "Fake onebind" ); + }); + el.click().click(); +}); + +test("trigger(event, [data]", function() { + expect(3); + var handler = function(event, a, b, c) { + ok( a == 1, "check passed data" ); + ok( b == "2", "check passed data" ); + ok( c == "abc", "check passed data" ); + } + $("#firstp").bind("click", handler).trigger("click", [1, "2", "abc"]); +}); + +test("bind() with data", function() { + expect(2); + var handler = function(event) { + ok( event.data, "check passed data exists" ); + ok( event.data.foo == "bar", "Check value of passed data" ); + } + $("#firstp").bind("click", {foo: "bar"}, handler).click(); +}); + +test("bind() with data and trigger() with data", function() { + expect(4); + var handler = function(event, data) { + ok( event.data, "check passed data exists" ); + ok( event.data.foo == "bar", "Check value of passed data" ); + ok( data, "Check trigger data" ); + ok( data.bar == "foo", "Check value of trigger data" ); + } + $("#firstp").bind("click", {foo: "bar"}, handler).trigger("click", [{bar: "foo"}]); }); \ No newline at end of file diff --git a/src/jquery/coreTest.js b/src/jquery/coreTest.js index 67dea20..ada7195 100644 --- a/src/jquery/coreTest.js +++ b/src/jquery/coreTest.js @@ -564,16 +564,3 @@ test("removeClass(String) - add three classes and remove again", function() { test("removeAttr(String", function() { ok( $('#mark').removeAttr("class")[0].className == "", "remove class" ); }); - -test("unbind(event)", function() { - expect(3); - var el = $("#firstp"); - el.click(function() { - ok( true, "Fake normal bind" ); - }); - el.click(function(event) { - el.unbind(event); - ok( true, "Fake onebind" ); - }); - el.click().click(); -}); diff --git a/src/jquery/jquery.js b/src/jquery/jquery.js index 4e9f4ac..7f7ef08 100644 --- a/src/jquery/jquery.js +++ b/src/jquery/jquery.js @@ -2045,12 +2045,16 @@ jQuery.extend({ // Bind an event to an element // Original by Dean Edwards - add: function(element, type, handler) { + add: function(element, type, handler, data) { // For whatever reason, IE has trouble passing the window object // around, causing it to be cloned in the process if ( jQuery.browser.msie && element.setInterval != undefined ) element = window; + // if data is passed, bind to handler + if( data ) + handler.data = data; + // Make sure that the function being executed has a unique ID if ( !handler.guid ) handler.guid = this.guid++; @@ -2140,6 +2144,7 @@ jQuery.extend({ // Pass in a reference to the handler function itself // So that we can later remove it args[0].handler = c[j]; + args[0].data = c[j].data; if ( c[j].apply( this, args ) === false ) { event.preventDefault(); @@ -2149,7 +2154,7 @@ jQuery.extend({ } // Clean up added properties in IE to prevent memory leak - if (jQuery.browser.msie) event.target = event.preventDefault = event.stopPropagation = null; + if (jQuery.browser.msie) event.target = event.preventDefault = event.stopPropagation = event.handler = event.data = null; return returnValue; }, @@ -3174,12 +3179,24 @@ jQuery.macros = { * default behaviour. To stop both default action and event bubbling, your handler * has to return false. * + * In most cases, you can define your event handlers as anonymous functions + * (see first example). In cases where that is not possible, you can pass additional + * data as the second paramter (and the handler function as the third), see + * second example. + * * @example $("p").bind( "click", function() { * alert( $(this).text() ); * } ) * @before

Hello

* @result alert("Hello") * + * @example var handler = function(event) { + * alert(event.data.foo); + * }; + * $("p").bind( "click", {foo: "bar"}, handler) + * @result alert("bar") + * @desc Pass some additional data to the event handler. + * * @example $("form").bind( "submit", function() { return false; } ) * @desc Cancel a default action and prevent it from bubbling by returning false * from your function. @@ -3198,11 +3215,12 @@ jQuery.macros = { * @name bind * @type jQuery * @param String type An event type + * @param Object data (optional) Additional data passed to the event handler as event.data * @param Function fn A function to bind to the event on each of the set of matched elements * @cat Events */ - bind: function( type, fn ) { - jQuery.event.add( this, type, fn ); + bind: function( type, data, fn ) { + jQuery.event.add( this, type, fn || data, data ); }, /**