鼠标移动速度非常快时,无法正确捕获Javascript鼠标事件

时间:2010-04-08 05:53:05

标签: javascript events event-handling mouse

当我非常快速地移动鼠标而未触发事件时,我正在使用JavaScript mouseover和mouseout事件。你能告诉我这是什么问题吗?

请让我知道如何解决这个问题。如果还有其他需要,请告诉我。

这是代码

HTML

4 => qq[
    <ul id="primary">
        <li id="firstTab" onmouseover="changeSecondaryMenu('index','explore');" onmouseout="changeSecondaryMenu('explore');"><a></a></li>
        <li id="secondTab" onmouseover="changeSecondaryMenu('home','explore');" onmouseout="changeSecondaryMenu('explore');"><a></a></li>
        <li id="thirdTab" onmouseover="changeSecondaryMenu('requests','explore');" onmouseout="changeSecondaryMenu('explore');"><a></a></li>
        <li onmouseover="changeSecondaryMenu('explore','explore');"><a class="current" href="contact.pl">About Site</a></li>
    </ul>
],
);

my $primary_menu = $primary_menu{$primary_index};

my %secondary_menu = (
    1 => qq[
        <ul id="secondary" onmouseover="cancelTimeOut();" onmouseout="resetTab(event);">
            <li> <a>Summary</a> </li>
            <li> <a>Updates</a>  </li>
            <li> <a>History</a> </li>
            <li> <a>News/Stats</a> </li>
            <li> <a>Gratitude & Good Life</a> </li>
        </ul>
    ],

的JavaScript

function cancelTimeOut(){
    clearTimeout(timer);
}

function resetTab(evt){
    var evt = evt || window.event; // event object
    var target = evt.target || window.event.srcElement; // event target
    var targetID = target.getAttribute("id");
    if (targetID == "secondary") {
        clearTimeout(timer);
        if(currentTab !=null){
            document.getElementById("secondary").innerHTML = tabs[currentTab];
            Rounded("ul#secondary","tr","#FFFFFF","transparent","smooth");
        }
    }
}

function changeSecondaryMenu(tab,selectedTab) {
    currentTab = selectedTab;
    clearTimeout(timer);
    document.getElementById("secondary").innerHTML = tabs[tab];
    Rounded("ul#secondary","tr","#FFFFFF","transparent","smooth");
}

1 个答案:

答案 0 :(得分:5)

这取决于。 Javascript不会尝试在“框架”之间进行插值。意思是,是的,如果你移动你的鼠标足够快,一个mousemove事件将在你的对象的一侧触发,而下一个mousemove将在另一侧触发,因此mouseover和out永远不会被触发,你也不会更聪明。

如果您捕获这些事件绝对至关重要,那么您将不得不自己做一些工作。您可以自己挂钩移动鼠标,并且对于每个事件触发,比较上次触发时鼠标的位置和当前的火焰。你需要在这里做一个小几何,但是如果由两个点创建的线击中有问题的对象的边界框(4个基于每个边比较,或者2比较基于X通过框),然后手动触发鼠标悬停。然后是mouseout。