如何仅在使用 pen/stylus 而不是手指触摸时停止滚动
How to stop scrolling only on using pen/stylus and not on finger touch
我正在开发一个网络应用程序,它需要防止使用手写笔滚动,但仍然允许用手指滑动屏幕时滚动。
我 运行 遇到的问题是只有 pointerstart 事件可以通过 e.pointerType 区分手指触摸和手写笔触摸。
但似乎无法从指针向下停止滚动,需要使用无法检测手指与stylus/pen之间差异的touchstart。
On Google Keep 这是通过设置 css touch-events:none;在 canvas 上,如果是手指触摸,则使用指针事件生成模拟平移,但这看起来很老套。
我要实现的示例代码
canvasElement.addEventlistener("pointerdown", function(event){
if(event.pointerType === "pen"){
// Disable scroll - This doesn't work
event.preventDefault();
event.stopPropagation();
// Start drawing stuff
startDrawing(...);
} else {
// Is a touch event do nothing, let it scroll naturally
}
});
有什么方法可以不模拟卷轴吗?
我实际上想出了如何做到这一点,有人可能会认为一种可能的方法是仅当 pointerdown 是手写笔时才有条件地设置 touch-action: none css 属性,但是不起作用,设置 css 当 pointerdown 已经太迟并且滚动将在之后启动。
我最终这样做的方式是我有一个指针按下侦听器来检测手写笔,将其存储为一个变量,然后在它之后触发一个 touchstart 监听器,仅当最后一个指针按下是手写笔时才防止默认。
var isPen = false;
document.body.addEventListener("pointerdown", function(e){
if(e.pointerType === "pen"){
isPen = true;
console.log("draw");
} else {
isPen = false;
}
e.preventDefault();
}, {
capture: true
});
document.body.addEventListener("touchstart", function(e){
if(isPen){
e.preventDefault();
}
}, {
passive: false,
capture: false
});
我正在开发一个网络应用程序,它需要防止使用手写笔滚动,但仍然允许用手指滑动屏幕时滚动。
我 运行 遇到的问题是只有 pointerstart 事件可以通过 e.pointerType 区分手指触摸和手写笔触摸。
但似乎无法从指针向下停止滚动,需要使用无法检测手指与stylus/pen之间差异的touchstart。
On Google Keep 这是通过设置 css touch-events:none;在 canvas 上,如果是手指触摸,则使用指针事件生成模拟平移,但这看起来很老套。
我要实现的示例代码
canvasElement.addEventlistener("pointerdown", function(event){
if(event.pointerType === "pen"){
// Disable scroll - This doesn't work
event.preventDefault();
event.stopPropagation();
// Start drawing stuff
startDrawing(...);
} else {
// Is a touch event do nothing, let it scroll naturally
}
});
有什么方法可以不模拟卷轴吗?
我实际上想出了如何做到这一点,有人可能会认为一种可能的方法是仅当 pointerdown 是手写笔时才有条件地设置 touch-action: none css 属性,但是不起作用,设置 css 当 pointerdown 已经太迟并且滚动将在之后启动。
我最终这样做的方式是我有一个指针按下侦听器来检测手写笔,将其存储为一个变量,然后在它之后触发一个 touchstart 监听器,仅当最后一个指针按下是手写笔时才防止默认。
var isPen = false;
document.body.addEventListener("pointerdown", function(e){
if(e.pointerType === "pen"){
isPen = true;
console.log("draw");
} else {
isPen = false;
}
e.preventDefault();
}, {
capture: true
});
document.body.addEventListener("touchstart", function(e){
if(isPen){
e.preventDefault();
}
}, {
passive: false,
capture: false
});