我使用ajax从php脚本中恢复一些变量。如果变量变为TRUE,我想运行JavaScript警报功能窗口。当用户确认警报时,我想将一个新值发送回另一个更新sqlite中的表的php,并且警报功能恢复正常。
我的问题是我使用setInterval每秒更新一次变量。这意味着我的警报窗口也会每秒弹出一次..
有没有更好的方法呢?
她是我的一些代码:
<script type="text/javascript">
$.ajaxSetup({ cache: false });
setInterval(function(){
$.getJSON('statusdata.php',function(data) {
hops = data["add_hops"];
if (hops == 1)
{
add_hops();
}
});
}, 1000);
这是我的javascript:
<script type="text/javascript">
function add_hops()
{
startwindow=window.open("http://192.168.1.5/Birger/hops_alarm.html", "startwindow",
"location=1,
status=0,scrollbars=0,width=750px,hight=350px");
startwindow.moveTo(640,300);
}
</script>
答案 0 :(得分:2)
JavaScript不会让setInterval
本身正常工作。更别说ajax了。 ajax是异步性质。在ajax success
上使用回调来确定是否显示弹出窗口。
当您发出太多的ajax请求时,浏览器会将它们排队。因此他们不保证在1秒内结束。
修改强> 来自评论:
在ajax调用上使用call确保在ajax调用终止之前不会调用add_hops函数。
谢谢你。
答案 1 :(得分:0)
防止代码重复警报的最佳方法是将超时捕获到变量中,如下所示:
var myTimeout = setTimeout(function () {
// …
}, 1000);
现在你有一个超时的引用,你可以用这一行取消它:
if (myTimeout) clearTimeout(myTimeout);
要在函数中使这个工作,你需要将clearTimeout行插入你的匿名函数,如下所示:
var hops = null;
var myTimeout = setInterval(function(){
if (hops == 1) {
clearTimeout(myTimeout);
return;
}
$.getJSON('statusdata.php',function(data) {
hops = data["add_hops"];
if (hops == 1) {
add_hops();
}
});
}, 1000);
将clearTimeout()调用添加到匿名函数而不是$ .getJSON()调用可防止代码在延迟连接上执行不必要的AJAX请求。
参考