Skip to content

Commit cf4faf4

Browse files
committed
Merge pull request #4680 from sbatezat/patch-1
Fix sliderview on Windows Phone devices
2 parents 936252d + e9dfd5a commit cf4faf4

File tree

1 file changed

+54
-31
lines changed

1 file changed

+54
-31
lines changed

Diff for: js/views/sliderView.js

+54-31
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,32 @@ ionic.views.Slider = ionic.views.View.inherit({
1313
initialize: function (options) {
1414
var slider = this;
1515

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+
1635
// utilities
1736
var noop = function() {}; // simple no operation function
1837
var offloadFn = function(fn) { setTimeout(fn || noop, 0); }; // offload a functions execution
1938

2039
// check browser capabilities
2140
var browser = {
2241
addEventListener: !!window.addEventListener,
23-
touch: ('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch,
2442
transitions: (function(temp) {
2543
var props = ['transitionProperty', 'WebkitTransition', 'MozTransition', 'OTransition', 'msTransition'];
2644
for ( var i in props ) if (temp.style[ props[i] ] !== undefined) return true;
@@ -256,20 +274,20 @@ ionic.views.Slider = ionic.views.View.inherit({
256274
var events = {
257275

258276
handleEvent: function(event) {
259-
if(event.type == 'mousedown' || event.type == 'mouseup' || event.type == 'mousemove') {
277+
if(!event.touches && event.pageX && event.pageY) {
260278
event.touches = [{
261279
pageX: event.pageX,
262280
pageY: event.pageY
263281
}];
264282
}
265283

266284
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;
273291
case 'webkitTransitionEnd':
274292
case 'msTransitionEnd':
275293
case 'oTransitionEnd':
@@ -283,6 +301,11 @@ ionic.views.Slider = ionic.views.View.inherit({
283301
},
284302
start: function(event) {
285303

304+
// prevent to start if there is no valid event
305+
if (!event.touches) {
306+
return;
307+
}
308+
286309
var touches = event.touches[0];
287310

288311
// measure start values
@@ -304,20 +327,22 @@ ionic.views.Slider = ionic.views.View.inherit({
304327
delta = {};
305328

306329
// 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);
315338
},
316339
touchmove: function(event) {
317340

341+
// ensure there is a valid event
318342
// ensure swiping with one touch and not pinching
319343
// ensure sliding is enabled
320-
if (event.touches.length > 1 ||
344+
if (!event.touches ||
345+
event.touches.length > 1 ||
321346
event.scale && event.scale !== 1 ||
322347
slider.slideIsDisabled) {
323348
return;
@@ -453,14 +478,14 @@ ionic.views.Slider = ionic.views.View.inherit({
453478
}
454479

455480
// 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);
464489

465490
options.onDragEnd && options.onDragEnd();
466491
},
@@ -562,7 +587,8 @@ ionic.views.Slider = ionic.views.View.inherit({
562587
if (browser.addEventListener) {
563588

564589
// remove current event listeners
565-
element.removeEventListener('touchstart', events, false);
590+
element.removeEventListener(touchStartEvent, events, false);
591+
element.removeEventListener(mouseStartEvent, events, false);
566592
element.removeEventListener('webkitTransitionEnd', events, false);
567593
element.removeEventListener('msTransitionEnd', events, false);
568594
element.removeEventListener('oTransitionEnd', events, false);
@@ -590,11 +616,8 @@ ionic.views.Slider = ionic.views.View.inherit({
590616
if (browser.addEventListener) {
591617

592618
// 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);
598621

599622
if (browser.transitions) {
600623
element.addEventListener('webkitTransitionEnd', events, false);

0 commit comments

Comments
 (0)