setTimeout仅在第一次导致它的事件时不起作用

时间:2016-02-02 04:52:11

标签: javascript jquery settimeout blur

在下面的代码中,我想在提及var hasFocus=False;<textarea>模糊500毫秒后设置<input>。此代码立即转为hasFocus=False,而不是第一次等待500毫秒。之后,它按预期工作 我无法理解为什么它第一次没有按预期运行!

$(function(){
    var hasFocus=false;

    $("textarea[name='question1'], input[name^=q1_option]").blur(function(event){
        setTimeout(function(){
            hasFocus=false;
        },500);
    }).focus(function(){
       hasFocus=true;
    });

    $(document).on('click',function(e){
        console.log("focus :" +hasFocus);
        if(hasFocus)
        {
           alert("Working!!"); //Now this does not come up for the first time!
        } 
    })
});

3 个答案:

答案 0 :(得分:1)

那是因为你的console.log在触发超时模糊事件之前执行,因此控制台会显示之前的值。移动console.log("focus :" +hasFocus);blur功能中的focus以查看一切正常。

演示 - Fiddle

答案 1 :(得分:1)

经过大量的轰动,我想出了这个。它不是我的确切代码,而是一个演示,它完全按照我想要的方式工作:

 $(function(){
    var hasFocus=false;

    $("textarea[name='question1'], input[name^=q1_option]").blur(function(event){
        setTimeout(function(){
            hasFocus=false;
        },500);
    }).focus(function(){
       setTimeout(function(){ //just initiated focus event after blur event
              hasFocus=true; //just initiated focus event after blur event
          },510); //just initiated focus event after blur event
    });

    $(document).on('click',function(e){
        console.log("focus :" +hasFocus);
        if(hasFocus)
        {
           alert("Working!!"); //Now this does not come up for the first time!
        } 
    })
});

答案 2 :(得分:0)

        setTimeout(function(){
        hasFocus=false;
    },500, function() {hasFocus=true;});

只需添加:f unction(){hasFocus = true;} 到setTimeout函数的末尾。或者创建一个将hasFocus变量设置为true的函数,并在完成setTimeout函数时调用此函数。

您可以在那里阅读有关setTimeout函数的更多信息:http://www.sitepoint.com/jquery-settimeout-function-examples/

编辑:哦,如果这种方法不起作用,那么尼古拉是对的! :)