|
3 | 3 | *
|
4 | 4 | * Brad Birdsall
|
5 | 5 | * Copyright 2013, MIT License
|
6 |
| - * |
7 | 6 | */
|
8 | 7 |
|
9 | 8 | (function(ionic) {
|
|
12 | 11 | ionic.views.Slider = ionic.views.View.inherit({
|
13 | 12 | initialize: function (options) {
|
14 | 13 | var slider = this;
|
15 |
| - |
| 14 | + |
| 15 | + var touchStartEvent, touchMoveEvent, touchEndEvent; |
| 16 | + if (window.navigator.pointerEnabled) { |
| 17 | + touchStartEvent = 'pointerdown'; |
| 18 | + touchMoveEvent = 'pointermove'; |
| 19 | + touchEndEvent = 'pointerup'; |
| 20 | + } else if (window.navigator.msPointerEnabled) { |
| 21 | + touchStartEvent = 'MSPointerDown'; |
| 22 | + touchMoveEvent = 'MSPointerMove'; |
| 23 | + touchEndEvent = 'MSPointerUp'; |
| 24 | + } else { |
| 25 | + touchStartEvent = 'touchstart'; |
| 26 | + touchMoveEvent = 'touchmove'; |
| 27 | + touchEndEvent = 'touchend'; |
| 28 | + } |
| 29 | + |
| 30 | + var mouseStartEvent = 'mousedown'; |
| 31 | + var mouseMoveEvent = 'mousemove'; |
| 32 | + var mouseEndEvent = 'mouseup'; |
| 33 | + |
16 | 34 | // utilities
|
17 | 35 | var noop = function() {}; // simple no operation function
|
18 | 36 | var offloadFn = function(fn) { setTimeout(fn || noop, 0); }; // offload a functions execution
|
19 | 37 |
|
20 | 38 | // check browser capabilities
|
21 | 39 | var browser = {
|
22 | 40 | addEventListener: !!window.addEventListener,
|
23 |
| - touch: ('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch, |
24 | 41 | transitions: (function(temp) {
|
25 | 42 | var props = ['transitionProperty', 'WebkitTransition', 'MozTransition', 'OTransition', 'msTransition'];
|
26 | 43 | for ( var i in props ) if (temp.style[ props[i] ] !== undefined) return true;
|
@@ -251,20 +268,20 @@ ionic.views.Slider = ionic.views.View.inherit({
|
251 | 268 | var events = {
|
252 | 269 |
|
253 | 270 | handleEvent: function(event) {
|
254 |
| - if(event.type == 'mousedown' || event.type == 'mouseup' || event.type == 'mousemove') { |
| 271 | + if(!event.touches && event.pageX && event.pageY) { |
255 | 272 | event.touches = [{
|
256 | 273 | pageX: event.pageX,
|
257 | 274 | pageY: event.pageY
|
258 | 275 | }];
|
259 | 276 | }
|
260 | 277 |
|
261 | 278 | switch (event.type) {
|
262 |
| - case 'mousedown': this.start(event); break; |
263 |
| - case 'touchstart': this.start(event); break; |
264 |
| - case 'touchmove': this.touchmove(event); break; |
265 |
| - case 'mousemove': this.touchmove(event); break; |
266 |
| - case 'touchend': offloadFn(this.end(event)); break; |
267 |
| - case 'mouseup': offloadFn(this.end(event)); break; |
| 279 | + case touchStartEvent: this.start(event); break; |
| 280 | + case mouseStartEvent: this.start(event); break; |
| 281 | + case touchMoveEvent: this.touchmove(event); break; |
| 282 | + case mouseMoveEvent: this.touchmove(event); break; |
| 283 | + case touchEndEvent: offloadFn(this.end(event)); break; |
| 284 | + case mouseEndEvent: offloadFn(this.end(event)); break; |
268 | 285 | case 'webkitTransitionEnd':
|
269 | 286 | case 'msTransitionEnd':
|
270 | 287 | case 'oTransitionEnd':
|
@@ -299,14 +316,14 @@ ionic.views.Slider = ionic.views.View.inherit({
|
299 | 316 | delta = {};
|
300 | 317 |
|
301 | 318 | // attach touchmove and touchend listeners
|
302 |
| - if(browser.touch) { |
303 |
| - element.addEventListener('touchmove', this, false); |
304 |
| - element.addEventListener('touchend', this, false); |
305 |
| - } else { |
306 |
| - element.addEventListener('mousemove', this, false); |
307 |
| - element.addEventListener('mouseup', this, false); |
308 |
| - document.addEventListener('mouseup', this, false); |
309 |
| - } |
| 319 | + element.addEventListener(touchMoveEvent, this, false); |
| 320 | + element.addEventListener(mouseMoveEvent, this, false); |
| 321 | + |
| 322 | + element.addEventListener(touchEndEvent, this, false); |
| 323 | + element.addEventListener(mouseEndEvent, this, false); |
| 324 | + |
| 325 | + document.addEventListener(touchEndEvent, this, false); |
| 326 | + document.addEventListener(mouseEndEvent, this, false); |
310 | 327 | },
|
311 | 328 | touchmove: function(event) {
|
312 | 329 |
|
@@ -448,15 +465,15 @@ ionic.views.Slider = ionic.views.View.inherit({
|
448 | 465 | }
|
449 | 466 |
|
450 | 467 | // kill touchmove and touchend event listeners until touchstart called again
|
451 |
| - if(browser.touch) { |
452 |
| - element.removeEventListener('touchmove', events, false); |
453 |
| - element.removeEventListener('touchend', events, false); |
454 |
| - } else { |
455 |
| - element.removeEventListener('mousemove', events, false); |
456 |
| - element.removeEventListener('mouseup', events, false); |
457 |
| - document.removeEventListener('mouseup', events, false); |
458 |
| - } |
459 |
| - |
| 468 | + element.removeEventListener(touchMoveEvent, events, false); |
| 469 | + element.removeEventListener(mouseMoveEvent, events, false); |
| 470 | + |
| 471 | + element.removeEventListener(touchEndEvent, events, false); |
| 472 | + element.removeEventListener(mouseEndEvent, events, false); |
| 473 | + |
| 474 | + document.removeEventListener(touchEndEvent, events, false); |
| 475 | + document.removeEventListener(mouseEndEvent, events, false); |
| 476 | + |
460 | 477 | options.onDragEnd && options.onDragEnd();
|
461 | 478 | },
|
462 | 479 | transitionEnd: function(event) {
|
@@ -557,7 +574,8 @@ ionic.views.Slider = ionic.views.View.inherit({
|
557 | 574 | if (browser.addEventListener) {
|
558 | 575 |
|
559 | 576 | // remove current event listeners
|
560 |
| - element.removeEventListener('touchstart', events, false); |
| 577 | + element.removeEventListener(touchStartEvent, events, false); |
| 578 | + element.removeEventListener(mouseStartEvent, events, false); |
561 | 579 | element.removeEventListener('webkitTransitionEnd', events, false);
|
562 | 580 | element.removeEventListener('msTransitionEnd', events, false);
|
563 | 581 | element.removeEventListener('oTransitionEnd', events, false);
|
@@ -585,11 +603,8 @@ ionic.views.Slider = ionic.views.View.inherit({
|
585 | 603 | if (browser.addEventListener) {
|
586 | 604 |
|
587 | 605 | // set touchstart event on element
|
588 |
| - if (browser.touch) { |
589 |
| - element.addEventListener('touchstart', events, false); |
590 |
| - } else { |
591 |
| - element.addEventListener('mousedown', events, false); |
592 |
| - } |
| 606 | + element.addEventListener(touchStartEvent, events, false); |
| 607 | + element.addEventListener(mouseStartEvent, events, false); |
593 | 608 |
|
594 | 609 | if (browser.transitions) {
|
595 | 610 | element.addEventListener('webkitTransitionEnd', events, false);
|
|
0 commit comments