【问题标题】:Detecting if navigator.vibrate can be called检测是否可以调用 navigator.vibrate
【发布时间】:2021-12-25 15:16:18
【问题描述】:

我最近注意到 Chrome 中的一个错误弹出窗口告诉 navigator.vibrate 只能在用户与页面交互后调用:

我可以更改我的页面以请求用户交互(例如使用按钮),但我宁愿保持我的页面不变。但是我需要知道我是否可以调用 navigator.vibrate。

我的第一个方法是在第一个 touchstart 事件之后将布尔值设置为 true:

let canVibrate = false;
document.addEventListener("touchstart", () => {
    if (canVibrate) {
        navigator.vibrate(200);
    } else {
        canVibrate = true;
    }
});

当用户用一根手指触摸时,第一种方法有效,因此可能是大多数情况。

但是,如果用户在拉动它的手指之前放下另一个手指,这将不起作用。在这种情况下,在移除所有手指之前完成的每次触摸都会弹出错误。然后,它还需要再触摸一次,好像所有这些都不算交互。

是否有任何 javascript 函数可以让我知道是否可以调用 navigator.vibrate?如果不是,有什么方法可以测试它?

【问题讨论】:

    标签: javascript google-chrome touch-event


    【解决方案1】:

    根据MDN page for touch events 上的示例

    这会调用 event.preventDefault() 来阻止浏览器继续处理触摸事件(这也阻止了鼠标事件也被传递)。然后我们获取上下文并将更改的触摸点列表从事件的 TouchEvent.changedTouches 属性中提取出来。

    举个例子,你可以这样做:

    let canVibrate = false;
    document.addEventListener("touchstart", (event) => {
        if (!canVibrate) {
            canVibrate = true
        }
        navigator.vibrate(200);
    });
    

    【讨论】:

    • (1) 我不明白 preventDefault 在这种情况下对我有何帮助...我对其进行了测试,通过您的解决方案,chrome 给出了另一个错误:“无法在被动事件侦听器中阻止默认值由于目标被视为被动。请参阅chromestatus.com/features/5093566007214080"
    • (2) 所以我在 document.addEventListener 中添加了 {passive: false},但随后 Chrome 继续出现第三个错误:“例如,“忽略使用可取消 = false 取消触摸启动事件的尝试因为滚动正在进行中,不能被打断。”它还告诉 navigator.vibrate 的调用被阻止,就像以前一样......所以不,我不认为 preventDefault 解决了它
    • 好的尝试删除阻止默认值并按原样使用答案。而不是像您在问题中那样使用 if else
    • ...?是的,当然它会调用该函数,但它不会振动,它仍然会发出错误。这不是我要的,我不想调用 navigator.vibrate 直到用户进行了足够的交互以使错误不会触发
    • 尝试切换到 touchend 事件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    相关资源
    最近更新 更多