正在加载消息和setTimeout

时间:2011-02-13 08:38:28

标签: javascript jquery

我有以下脚本:

$(function() {
    $(".message").hide();

    function simulate_ajax_call()
    {
        $.ajax({
            url: "/echo/json/",
            success: function(){
                alert("done");
                $(".message").empty().html("done");
                $(".message").delay(1000).fadeOut(500);
            }
        });
    }

    $('.button').click(function() {
        $(".message").fadeIn(500);
        setTimeout("simulate_ajax_call()", 5000);
    });
});

使用以下HTML:

<input type="button" value="button" class="button" />
<div class="message">loading...</div>

由于某种原因,setTimeout部分无效。即在5000ms之后似乎没有调用该函数。

jsFiddle

3 个答案:

答案 0 :(得分:9)

您需要替换:

setTimeout("simulate_ajax_call()", 5000);

使用:

setTimeout(simulate_ajax_call, 5000);

Check out the working example


您应该避免将()放在函数名的末尾,否则 it gets called/run immediately :)

答案 1 :(得分:4)

You need to drop the quotes and the parenthesis

执行setTimeout("simulate_ajax_call()", 5000)相当于eval()自动运行该功能的代码。

答案 2 :(得分:1)

setTimeout eval是全局范围内的字符串参数,但simulate_ajax_call是在嵌套范围内声明的,因此eval无法找到它以便调用它。

正如其他两个答案指出解决问题的最佳方法是使用setTimeout的函数传递版本,但要小心删除括号,因为你不想意外调用立即运作。

如果您在全局范围内声明simulate_ajax_call,那么您的代码可能会有效。在这种情况下,括号本来是正确的,尽管setTimeout的字符串版本一般来说仍然是个坏主意。