From 9059a3afe6e21ab6342c90806d0bdefe399ad073 Mon Sep 17 00:00:00 2001 From: Toilal Date: Mon, 2 Feb 2015 12:32:55 +0100 Subject: [PATCH] fix(gesture): Implement proper event dispatching when using JQuery Close #1359 --- src/core/services/gesture/gesture.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/core/services/gesture/gesture.js b/src/core/services/gesture/gesture.js index 90c45342d40..6f5e1304791 100644 --- a/src/core/services/gesture/gesture.js +++ b/src/core/services/gesture/gesture.js @@ -302,7 +302,7 @@ angular.module('material.core') onCancel: angular.noop, options: {}, - dispatchEvent: dispatchEvent, + dispatchEvent: typeof jQuery !== 'undefined' && angular.element === jQuery ? jQueryDispatchEvent : nativeDispatchEvent, start: function(ev, pointer) { if (this.state.isRunning) return; @@ -361,10 +361,11 @@ angular.module('material.core') bubbles: true, cancelable: true }; + /* - * NOTE: dispatchEvent is very performance sensitive. + * NOTE: native and jquery event dispatchers are very performance sensitive. */ - function dispatchEvent(srcEvent, eventType, eventPointer, /*original DOMEvent */ev) { + function nativeDispatchEvent(srcEvent, eventType, eventPointer, /*original DOMEvent */ev) { eventPointer = eventPointer || pointer; var eventObj; @@ -387,6 +388,17 @@ angular.module('material.core') eventPointer.target.dispatchEvent(eventObj); } + // JQuery doesn't use native events for events registration, so using JQuery #trigger() instead of #dispatchEvent(). + function jQueryDispatchEvent(srcEvent, eventType, eventPointer, /*original DOMEvent */ev) { + eventPointer = eventPointer || pointer; + var eventObj = new angular.element.Event(eventType) + + eventObj.$material = true; + eventObj.pointer = eventPointer; + eventObj.srcEvent = srcEvent; + angular.element(eventPointer.target).trigger(eventObj); + } + return GestureHandler; });