@@ -13,14 +13,32 @@ ionic.views.Slider = ionic.views.View.inherit({
13
13
initialize : function ( options ) {
14
14
var slider = this ;
15
15
16
+ var touchStartEvent , touchMoveEvent , touchEndEvent ;
17
+ if ( window . navigator . pointerEnabled ) {
18
+ touchStartEvent = 'pointerdown' ;
19
+ touchMoveEvent = 'pointermove' ;
20
+ touchEndEvent = 'pointerup' ;
21
+ } else if ( window . navigator . msPointerEnabled ) {
22
+ touchStartEvent = 'MSPointerDown' ;
23
+ touchMoveEvent = 'MSPointerMove' ;
24
+ touchEndEvent = 'MSPointerUp' ;
25
+ } else {
26
+ touchStartEvent = 'touchstart' ;
27
+ touchMoveEvent = 'touchmove' ;
28
+ touchEndEvent = 'touchend' ;
29
+ }
30
+
31
+ var mouseStartEvent = 'mousedown' ;
32
+ var mouseMoveEvent = 'mousemove' ;
33
+ var mouseEndEvent = 'mouseup' ;
34
+
16
35
// utilities
17
36
var noop = function ( ) { } ; // simple no operation function
18
37
var offloadFn = function ( fn ) { setTimeout ( fn || noop , 0 ) ; } ; // offload a functions execution
19
38
20
39
// check browser capabilities
21
40
var browser = {
22
41
addEventListener : ! ! window . addEventListener ,
23
- touch : ( 'ontouchstart' in window ) || window . DocumentTouch && document instanceof DocumentTouch ,
24
42
transitions : ( function ( temp ) {
25
43
var props = [ 'transitionProperty' , 'WebkitTransition' , 'MozTransition' , 'OTransition' , 'msTransition' ] ;
26
44
for ( var i in props ) if ( temp . style [ props [ i ] ] !== undefined ) return true ;
@@ -256,20 +274,20 @@ ionic.views.Slider = ionic.views.View.inherit({
256
274
var events = {
257
275
258
276
handleEvent : function ( event ) {
259
- if ( event . type == 'mousedown' || event . type == 'mouseup' || event . type == 'mousemove' ) {
277
+ if ( ! event . touches && event . pageX && event . pageY ) {
260
278
event . touches = [ {
261
279
pageX : event . pageX ,
262
280
pageY : event . pageY
263
281
} ] ;
264
282
}
265
283
266
284
switch ( event . type ) {
267
- case 'mousedown' : this . start ( event ) ; break ;
268
- case 'touchstart' : this . start ( event ) ; break ;
269
- case 'touchmove' : this . touchmove ( event ) ; break ;
270
- case 'mousemove' : this . touchmove ( event ) ; break ;
271
- case 'touchend' : offloadFn ( this . end ( event ) ) ; break ;
272
- case 'mouseup' : offloadFn ( this . end ( event ) ) ; break ;
285
+ case touchStartEvent : this . start ( event ) ; break ;
286
+ case mouseStartEvent : this . start ( event ) ; break ;
287
+ case touchMoveEvent : this . touchmove ( event ) ; break ;
288
+ case mouseMoveEvent : this . touchmove ( event ) ; break ;
289
+ case touchEndEvent : offloadFn ( this . end ( event ) ) ; break ;
290
+ case mouseEndEvent : offloadFn ( this . end ( event ) ) ; break ;
273
291
case 'webkitTransitionEnd' :
274
292
case 'msTransitionEnd' :
275
293
case 'oTransitionEnd' :
@@ -283,6 +301,11 @@ ionic.views.Slider = ionic.views.View.inherit({
283
301
} ,
284
302
start : function ( event ) {
285
303
304
+ // prevent to start if there is no valid event
305
+ if ( ! event . touches ) {
306
+ return ;
307
+ }
308
+
286
309
var touches = event . touches [ 0 ] ;
287
310
288
311
// measure start values
@@ -304,20 +327,22 @@ ionic.views.Slider = ionic.views.View.inherit({
304
327
delta = { } ;
305
328
306
329
// attach touchmove and touchend listeners
307
- if ( browser . touch ) {
308
- element . addEventListener ( 'touchmove' , this , false ) ;
309
- element . addEventListener ( 'touchend' , this , false ) ;
310
- } else {
311
- element . addEventListener ( 'mousemove' , this , false ) ;
312
- element . addEventListener ( 'mouseup' , this , false ) ;
313
- document . addEventListener ( 'mouseup' , this , false ) ;
314
- }
330
+ element . addEventListener ( touchMoveEvent , this , false ) ;
331
+ element . addEventListener ( mouseMoveEvent , this , false ) ;
332
+
333
+ element . addEventListener ( touchEndEvent , this , false ) ;
334
+ element . addEventListener ( mouseEndEvent , this , false ) ;
335
+
336
+ document . addEventListener ( touchEndEvent , this , false ) ;
337
+ document . addEventListener ( mouseEndEvent , this , false ) ;
315
338
} ,
316
339
touchmove : function ( event ) {
317
340
341
+ // ensure there is a valid event
318
342
// ensure swiping with one touch and not pinching
319
343
// ensure sliding is enabled
320
- if ( event . touches . length > 1 ||
344
+ if ( ! event . touches ||
345
+ event . touches . length > 1 ||
321
346
event . scale && event . scale !== 1 ||
322
347
slider . slideIsDisabled ) {
323
348
return ;
@@ -453,14 +478,14 @@ ionic.views.Slider = ionic.views.View.inherit({
453
478
}
454
479
455
480
// kill touchmove and touchend event listeners until touchstart called again
456
- if ( browser . touch ) {
457
- element . removeEventListener ( 'touchmove' , events , false ) ;
458
- element . removeEventListener ( 'touchend' , events , false ) ;
459
- } else {
460
- element . removeEventListener ( 'mousemove' , events , false ) ;
461
- element . removeEventListener ( 'mouseup' , events , false ) ;
462
- document . removeEventListener ( 'mouseup' , events , false ) ;
463
- }
481
+ element . removeEventListener ( touchMoveEvent , events , false ) ;
482
+ element . removeEventListener ( mouseMoveEvent , events , false ) ;
483
+
484
+ element . removeEventListener ( touchEndEvent , events , false ) ;
485
+ element . removeEventListener ( mouseEndEvent , events , false ) ;
486
+
487
+ document . removeEventListener ( touchEndEvent , events , false ) ;
488
+ document . removeEventListener ( mouseEndEvent , events , false ) ;
464
489
465
490
options . onDragEnd && options . onDragEnd ( ) ;
466
491
} ,
@@ -562,7 +587,8 @@ ionic.views.Slider = ionic.views.View.inherit({
562
587
if ( browser . addEventListener ) {
563
588
564
589
// remove current event listeners
565
- element . removeEventListener ( 'touchstart' , events , false ) ;
590
+ element . removeEventListener ( touchStartEvent , events , false ) ;
591
+ element . removeEventListener ( mouseStartEvent , events , false ) ;
566
592
element . removeEventListener ( 'webkitTransitionEnd' , events , false ) ;
567
593
element . removeEventListener ( 'msTransitionEnd' , events , false ) ;
568
594
element . removeEventListener ( 'oTransitionEnd' , events , false ) ;
@@ -590,11 +616,8 @@ ionic.views.Slider = ionic.views.View.inherit({
590
616
if ( browser . addEventListener ) {
591
617
592
618
// set touchstart event on element
593
- if ( browser . touch ) {
594
- element . addEventListener ( 'touchstart' , events , false ) ;
595
- } else {
596
- element . addEventListener ( 'mousedown' , events , false ) ;
597
- }
619
+ element . addEventListener ( touchStartEvent , events , false ) ;
620
+ element . addEventListener ( mouseStartEvent , events , false ) ;
598
621
599
622
if ( browser . transitions ) {
600
623
element . addEventListener ( 'webkitTransitionEnd' , events , false ) ;
0 commit comments