0%

解决 Touch 事件与 Scroll 事件的冲突问题

开发移动应用时会遇到一个 UI 里面既可以点击(touchend)又可以滑动(scroll window)的情况,如果同时绑定两个事件就会同时执行,这是我们所不愿意看到的情况。大致解决思路是通过一个变量标记当前的触摸状态,当手指移动时标记为正在拖拽,而没有移动的时候则标记为没有在拖拽。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// jQuery 代码 
var isDragging = false, element = $('#element');
element.on('touchstart', '.target', function(event) {
isDragging = false;
});
element.on('touchmove', '.target', function(event) {
isDragging = true;
});
element.on('touchend', '.target', function(event) {
if(isDragging) return false;
var self = $(this);
// 点击时的业务代码
console.log(self);
});

// 原生 JS 代码(ES5)
var isDragging = false,
element = document.querySelector('#element');
element.addEventListener('touchstart', function(event) {
isDragging = false;
}, false);
element.addEventListener('touchmove', function(event) {
isDragging = true;
}, false);
element.addEventListener('touchend', function(event) {
if(isDragging) return false;
var self = event.target,
t = 'target';
while(self && self.classList && !self.classList.contains(t)){
self = self.parentNode;
}
// 点击时的业务代码
console.log(self);
}, false);

欢迎关注我的其它发布渠道