1

我使用 ajax 从 php 脚本中接收一些变量。如果变量变为 TRUE,我想运行 JavaScript 警报功能窗口。当用户确认警报时,我想将一个新值发送回另一个 php,该 php 更新了 sqlite 中的表,并且警报功能恢复正常。

我的问题是我使用 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>
4

2 回答 2

2

JavaScriptsetInterval本身并不能正常工作。更不用说ajax了。ajax 是异步的。在 ajax 上使用回调success来确定是否弹出窗口。

当您发出过多的 ajax 请求时,浏览器会将它们排队。所以他们不保证在 1 秒内结束。

从评论中编辑:

在您的 ajax 调用上使用 call 可确保您的 add_hops 函数在您的 ajax 调用终止之前不会被调用。

谢谢。

于 2013-04-11T08:56:50.593 回答
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 请求。

参考

于 2013-04-11T08:59:49.193 回答