2013-04-24 37 views
2

我有一个函数,并会每次从下拉列表中选择一个复选框div时调用它。下面是我的函数:jQuery无尽循环更新状态

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”为在一定时间内,只有停止在复选框取消选中更新?另外,我想让程序的其余部分继续运行。是否可以使用一段时间(1)作为无限循环?

回答

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); 
     } 
1

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

例如

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(); 
     } 
    }); 
} 
+0

谢谢!但为什么clearInterval时复选框被选中?它应该在别人之下吗? – yvonnezoe 2013-04-24 07:46:08

+0

它应该是任何时候你想循环完成。我可能会把它放在错误的地方 – basarat 2013-04-24 09:57:57

3

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

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

谢谢你的答案:) – yvonnezoe 2013-04-24 08:21:21

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); 
+0

再次感谢您的解决方案。 :)在这种情况下,我将如何清除间隔? – yvonnezoe 2013-04-24 08:36:08

+0

@yvonnezoe没有必要清除间隔,我用'if'语句代替。 – undefined 2013-04-24 08:44:31

+0

ohh:D是的,它的工作原理!谢谢:) – yvonnezoe 2013-04-24 08:48:19

1

您可以使用window.setTimeout(动作,N) 。一个更好的解决方案可以在这里找到[链接] aktuell.de.selfhtml.org/artikel/javascript/timer/#timer(文本德语,只看源头)。你会“只是”必须禁用/上启用这个定时器自己

+0

谢谢你的回答+1 – yvonnezoe 2013-04-24 08:24:59