变量变为TRUE时的警报弹出窗口

时间:2013-04-11 08:39:59

标签: php javascript ajax jquery

我使用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>

2 个答案:

答案 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请求。

  

参考