取消鼠标悬停事件的有效方法.继续往下读,看看为什么
An efficient way to cancel a mouseover event... read on to see why
我正在创作一个完整的客户端web语言参考网站。我今天遇到的一个问题;我有一个侧面面板,是一个无序的术语列表,它们有onmouseover
事件监听器。我决定在执行之前添加延迟并在运行时取消事件,如果鼠标不再位于该元素上,这将是一个好主意。这就是我想到的办法,但我觉得一定有更好的办法。
var currentXCoordinate=0
var currentYCoordinate=0
var elementFromCurrentMousePosition=0
function trackCurrentMousePosition(event) {
if (document.elementFromPoint(event.clientX, event.clientY).nodeName=="SPAN") {
elementFromCurrentMousePosition=document.elementFromPoint(event.clientX, event.clientY).parentNode
}
else {
elementFromCurrentMousePosition=document.elementFromPoint(event.clientX, event.clientY)
}
return (currentXCoordinate=event.clientX, currentYCoordinate=event.clientY, elementFromCurrentMousePosition)
}
function initPreview(event, obj) {
arg1=event
arg2=obj
setTimeout("setPreviewDataFields(arg1, arg2)", 100)
}
function setPreviewDataFields(event, obj) {
if ('bubbles' in event) {
event.stopPropagation()
}
else {
event.cancelBubble=true
}
if (elementFromCurrentMousePosition!=obj) {
return 0;
}
如果执行没有被前面的if语句取消,代码会继续做我想让它做的所有美妙的事情。问题是这种方法似乎真的是处理器密集型的。
总结一下:在页面加载时,所有的事件侦听器都注册了,光标位置由onmousemove
事件跟踪。适用的列表项有一个onmouseover
事件,该事件调用initPreview
函数,该函数在调用实际的setPreviewDataFields
函数之前等待给定的一段时间。如果在运行时游标不再位于list元素上,则函数在return 0
处停止。
为什么不直接使用mouseout
来告诉鼠标何时离开元素呢?每次鼠标移动时都运行所有的代码是不理想的。
同样,你真的不应该像这样传递一个字符串给setTimeout
。而是传递一个函数。作为奖励,您可以摆脱那些邪恶的全局变量arg1
和arg2
。这些是全局的,我认为你会遇到问题,如果init在超时到期之前再次被调用。
相关文章:
- 为什么不't Javascript对我的输入值进行了一些重新检查
- 为什么“;未定义的“;在JavaScript中结束循环
- 为什么这在IE中的工作方式与在Firefox中不同
- 知道为什么我的旋转木马不会自动更改图片吗
- 为什么会出现错误;未捕获的类型错误:undefined不是函数;
- 为什么在单独的函数中应用时转换会闪烁/断断续续(D3)
- 为什么在变形之前不缺少Fx
- 为什么继续;语句冻结浏览器
- 为什么javascript ES6 Promises在解析后继续执行
- 为什么“;继续”;JavaScript中的语句不正确
- 如果我不这样做会发生什么;t有页码吗?继续循环帖子..为什么需要分页,对于页脚
- 为什么对匿名函数的引用继续存在
- 为什么这个呼叫在继续之前没有等待响应
- 取消鼠标悬停事件的有效方法.继续往下读,看看为什么
- 为什么重置 setInterval 它继续调用多个函数实例而不是一个
- Ember js:在我的例子中,为什么路由器中的逻辑会继续,即使其中使用的功能还没有完成
- 为什么即使第一个if语句为真,它也会跳过并继续
- 为什么节点上的requirejs在继续之前没有加载指定的require
- 为什么 JavaScript 在我关闭我的安卓应用程序后继续
- 为什么这段代码继续循环?