From 5c19701a89c4b56e130a213759eb035fb0c302dc Mon Sep 17 00:00:00 2001 From: John Resig Date: Thu, 30 Aug 2007 16:34:34 +0000 Subject: [PATCH] Made it so that you can pass in an event object to the trigger data args and it'll override the custom event object (this way you can pass in the event object of a mousemove to a drag event trigger, for example). --- src/event/event.js | 11 +++++++++-- src/event/eventTest.js | 30 ++++++++++++++++++++++++------ 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/src/event/event.js b/src/event/event.js index 3c5a119..3b3294b 100644 --- a/src/event/event.js +++ b/src/event/event.js @@ -134,10 +134,13 @@ jQuery.event = { // Handle triggering a single element } else { - var val, ret, fn = jQuery.isFunction( element[ type ] || null ); + var val, ret, fn = jQuery.isFunction( element[ type ] || null ), + // Check to see if we need to provide a fake event, or not + evt = !data[0] || !data[0].preventDefault; // Pass along a fake event - data.unshift( this.fix({ type: type, target: element }) ); + if ( evt ) + data.unshift( this.fix({ type: type, target: element }) ); // Trigger the event if ( jQuery.isFunction( element.$handle ) ) @@ -147,6 +150,10 @@ jQuery.event = { if ( !fn && element["on"+type] && element["on"+type].apply( element, data ) === false ) val = false; + // Extra functions don't get the custom event object + if ( evt ) + data.shift(); + // Handle triggering of extra function if ( extra && extra.apply( element, data ) === false ) val = false; diff --git a/src/event/eventTest.js b/src/event/eventTest.js index 84c7b97..7ae9e6d 100644 --- a/src/event/eventTest.js +++ b/src/event/eventTest.js @@ -93,8 +93,8 @@ test("unbind(event)", function() { ok( !el[0].$events, "Removed the events expando after all handlers are unbound." ); }); -test("trigger(event, [data]", function() { - expect(28); +test("trigger(event, [data], [fn])", function() { + expect(40); var handler = function(event, a, b, c) { equals( event.type, "click", "check passed data" ); @@ -104,6 +104,13 @@ test("trigger(event, [data]", function() { return "test"; }; + var handler2 = function(a, b, c) { + equals( a, 1, "check passed data" ); + equals( b, "2", "check passed data" ); + equals( c, "abc", "check passed data" ); + return "test2"; + }; + // Simulate a "native" click $("#firstp")[0].click = function(){ ok( true, "Native call was triggered" ); @@ -114,8 +121,8 @@ test("trigger(event, [data]", function() { $("#firstp").bind("click", handler).trigger("click", [1, "2", "abc"]); // Triggers handlers, native, and extra fn - // Triggers 9 - $("#firstp").trigger("click", [1, "2", "abc"], handler); + // Triggers 8 + $("#firstp").trigger("click", [1, "2", "abc"], handler2); // Simulate a "native" click $("#firstp")[0].click = function(){ @@ -123,12 +130,23 @@ test("trigger(event, [data]", function() { }; // Trigger only the handlers (no native) - // Triggers 4 + // Triggers 5 equals( $("#firstp").triggerHandler("click", [1, "2", "abc"]), "test", "Verify handler response" ); // Trigger only the handlers (no native) and extra fn // Triggers 8 - equals( $("#firstp").triggerHandler("click", [1, "2", "abc"], handler), "test", "Verify handler response" ); + equals( $("#firstp").triggerHandler("click", [1, "2", "abc"], handler2), "test", "Verify handler response" ); + + // Build fake click event to pass in + var eventObj = jQuery.event.fix({ type: "click", target: document.body }); + + // Trigger only the handlers (no native), with external event obj + // Triggers 5 + equals( $("#firstp").triggerHandler("foo", [eventObj, 1, "2", "abc"]), "test", "Verify handler response" ); + + // Trigger only the handlers (no native) and extra fn, with external event obj + // Triggers 9 + equals( $("#firstp").triggerHandler("foo", [eventObj, 1, "2", "abc"], handler), "test", "Verify handler response" ); }); test("toggle(Function, Function)", function() { -- 1.7.10.4