为什么 setInterval() 中的参数始终不发送到函数?
我有一个通过 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
我知道中心标签已被弃用,只是一个无耻的快捷方式。
然后我将设置间隔,例如 setInterval(function() { getPosts(false); }, 10000);
因此我的自动调用不会触发图像显示
然后,我所有的手动刷新都会像这样调用它 getPosts(true);
您可以(可能)在 我的个人网站
问题是,setInterval 函数似乎使用了最新函数调用中的图像 bool 。因此,在自动呼叫期间,它首先不会显示图像,但在我单击手动刷新后,它会在每次呼叫期间开始显示图像。
我该如何应对?
感谢任何查看/发布此主题的人!我希望这个问题能够成为其他人的一个很好的参考。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
问题是,一旦您将“ajaxStart”处理程序绑定到容器,它将在该容器的每个 ajax 调用上执行。也就是说,第一次使用
getPosts(true)
调用它时,它将创建绑定。下次您使用getPosts(false)
调用它时,它不会沿着if
路径走下去,但绑定仍然存在,因此当您执行 ajax 调用时,处理程序仍然会执行- 并且处理程序没有任何条件逻辑。 (实际上,我相信您最终会在“ajaxStart”事件上获得多个绑定,每次调用getPosts(true)
时都会创建一个绑定,但它们可能并不引人注目,因为它们都只是这样做相同的事情覆盖相同的 html。)为什么不做这样的事情:
The problem is that once you've bound your "ajaxStart" handler to the container it will execute on every ajax call for that container. That is, the first time you call it with
getPosts(true)
it will create the binding. The next time you call it withgetPosts(false)
it doesn't go down thatif
path but the binding still exists so when you do your ajax call the handler still executes - and the handler doesn't doesn't have any conditional logic. (Actually, I believe you'll end up with multiple bindings on the "ajaxStart" event, one created every time you callgetPosts(true)
, but they're probably not noticable since they all just do the same thing overwriting the same html.)Why not do something like this:
因为在第一次手动刷新之后,您附加了一个事件处理程序“ajaxstart”,该事件处理程序用于在 ajax 调用开始时显示图像。现在,即使您使用 image = false 调用该函数,该事件处理程序也会存在。所有 ajax 调用都会触发它。
你需要做的是这样的:
Because after the first manual refresh you have attached a event handler "ajaxstart" which is to show the image when a ajax call starts. Now this event handler is there even in case you call the function with image = false. It will get triggered on all ajax calls.
What you need to do is something like: