2

我有一个函数,每次从下拉列表中选择一个复选框 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) 作为无限循环?

4

5 回答 5

3

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

function loopFunction() {
    var $ = jQuery,
    if (!$('#armCB_1').is(':checked')){
        //do something
        setTimeout(function() {
            loopFunction();
        }, 500);
    }
}
于 2013-04-24T07:17:37.417 回答
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);
于 2013-04-24T07:18:25.253 回答
1

你有两个选择。设置间隔和设置超时。使用 setInterval,您可以使用 clearInterval 来结束循环。

例如

setInterval(function(){}, 200)

函数中的代码每 200 毫秒运行一次。以下代码将满足您的要求

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();
        }
    });
}
于 2013-04-24T07:16:12.927 回答
1

您可以使用 window.setTimeout(action, n)。可以在此处找到更好的解决方案 [link]aktuell.de.selfhtml.org/artikel/javascript/timer/#timer(德语文本,只需查看源代码)。您将“只”必须自己禁用/启用此计时器

于 2013-04-24T07:25:33.597 回答
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);
        }
于 2013-04-24T08:23:44.277 回答