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() {