javascript中的执行顺序问题

时间:2012-08-08 07:43:53

标签: javascript function execution

我是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”为0的警报(应该将“tester”设置为1)并在该功能中触发警报。

有人能告诉我我做错了吗?

4 个答案:

答案 0 :(得分:1)

我对JS也很新,但你是否也应该注意变量范围错误呢?

您已在testeronFocusOut()中本地声明menuReset(tester),然后将其称为全局变量外部?

来自answers.oreilly.com

  
      
  • LOCAL - 是那些特定于某个功能并且仅对其起作用的那些。
  •   
  • GLOBAL - 是那些未在函数中定义的函数,也可能是函数函数,除非函数没有要求函数   变量
  •   

答案 1 :(得分:1)

没关系... 我找到了解决这个问题的方法。 目前我正在为.focus()上涉及的锚点设置mouseOver。 (当然blur()上的mouseleave) 然后使用document.activeElement检查当前聚焦的元素真的很容易。

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

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

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

查看this JSFiddle example

祝你好运!