以下不会在每次滑动时将闭合x和y变量重置为零。你会如此善意地告诉我如何在每次滑动时将我的x和y变量重置为零?也可以随意使用更好的实现技术,如currying或其他东西,使其更具功能性。请注意,我更感兴趣的是,为什么它不能工作和关闭/ currying实现技术,然后检测滑动方向本身。
;(function(){
const t = function(start){
let x = 0
let y = 0
let x1 = 0
let y1 = 0
if (start) {
return function(evt){
x = 0
y = 0
console.log(x, y)
}
} else {
return function(evt){
const touches = evt.changedTouches
if (x1 > touches[0].clientX) x++
if (y1 > touches[0].clientY) y++
x1 = touches[0].clientX
y1 = touches[0].clientY
console.log(x, y)
}
}
}
document.body.addEventListener("touchstart", t(true))
document.body.addEventListener("touchmove", t(false))
}())

html, body {
margin:0;
padding:0;
width:100%;
height:100%;
}

open mobile mode and swipe in different directions

答案 0 :(得分:2)
每次调用t
都会使用自己的x
和y
变量创建自己的范围。这正是你不想要的,所以放弃那个闭包。在同一范围内创建两个处理函数:
;(function() {
let x = 0;
let y = 0;
let x1 = 0;
let y1 = 0;
document.body.addEventListener("touchstart", (evt) => {
x = 0;
y = 0;
console.log(x, y);
});
document.body.addEventListener("touchmove", (evt) => {
const touches = evt.changedTouches;
if (x1 > touches[0].clientX) x++;
if (y1 > touches[0].clientY) y++;
x1 = touches[0].clientX;
y1 = touches[0].clientY;
console.log(x, y);
});
}());