From 650fd933df614ac733cd43fe31d81d622a2ce2bc Mon Sep 17 00:00:00 2001 From: Igor Minar Date: Sat, 24 Nov 2012 01:47:52 +0100 Subject: [PATCH] feat(jqLite): add triggerHandler() we need triggerHandler() to become jQuery 1.8.x compatible. this is not fully featured triggerHandler() implementation - it doesn't bother creating new DOM events and passing them into the event handlers. this is intentional, we don't need access to the native DOM event for our own purposes and creating these event objects is really tricky. --- src/jqLite.js | 11 ++++++++++- test/jqLiteSpec.js | 27 +++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/jqLite.js b/src/jqLite.js index 1ba270b671d3..90a363f39987 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -54,6 +54,7 @@ * - [replaceWith()](http://api.jquery.com/replaceWith/) * - [text()](http://api.jquery.com/text/) * - [toggleClass()](http://api.jquery.com/toggleClass/) + * - [triggerHandler()](http://api.jquery.com/triggerHandler/) - Doesn't pass native event objects to handlers. * - [unbind()](http://api.jquery.com/unbind/) * - [val()](http://api.jquery.com/val/) * - [wrap()](http://api.jquery.com/wrap/) @@ -728,7 +729,15 @@ forEach({ return element.getElementsByTagName(selector); }, - clone: JQLiteClone + clone: JQLiteClone, + + triggerHandler: function(element, eventName) { + var eventFns = (JQLiteExpandoStore(element, 'events') || {})[eventName]; + + forEach(eventFns, function(fn) { + fn.call(element, null); + }); + } }, function(fn, name){ /** * chaining functions diff --git a/test/jqLiteSpec.js b/test/jqLiteSpec.js index 1a56a3437692..76a2c5a87485 100644 --- a/test/jqLiteSpec.js +++ b/test/jqLiteSpec.js @@ -1091,6 +1091,33 @@ describe('jqLite', function() { }); + describe('triggerHandler', function() { + it('should trigger all registered handlers for an event', function() { + var element = jqLite('poke'), + pokeSpy = jasmine.createSpy('poke'), + clickSpy1 = jasmine.createSpy('clickSpy1'), + clickSpy2 = jasmine.createSpy('clickSpy2'); + + element.bind('poke', pokeSpy); + element.bind('click', clickSpy1); + element.bind('click', clickSpy2); + + expect(pokeSpy).not.toHaveBeenCalled(); + expect(clickSpy1).not.toHaveBeenCalled(); + expect(clickSpy2).not.toHaveBeenCalled(); + + element.triggerHandler('poke'); + expect(pokeSpy).toHaveBeenCalledOnce(); + expect(clickSpy1).not.toHaveBeenCalled(); + expect(clickSpy2).not.toHaveBeenCalled(); + + element.triggerHandler('click'); + expect(clickSpy1).toHaveBeenCalledOnce(); + expect(clickSpy2).toHaveBeenCalledOnce(); + }); + }); + + describe('camelCase', function() { it('should leave non-dashed strings alone', function() {