问题描述
我正在尝试向正在使用的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 (将#修改为@)