3

我对 javascript 比较陌生,所以请不要反对我。

我有一些代码应该让用户有一点时间从基本菜单到达子菜单。我的问题是代码一直以奇怪的顺序执行。

这是代码:

function onFocusOut() {
    var tester = 0;
    setTimeout(function(){menuReset(tester)},1000);
}

function menuReset(tester) {    
    var hoverCheck = function (event) {
        alert("#navBase a has focus"); //is fired, but to late...
        var tester = event.data.varTester;
        var tester = 1;
    };

    jQuery('#navBase').on('mousemove', 'a', { varTester: tester }, hoverCheck);
    jQuery('#navBase').off('mousemove', 'a', { varTester: tester }, hoverCheck);

    alert(tester);   //This keeps firing first, before the alert in hoverCheck

    if(tester == 1){
        alert("tester = 1");
        return;
    }

    else {
        jQuery('#navBase ul').hide();
        jQuery('#navBase').css({'width': ''});
        jQuery('#navBaseAnchor').css({
            'width': '', 'color': '', 
            'font-size': '', 
            'border-bottom-style': '', 
            'border-bottom-width': '', 
            'border-bottom-color': ''});

        tester = 0;
    }
}

现在,在执行 hoverCheck 函数(应该将“tester”设置为 1)并在该函数中触发警报之前,我不断收到“tester”为 0 的警报。

有人可以告诉我我做错了什么吗?

4

4 回答 4

1

我对 JS 也很陌生,但是您是否也应该注意变量范围错误?

您已经tester在本地声明 inonFocusOut()和 in menuReset(tester),然后在外面将其称为全局 var?

来自answers.oreilly.com

  • LOCAL - 是那些特定于某个功能且仅适用于它的功能。
  • GLOBAL - 是那些未在函数中定义的函数,也可以用于函数,除非函数不需要该变量。
于 2012-08-08T08:08:01.087 回答
1

没关系的人......我找到了解决这一切的方法。目前,我正在.focus()为所涉及的锚设置 a mouseOver。(当然还有blur()mouseleave然后使用 . 检查当前聚焦的元素真的很容易document.activeElement

所以问题解决了,尽管方式有点不同。

于 2012-08-08T13:23:48.817 回答
0

alert(tester)是执行您作为用户注意到的某事的第一行代码。这两个函数调用jQuery().on()并且jQuery().off()仅附加事件处理程序。如果要在警报中看到“1”,则必须在执行之前快速移动鼠标hoverCheck。但可能你的手移动速度不能超过 JavaScript 到达下一行,即alert()等于tester“0”的行。

于 2012-08-08T07:55:51.070 回答
-1

稍微不同的方法是设置 Javascript timeout() 如果不满足某个条件,则在一定时间后使子菜单消失。

查看这个 JSFiddle 示例

祝你好运!

于 2012-08-09T21:53:16.407 回答