JavaScript-取消鼠标悬停事件的有效方法。。。请继续阅读,了解原因

JavaScript-取消鼠标悬停事件的有效方法。。。请继续阅读,了解原因,javascript,javascript-events,Javascript,Javascript Events,所以我正在创作一个完全客户端的web语言参考网站。我今天遇到的一个问题。。。我有一个侧面板,它是一个无序的术语列表,它们有onmouseover事件侦听器。我决定在执行之前添加一个延迟,如果鼠标不再在该元素上,则在运行时取消该事件。这就是我想到的,但我觉得一定有更好的办法 var currentXCoordinate=0 var currentYCoordinate=0 var elementFromCurrentMousePosition=0 function trackCurrentMous

所以我正在创作一个完全客户端的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函数之前只等待给定的一段时间。如果在运行时光标不再位于列表元素上,函数将停止,返回0



遗憾的是,这是我能想到的最好的办法。如果有人能提供更好的解决方案,我将不胜感激。

为什么不使用
mouseout
来判断鼠标何时离开元素?每次鼠标移动时运行所有这些代码并不理想


另外,您真的不应该像那样将字符串传递给
setTimeout
。而是传递一个函数。作为奖励,您可以去除那些有害的全局变量
arg1
arg2
。由于这些是全局的,我认为如果在超时过期之前再次调用init,您将遇到问题。

您应该花一些时间来正确格式化代码,并提供一些html。这会有很大帮助。您的代码缺少一个右括号。我在尝试使用mouseout时遇到的问题是,当使用延迟时,使用mouseout取消执行是通过cancelTimeout()方法解决的,这意味着我必须在setTimeout()上附加一个全局变量这样我就可以通过一个论点。导致的问题是每次光标移动到新元素上时,setTimeout的全局变量都会被覆盖。使mouseout事件仅取消应取消的事件的子集。我明白了你传递字符串而不是函数的意思。谢谢你的提示。