[Pkg-javascript-commits] [leaflet] 107/301: Redo MsTouch to be pointer events with msPointer fallback for IE10. fixes #2037
Jonas Smedegaard
js at moszumanska.debian.org
Mon Jan 27 22:22:45 UTC 2014
This is an automated email from the git hooks/post-receive script.
js pushed a commit to branch master
in repository leaflet.
commit bf3b660bef7c64bc85c1dd218f3e07f7133a1bff
Author: danzel <danzel at localhost.geek.nz>
Date: Fri Oct 4 15:06:53 2013 +1300
Redo MsTouch to be pointer events with msPointer fallback for IE10. fixes #2037
---
src/core/Browser.js | 12 ++++---
src/dom/DomEvent.DoubleTap.js | 24 +++++++-------
src/dom/DomEvent.MsTouch.js | 77 +++++++++++++++++++++++--------------------
src/dom/DomEvent.js | 8 ++---
src/map/handler/Map.Tap.js | 2 +-
5 files changed, 66 insertions(+), 57 deletions(-)
diff --git a/src/core/Browser.js b/src/core/Browser.js
index 1239ba7..d3f8952 100644
--- a/src/core/Browser.js
+++ b/src/core/Browser.js
@@ -18,8 +18,9 @@
android23 = ua.search('android [23]') !== -1,
mobile = typeof orientation !== undefined + '',
- msTouch = window.navigator && window.navigator.msPointerEnabled &&
- window.navigator.msMaxTouchPoints,
+ msPointer = window.navigator && window.navigator.msPointerEnabled &&
+ window.navigator.msMaxTouchPoints && !window.PointerEvent,
+ pointer = (window.PointerEvent && window.navigator.pointerEnabled && window.navigator.maxTouchPoints) || msPointer,
retina = ('devicePixelRatio' in window && window.devicePixelRatio > 1) ||
('matchMedia' in window && window.matchMedia('(min-resolution:144dpi)') &&
window.matchMedia('(min-resolution:144dpi)').matches),
@@ -39,8 +40,8 @@
var startName = 'ontouchstart';
- // IE10+ (We simulate these into touch* events in L.DomEvent and L.DomEvent.MsTouch) or WebKit, etc.
- if (msTouch || (startName in doc)) {
+ // IE10+ (We simulate these into touch* events in L.DomEvent and L.DomEvent.Pointer) or WebKit, etc.
+ if (pointer || (startName in doc)) {
return true;
}
@@ -88,7 +89,8 @@
mobileOpera: mobile && window.opera,
touch: touch,
- msTouch: msTouch,
+ msPointer: msPointer,
+ pointer: pointer,
retina: retina
};
diff --git a/src/dom/DomEvent.DoubleTap.js b/src/dom/DomEvent.DoubleTap.js
index 6cd8d03..6bc8d10 100644
--- a/src/dom/DomEvent.DoubleTap.js
+++ b/src/dom/DomEvent.DoubleTap.js
@@ -4,8 +4,8 @@
L.extend(L.DomEvent, {
- _touchstart: L.Browser.msTouch ? 'MSPointerDown' : 'touchstart',
- _touchend: L.Browser.msTouch ? 'MSPointerUp' : 'touchend',
+ _touchstart: L.Browser.msPointer ? 'MSPointerDown' : L.Browser.pointer ? 'pointerdown' : 'touchstart',
+ _touchend: L.Browser.msPointer ? 'MSPointerUp' : L.Browser.pointer ? 'pointerup' : 'touchend',
// inspired by Zepto touch code by Thomas Fuchs
addDoubleTapListener: function (obj, handler, id) {
@@ -21,7 +21,7 @@ L.extend(L.DomEvent, {
function onTouchStart(e) {
var count;
- if (L.Browser.msTouch) {
+ if (L.Browser.pointer) {
trackedTouches.push(e.pointerId);
count = trackedTouches.length;
} else {
@@ -40,7 +40,7 @@ L.extend(L.DomEvent, {
}
function onTouchEnd(e) {
- if (L.Browser.msTouch) {
+ if (L.Browser.pointer) {
var idx = trackedTouches.indexOf(e.pointerId);
if (idx === -1) {
return;
@@ -49,7 +49,7 @@ L.extend(L.DomEvent, {
}
if (doubleTap) {
- if (L.Browser.msTouch) {
+ if (L.Browser.pointer) {
// work around .type being readonly with MSPointer* events
var newTouch = { },
prop;
@@ -73,15 +73,15 @@ L.extend(L.DomEvent, {
obj[pre + touchstart + id] = onTouchStart;
obj[pre + touchend + id] = onTouchEnd;
- // on msTouch we need to listen on the document, otherwise a drag starting on the map and moving off screen
+ // on pointer we need to listen on the document, otherwise a drag starting on the map and moving off screen
// will not come through to us, so we will lose track of how many touches are ongoing
- var endElement = L.Browser.msTouch ? document.documentElement : obj;
+ var endElement = L.Browser.pointer ? document.documentElement : obj;
obj.addEventListener(touchstart, onTouchStart, false);
endElement.addEventListener(touchend, onTouchEnd, false);
- if (L.Browser.msTouch) {
- endElement.addEventListener('MSPointerCancel', onTouchEnd, false);
+ if (L.Browser.pointer) {
+ endElement.addEventListener(L.DomEvent.POINTER_CANCEL, onTouchEnd, false);
}
return this;
@@ -91,11 +91,11 @@ L.extend(L.DomEvent, {
var pre = '_leaflet_';
obj.removeEventListener(this._touchstart, obj[pre + this._touchstart + id], false);
- (L.Browser.msTouch ? document.documentElement : obj).removeEventListener(
+ (L.Browser.pointer ? document.documentElement : obj).removeEventListener(
this._touchend, obj[pre + this._touchend + id], false);
- if (L.Browser.msTouch) {
- document.documentElement.removeEventListener('MSPointerCancel', obj[pre + this._touchend + id], false);
+ if (L.Browser.pointer) {
+ document.documentElement.removeEventListener(L.DomEvent.POINTER_CANCEL, obj[pre + this._touchend + id], false);
}
return this;
diff --git a/src/dom/DomEvent.MsTouch.js b/src/dom/DomEvent.MsTouch.js
index ed5dd70..4957fcd 100644
--- a/src/dom/DomEvent.MsTouch.js
+++ b/src/dom/DomEvent.MsTouch.js
@@ -4,83 +4,90 @@
L.extend(L.DomEvent, {
- _msTouches: [],
- _msDocumentListener: false,
+ //static
+ POINTER_DOWN: L.Browser.msPointer ? 'MSPointerDown' : 'pointerdown',
+ POINTER_MOVE: L.Browser.msPointer ? 'MSPointerMove' : 'pointermove',
+ POINTER_UP: L.Browser.msPointer ? 'MSPointerUp' : 'pointerup',
+ POINTER_CANCEL: L.Browser.msPointer ? 'MSPointerCancel' : 'pointercancel',
- // Provides a touch events wrapper for msPointer events.
+ _pointers: [],
+ _pointerDocumentListener: false,
+
+ // Provides a touch events wrapper for (ms)pointer events.
// Based on changes by veproza https://github.com/CloudMade/Leaflet/pull/1019
+ //ref http://www.w3.org/TR/pointerevents/ https://www.w3.org/Bugs/Public/show_bug.cgi?id=22890
- addMsTouchListener: function (obj, type, handler, id) {
+ addPointerListener: function (obj, type, handler, id) {
switch (type) {
case 'touchstart':
- return this.addMsTouchListenerStart(obj, type, handler, id);
+ return this.addPointerListenerStart(obj, type, handler, id);
case 'touchend':
- return this.addMsTouchListenerEnd(obj, type, handler, id);
+ return this.addPointerListenerEnd(obj, type, handler, id);
case 'touchmove':
- return this.addMsTouchListenerMove(obj, type, handler, id);
+ return this.addPointerListenerMove(obj, type, handler, id);
default:
throw 'Unknown touch event type';
}
},
- addMsTouchListenerStart: function (obj, type, handler, id) {
+ addPointerListenerStart: function (obj, type, handler, id) {
var pre = '_leaflet_',
- touches = this._msTouches;
+ pointers = this._pointers;
var cb = function (e) {
L.DomEvent.preventDefault(e);
var alreadyInArray = false;
- for (var i = 0; i < touches.length; i++) {
- if (touches[i].pointerId === e.pointerId) {
+ for (var i = 0; i < pointers.length; i++) {
+ if (pointers[i].pointerId === e.pointerId) {
alreadyInArray = true;
break;
}
}
if (!alreadyInArray) {
- touches.push(e);
+ pointers.push(e);
}
- e.touches = touches.slice();
+ e.touches = pointers.slice();
e.changedTouches = [e];
handler(e);
};
obj[pre + 'touchstart' + id] = cb;
- obj.addEventListener('MSPointerDown', cb, false);
+ obj.addEventListener(this.POINTER_DOWN, cb, false);
- // need to also listen for end events to keep the _msTouches list accurate
+ // need to also listen for end events to keep the _pointers list accurate
// this needs to be on the body and never go away
- if (!this._msDocumentListener) {
+ if (!this._pointerDocumentListener) {
var internalCb = function (e) {
- for (var i = 0; i < touches.length; i++) {
- if (touches[i].pointerId === e.pointerId) {
- touches.splice(i, 1);
+ for (var i = 0; i < pointers.length; i++) {
+ if (pointers[i].pointerId === e.pointerId) {
+ pointers.splice(i, 1);
break;
}
}
};
//We listen on the documentElement as any drags that end by moving the touch off the screen get fired there
- document.documentElement.addEventListener('MSPointerUp', internalCb, false);
- document.documentElement.addEventListener('MSPointerCancel', internalCb, false);
+ document.documentElement.addEventListener(this.POINTER_UP, internalCb, false);
+ document.documentElement.addEventListener(this.POINTER_CANCEL, internalCb, false);
- this._msDocumentListener = true;
+ this._pointerDocumentListener = true;
}
return this;
},
- addMsTouchListenerMove: function (obj, type, handler, id) {
+ addPointerListenerMove: function (obj, type, handler, id) {
var pre = '_leaflet_',
- touches = this._msTouches;
+ touches = this._pointers;
function cb(e) {
// don't fire touch moves when mouse isn't down
- if (e.pointerType === e.MSPOINTER_TYPE_MOUSE && e.buttons === 0) { return; }
+ if ((e.pointerType === e.MSPOINTER_TYPE_MOUSE || e.pointerType === 'mouse') && e.buttons === 0) { return; }
for (var i = 0; i < touches.length; i++) {
if (touches[i].pointerId === e.pointerId) {
@@ -96,14 +103,14 @@ L.extend(L.DomEvent, {
}
obj[pre + 'touchmove' + id] = cb;
- obj.addEventListener('MSPointerMove', cb, false);
+ obj.addEventListener(this.POINTER_MOVE, cb, false);
return this;
},
- addMsTouchListenerEnd: function (obj, type, handler, id) {
+ addPointerListenerEnd: function (obj, type, handler, id) {
var pre = '_leaflet_',
- touches = this._msTouches;
+ touches = this._pointers;
var cb = function (e) {
for (var i = 0; i < touches.length; i++) {
@@ -120,26 +127,26 @@ L.extend(L.DomEvent, {
};
obj[pre + 'touchend' + id] = cb;
- obj.addEventListener('MSPointerUp', cb, false);
- obj.addEventListener('MSPointerCancel', cb, false);
+ obj.addEventListener(this.POINTER_UP, cb, false);
+ obj.addEventListener(this.POINTER_CANCEL, cb, false);
return this;
},
- removeMsTouchListener: function (obj, type, id) {
+ removePointerListener: function (obj, type, id) {
var pre = '_leaflet_',
cb = obj[pre + type + id];
switch (type) {
case 'touchstart':
- obj.removeEventListener('MSPointerDown', cb, false);
+ obj.removeEventListener(this.POINTER_DOWN, cb, false);
break;
case 'touchmove':
- obj.removeEventListener('MSPointerMove', cb, false);
+ obj.removeEventListener(this.POINTER_MOVE, cb, false);
break;
case 'touchend':
- obj.removeEventListener('MSPointerUp', cb, false);
- obj.removeEventListener('MSPointerCancel', cb, false);
+ obj.removeEventListener(this.POINTER_UP, cb, false);
+ obj.removeEventListener(this.POINTER_CANCEL, cb, false);
break;
}
diff --git a/src/dom/DomEvent.js b/src/dom/DomEvent.js
index ce76b7a..fff44fa 100644
--- a/src/dom/DomEvent.js
+++ b/src/dom/DomEvent.js
@@ -16,8 +16,8 @@ L.DomEvent = {
return fn.call(context || obj, e || L.DomEvent._getEvent());
};
- if (L.Browser.msTouch && type.indexOf('touch') === 0) {
- return this.addMsTouchListener(obj, type, handler, id);
+ if (L.Browser.pointer && type.indexOf('touch') === 0) {
+ return this.addPointerListener(obj, type, handler, id);
}
if (L.Browser.touch && (type === 'dblclick') && this.addDoubleTapListener) {
this.addDoubleTapListener(obj, handler, id);
@@ -69,8 +69,8 @@ L.DomEvent = {
if (!handler) { return this; }
- if (L.Browser.msTouch && type.indexOf('touch') === 0) {
- this.removeMsTouchListener(obj, type, id);
+ if (L.Browser.pointer && type.indexOf('touch') === 0) {
+ this.removePointerListener(obj, type, id);
} else if (L.Browser.touch && (type === 'dblclick') && this.removeDoubleTapListener) {
this.removeDoubleTapListener(obj, id);
diff --git a/src/map/handler/Map.Tap.js b/src/map/handler/Map.Tap.js
index 90e9e55..7682daa 100644
--- a/src/map/handler/Map.Tap.js
+++ b/src/map/handler/Map.Tap.js
@@ -102,6 +102,6 @@ L.Map.Tap = L.Handler.extend({
}
});
-if (L.Browser.touch && !L.Browser.msTouch) {
+if (L.Browser.touch && !L.Browser.pointer) {
L.Map.addInitHook('addHandler', 'tap', L.Map.Tap);
}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/leaflet.git
More information about the Pkg-javascript-commits
mailing list