diff options
| author | Steven Sojka | 2013-09-04 11:20:33 -0500 | 
|---|---|---|
| committer | Jeff Cross | 2013-10-08 09:14:33 -0700 | 
| commit | 9fd92cc3c93a6378e8887fd46fd4ad182a375544 (patch) | |
| tree | 0196a2c9eabc6e94400d7a17a61f372048350df4 | |
| parent | f7fc00841bf5e3ffa2d9c2b1d316ed4dcdcde756 (diff) | |
| download | angular.js-9fd92cc3c93a6378e8887fd46fd4ad182a375544.tar.bz2 | |
fix(ngTouch): ngClick does not pass touchend event when jQuery is loaded
The trigger handler event in jqLite takes an event object as a second
parameter, but jQuery requires an array of parameters. This is causing
the touchend event to not come thtough in the click handler when jQuery
is loaded.
| -rw-r--r-- | src/jqLite.js | 9 | ||||
| -rw-r--r-- | src/ngTouch/directive/ngClick.js | 6 | ||||
| -rw-r--r-- | test/jqLiteSpec.js | 12 | 
3 files changed, 21 insertions, 6 deletions
| diff --git a/src/jqLite.js b/src/jqLite.js index d3110788..8075d874 100644 --- a/src/jqLite.js +++ b/src/jqLite.js @@ -803,13 +803,16 @@ forEach({    triggerHandler: function(element, eventName, eventData) {      var eventFns = (JQLiteExpandoStore(element, 'events') || {})[eventName]; -    eventData = eventData || { +     +    eventData = eventData || []; + +    var event = [{        preventDefault: noop,        stopPropagation: noop -    }; +    }];      forEach(eventFns, function(fn) { -      fn.call(element, eventData); +      fn.apply(element, event.concat(eventData));      });    }  }, function(fn, name){ diff --git a/src/ngTouch/directive/ngClick.js b/src/ngTouch/directive/ngClick.js index d6e404ca..7dcc4041 100644 --- a/src/ngTouch/directive/ngClick.js +++ b/src/ngTouch/directive/ngClick.js @@ -238,7 +238,7 @@ ngTouch.directive('ngClick', ['$parse', '$timeout', '$rootElement',          }          if (!angular.isDefined(attr.disabled) || attr.disabled === false) { -          element.triggerHandler('click', event); +          element.triggerHandler('click', [event]);          }        } @@ -255,9 +255,9 @@ ngTouch.directive('ngClick', ['$parse', '$timeout', '$rootElement',      // - On mobile browsers, the simulated "fast" click will call this.      // - But the browser's follow-up slow click will be "busted" before it reaches this handler.      // Therefore it's safe to use this directive on both mobile and desktop. -    element.on('click', function(event) { +    element.on('click', function(event, touchend) {        scope.$apply(function() { -        clickHandler(scope, {$event: event}); +        clickHandler(scope, {$event: (touchend || event)});        });      }); diff --git a/test/jqLiteSpec.js b/test/jqLiteSpec.js index 08100658..de9c74da 100644 --- a/test/jqLiteSpec.js +++ b/test/jqLiteSpec.js @@ -1343,6 +1343,18 @@ describe('jqLite', function() {        event = pokeSpy.mostRecentCall.args[0];        expect(event.preventDefault).toBeDefined();      }); + +    it('should pass data as an additional argument', function() { +      var element = jqLite('<a>poke</a>'), +          pokeSpy = jasmine.createSpy('poke'), +          data; + +      element.on('click', pokeSpy); + +      element.triggerHandler('click', [{hello: "world"}]); +      data = pokeSpy.mostRecentCall.args[1]; +      expect(data.hello).toBe("world"); +    });    }); | 
