jQuery Endless Loop来更新状态

时间:2013-04-24 07:11:36

标签: jquery loops while-loop

我有一个功能,每次从下拉列表中选择一个复选框div时都会调用它。以下是我的功能:

function arming(){
            $('#armText').change(function(){
                if ($('#armCB_1').is(':checked')){
                    $.post('/request', {key_pressed:"arming_status"}).done(function(reply){
                        $('#armStatus').empty().append("<h3>The Arming Status is " + reply).show();
                    });
                }
                else{
                    $('#armStatus').hide();
                }
            });
        }

我的问题是,如何在一段时间内更新“armStatus”并且只在未选中复选框时停止更新?此外,我希望程序的其余部分继续运行。是否可以使用while(1)作为无限循环?

5 个答案:

答案 0 :(得分:3)

您可以创建一个自我循环的函数,直到满足条件:

function loopFunction() {
    var $ = jQuery,
    if (!$('#armCB_1').is(':checked')){
        //do something
        setTimeout(function() {
            loopFunction();
        }, 500);
    }
}

答案 1 :(得分:2)

var $arm = $('#armStatus'),
    $checkbox = $('#armCB_1');

$checkbox.change(function() {
   $arm.toggle(this.checked);
})

setInterval(function(){
  if ($checkbox.is(':checked')) { // if ($arm.is(':visible')) { 
     $.post('/request', {key_pressed:"arming_status"}).done(function(reply){
           $arn.html("<h3>The Arming Status is " + reply).show();
     });
  }
}, 1000);

答案 2 :(得分:1)

您有两种选择。 setInterval和setTimeout。 使用setInterval,您可以使用clearInterval结束循环。

e.g。

setInterval(function(){}, 200)

函数中的代码将在每200ms后运行。以下代码符合您的要求

function arming() {
    var loop = setInterval(function () {
        $.post('/request', {
                key_pressed: "arming_status"
            }).done(function (reply) {
                $('#armStatus').empty().append("<h3>The Arming Status is " + reply).show();
            });
    }, 200)
    $('#armText').change(function () {
        if ($('#armCB_1').is(':checked')) {            
            clearInterval(loop);
        } else {
            $('#armStatus').hide();
        }
    });
}

答案 3 :(得分:1)

您可以使用window.setTimeout(action,n)。更好的解决方案可以在这里找到[链接] aktuell.de.selfhtml.org/artikel/javascript/timer/#timer(文本德语,只看源头)。你只需要在自己的

上禁用/启用这个Timer

答案 4 :(得分:0)

所以我的程序的当前解决方案是:

function arming() {
var loop = setInterval(function () {
    $.post('/request', {
            key_pressed: "arming_status"
        }).done(function (reply) {
            $('#armStatus').empty().append("<h3>The Arming Status is " + reply).show();
        });
}, 200)
$('#armText').change(function () {
    if (!$('#armCB_1').is(':checked')) {            //if it is unchecked
        clearInterval(loop);
    } 
});

}

但是如果我选中并取消选中复选框,它就不会再这样做了。

更新 - 更好的解决方案:

function arming() {
            var $arm = $('#armStatus'),
                $checkbox = $('#armCB_1');

            $checkbox.change(function() {
               $arm.toggle(this.checked);
            })

            setInterval(function(){
              if ($checkbox.is(':checked')) { 
                 $.post('/request', {key_pressed: "arming_status"}).done(function (reply) {
                    $('#armStatus').empty().append("<h3>The Arming Status is " + reply).show();
                 });
              }
              else {
                  $arm.hide();
              }
            }, 2000);
        }