Javascript 为什么参数没有一直发送到setInterval()中的函数?

Javascript 为什么参数没有一直发送到setInterval()中的函数?,javascript,jquery,scope,setinterval,Javascript,Jquery,Scope,Setinterval,我有一个通过Ajax自动刷新内容的页面。我希望这是微妙的,所以我不想显示我的加载gif在自动页面刷新。所以我用我的getPosts函数做了一些类似的事情。为了简洁起见,删去了不必要的代码 function getPosts(image) { //loading icon while getPosts if (image) { $("#p

我有一个通过Ajax自动刷新内容的页面。我希望这是微妙的,所以我不想显示我的加载gif在自动页面刷新。所以我用我的getPosts函数做了一些类似的事情。为了简洁起见,删去了不必要的代码

function getPosts(image) 
            {
                //loading icon while getPosts
                if (image)
                {
                    $("#postcontainer").bind("ajaxStart", function(){
                        $(this).html("<center><img src='ajax-loader.gif' /></center>");
                });
                } //... ajax call, etc. don't worry about syntax errors, they aren't in real code
我知道中间的标签已经过时了,只是一个无耻的捷径。 然后我将设置像setIntervalfunction{getPostsfalse;},10000; 因此,我的自动呼叫不会触发图像显示 然后,我所有的手动刷新都会像getPoststrue那样调用它

您可能可以在以下位置看到正在运行的bug:

问题是,setInterval函数似乎使用了最新函数调用中的image bool。因此,在自动呼叫期间,它不会首先显示图像,但在我单击手动刷新后,它会在每次呼叫期间开始显示图像

我该如何应对


感谢所有查看/发布此主题的人!我希望这个问题能成为其他人的好参考。

因为在第一次手动刷新之后,您附加了一个事件处理程序ajaxstart,用于在ajax调用启动时显示图像。现在,即使调用image=false的函数,该事件处理程序仍然存在。它将在所有ajax调用中被触发

您需要做的是:

 $("#postcontainer").bind("ajaxStart", function(){
                        $(this).html("<center><img src='ajax-loader.gif' /></center>")
          //Remove event handler
          $(this).unbind("ajaxStart");
});

问题是,一旦将ajaxStart处理程序绑定到容器,它将在该容器的每个ajax调用上执行。也就是说,第一次使用getPoststrue调用它时,它将创建绑定。下一次使用getPostsfalse调用它时,它不会沿着if路径进行,但绑定仍然存在,因此在执行ajax调用时,处理程序仍然执行,并且处理程序没有任何条件逻辑。实际上,我相信在ajaxStart事件上会有多个绑定,每次调用getPoststrue时都会创建一个绑定,但是它们可能不被注意到,因为它们只是做同样的事情来覆盖相同的html

为什么不这样做:

function getPosts(image) {
  if (image) {
    $("#postcontainer").html("<center><img src='ajax-loader.gif' /></center>");
  }

  // Actual ajax call here
}

setInterval(function() { getPosts(false); }, 10000);