用户使用特定的鼠标移动来触发javascript

问题描述

我正在尝试向正在使用的Chrome扩展程序添加功能,从而在用户移动鼠标时关闭警报声音,这意味着那里的某个人正在承认他们已经听到了警报。

这是该想法的第一个实现:

content_script.js

document.onmousemove = function(e){
    chrome.runtime.sendMessage({mouse: "moving"});
};

background.js

chrome.runtime.onMessage.addListener( function(request) {
    if (request.mouse == "moving") {
        if ( soundPromise ) {
            sound_elem.pause();
        }
    }
});

这是可行的...但是,由于某种原因,添加代码后,有时警报有时无法播放,这使我认为onmousemove可能是在没有实际移动鼠标的情况下触发的。我已经断开了所有USB鼠标的连接,并正在使用计算机的触控板,但也许它只是便宜的触控板,不太准确,或者与软件相关...(顺便说一句,我没有使用MouseJiggler等任何软件,或者类似的东西。)

我能想到的解决方案是添加一些代码,以测量指针开始移动之前,仅在指针移动了一定距离后才能明显到达的点,该距离显然不能被触控板错误或MouseJiggler之类的东西复制,例如100px,它将消息发送到后台脚本。

但是,我在编写代码时遇到了麻烦,该代码“了解”用户完成的指针的流畅运动,即在特定运动开始时获取鼠标位置,然后在更新过程中获取每次更新的代码相同的动作,并在达到一定距离后触发。这意味着它必须识别鼠标已被单独放置,并且必须识别一个单独的移动(例如,用指针从一侧到另一侧画一条线),而不仅仅是对每个单独的鼠标移动求和(例如,移动鼠标)左移一点,将其留在那儿,几分钟后,将其向上移一点,留在那儿,等等。

然后,我想知道是否有一种更“优雅”的方式来解决此问题,而无需使用“变通办法”来确保鼠标移动所覆盖的距离一定。可能还有其他(更好)的方法来确保是在警报关闭之前用户实际上在移动鼠标。有什么想法吗?

编辑:到目前为止,我最好的主意

因此,我当然会继续尝试常识性方法,例如,它正在起作用,并且似乎可以避免上面提到的问题。但是,我仍然觉得必须有一种更好,更优雅的方法。所以我愿意接受所有建议!

content_script.js

var mousEventInterval;
var mousePosLast = {x: null,y: null};
var mouseTravel = {x: null,y: null};
document.onmousemove = function(e){
    clearInterval(mousEventInterval);
  mouseTravel.x = Math.abs(e.clientX - mousePosLast.x);
  mouseTravel.y = Math.abs(e.clientY - mousePosLast.y);
  if ( mouseTravel.x > 100 || mouseTravel.y > 100 ) {
    chrome.runtime.sendMessage({mouse: "moving"});
  }
  mousEventInterval = setInterval( function() {
        mousePosLast.x = e.clientX;
    mousePosLast.y = e.clientY;
  },500);
};

在这里运行它:https://jsfiddle.net/9xd7Lbfr/

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)