请问老师,这是什么问题?正常吗?
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
div {
width: 200px;
height: 200px;
background-color: brown;
margin: 300px auto;
}
</style>
</head>
<body>
<div id="box"></div>
</body>
<script>
const box = document.getElementById('box');
class SWIPE {
constructor(ele, start={}, isdefault = { time: 500, distance: 100 }) {
this.ele = ele;
this.start = start;
this.isdefault = isdefault;
}
// 开始点击
startdown() {
const ele = this.ele;
// console.log(ele);
ele.addEventListener('touchstart',(evt)=>{
evt.preventDefault();
})
ele.addEventListener('pointerdown',(evt)=>{
this.pressdown(evt);
},false);
}
// 点击后其他事件
pressdown(evt) {
this.start.time=new Date().getTime();
this.start.x=evt.pageX;
this.start.y=evt.pageY;
// console.log(this.start);
document.addEventListener('pointerup',(evt)=>{
this.endHandler(evt)
},false);
document.addEventListener('pointercancel',(evt)=>{
this.endHandler(evt)
},false);
}
//endHandler()结束事件
endHandler(evt){
const differ={};
let direction='';
differ.time=new Date().getTime()-this.start.time;
differ.x=evt.pageX-this.start.x;
differ.y=evt.pageY-this.start.y;
// console.log(differ.time,Math.abs(differ.x),Math.abs(differ.y));
document.removeEventListener('pointerup',(evt)=>{
this.endHandler(evt)
},false);
document.removeEventListener('pointercancel',(evt)=>{
this.endHandler(evt)
},false);
this.isSwipe(differ,direction)
}
//判断是否是扫动手势
isSwipe(differ,direction){
const isdefault= this.isdefault;
if(differ.time>isdefault.time||(Math.abs(differ.x)<isdefault.distance&&
Math.abs(differ.y)<isdefault.distance)){
return;
}else{
//判断方向
if(Math.abs(differ.x)>=Math.abs(differ.y)){
if(differ.x>0){
direction='→';
}else{
direction='←';
}
}else{
if(differ.y>0){
direction='↓';
}else{
direction='↑';
}
}
}
console.log(direction);
}
}
const p = new SWIPE(box);
p.startdown();
</script>
</html>你好老师,左右上下扫和45度角去扫会触发很多次这是为什么?是不是因为鼠标按下后里面的方法一直在触发的缘故?怎么处理呢?是不是跟轮播图点击添加节流锁一个原理?
正常扫如图:
45度往角上扫:

8
收起
正在回答
1回答
同学你好,这是由于pointerup事件处理函数没有被成功清理造成的。由于上一次的pointerup等事件没被清理,导致事件重复添加,因此打印了多个结果:

可以使用一个特殊的关键字bind,辅助我们清除重复事件。bind用来改变函数中的this指向:

具体如下:



祝学习愉快!


恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星