Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
setTimeout/setInterval的Javascript循环问题 我希望每隔30秒反复检查此标志,直到标志变为0(由我无法控制的外部事件) 当标志为0时,30秒检查应结束,直到标志再次为1 只要标志为0,屏幕上的一些文本就会闪烁,如果标志返回到1,闪烁就会停止,30秒检查应该继续_Javascript_Loops_Settimeout_Setinterval - Fatal编程技术网

setTimeout/setInterval的Javascript循环问题 我希望每隔30秒反复检查此标志,直到标志变为0(由我无法控制的外部事件) 当标志为0时,30秒检查应结束,直到标志再次为1 只要标志为0,屏幕上的一些文本就会闪烁,如果标志返回到1,闪烁就会停止,30秒检查应该继续

setTimeout/setInterval的Javascript循环问题 我希望每隔30秒反复检查此标志,直到标志变为0(由我无法控制的外部事件) 当标志为0时,30秒检查应结束,直到标志再次为1 只要标志为0,屏幕上的一些文本就会闪烁,如果标志返回到1,闪烁就会停止,30秒检查应该继续,javascript,loops,settimeout,setinterval,Javascript,Loops,Settimeout,Setinterval,我试图用setTimeout/setInterval来实现这一点,但我在将它们与循环结合起来时遇到了问题 以下是从另一个站点执行闪烁操作的一些代码: var flag = 0/1 (default=1) 函数init(){ 设置间隔(闪烁,1000); } 函数blink(){ var elm=document.getElementById('blinkDiv'); 如果(elm.style.color==“#ff0000”) elm.style.color=“#ffffff”; 其他的 e

我试图用setTimeout/setInterval来实现这一点,但我在将它们与循环结合起来时遇到了问题

以下是从另一个站点执行闪烁操作的一些代码:

var flag = 0/1 (default=1)

函数init(){
设置间隔(闪烁,1000);
}
函数blink(){
var elm=document.getElementById('blinkDiv');
如果(elm.style.color==“#ff0000”)
elm.style.color=“#ffffff”;
其他的
elm.style.color=“#ff0000”;
}
一些文本

可能是这样的:

<html>
 <head>
 <script type="text/javascript">
  function init() {
    window.setInterval(blink,1000);
  }

  function blink() {
    var elm = document.getElementById('blinkDiv');
    if (elm.style.color == "#ff0000")
      elm.style.color = "#ffffff";
    else
      elm.style.color = "#ff0000";
  }
</script>
</head>
<body onload="init();" style="background-color: #ffffff;">
<div id="blinkDiv" style="color: #ff0000;">some text</div>
 </body>
</html>
试试这个:

function init() {
  //start timeout to see if flag has changed in 30 seconds
  window.setTimeout(checkState,30000);
}

var blinkIntervalID;

function checkState() {
  if(flag==0) {
    // if flag is 0 then start the blinking interval
    blinkIntervalID = window.setInterval(blink,1000);
  }
  else {
    //else clear the blinking interval and set the text to normal state
    window.clearInterval(blinkIntervalID);
    stopBlink()
  }
  // Start timeout again to check in 30 seconds if flag has changed
  window.setTimeout(checkState,30000);
}

function blink() {
  var elm = document.getElementById('blinkDiv');
  if (elm.style.color == "#ff0000") {       
    elm.style.color = "#ffffff";
  }
  else {
    elm.style.color = "#ff0000";
  } 
}

function stopBlink(){
    var elm = document.getElementById('blinkDiv');
    elm.style.color = "#ffffff";
}

var checkIntervalId=null;
var blinkIntervalId=null;
var标志=1;
var elm=document.getElementById('blinkDiv');
函数init(){
checkIntervalId=window.setInterval(检查,30000);
}
函数检查(){
clearInterval(闪烁有效);
如果(标志==0){
blinkIntervalId=window.setInterval(闪烁,1000);
}
}
函数blink(){
如果(elm.style.color==“#ff0000”)
elm.style.color=“#ffffff”;
其他的
elm.style.color=“#ff0000”;
}
如果通过外部函数更改
标志
值,则需要保留间隔以检查其是否更改。对于ex,您可以将此间隔更改为5秒。因此,它将更快地检测到更改


另一种方法是更改
标志
,不是直接更改,而是通过setter函数更改,例如
setFlag(1)
,在该函数中,您可以设置和禁用间隔。

谢谢您的回答,我将尝试它们。这是我自己的尝试,似乎效果不错:

<script type="text/javascript">
    var checkIntervalId = null;
    var blinkIntervalId = null;
    var flag = 1;
    var elm = document.getElementById('blinkDiv');
    function init() {
        checkIntervalId = window.setInterval(check,30000);
    }
    function check() {
        clearInterval(blinkIntervalId);
        if (flag==0) {
            blinkIntervalId = window.setInterval(blink,1000);
        }
    }
    function blink() {
        if (elm.style.color == "#ff0000")
            elm.style.color = "#ffffff";
        else
            elm.style.color = "#ff0000";
    }
</script>

函数控制器(){
如果(!f)
设置超时(“闪烁();”,1000);
若否(f)
设置超时(“控制器();”,30000);
}
函数blink(){
var elm=document.getElementById('alert');
如果(elm.style.color==“#ff0000”)
elm.style.color=“#ffffff”;
其他的
elm.style.color=“#ff0000”;
控制器();
}
您可以使用(非标准)(在Firefox中受支持)或(在所有最近的浏览器中受支持)来监视您的标志的更改,而不是:

    <script type="text/javascript">

        function controller(){
            if(!f)
                setTimeout("blink();", 1000);
            else if(f)
                setTimeout("controller();", 30000);
        }

        function blink(){
            var elm = document.getElementById('alert');
            if (elm.style.color == "#ff0000")
              elm.style.color = "#ffffff";
            else
              elm.style.color = "#ff0000";

            controller();
        }

    </script>

传递给
watch
的函数将在每次
flag.value
更改时执行,因此无需使用超时来监视它。(当然,如果30秒的等待时间是一个困难的要求,那么您将返回到
setTimeout
,或者您需要跟踪自上次更改标志以来经过的时间。)

不要将字符串传递给
setTimeout
-您正在使用该字符串隐式调用
eval
。相反,您可以向它传递对要调用的函数的引用,如
setTimeout(blink)
setTimeout(controller)
var flag = {value: 1};
flag.watch("value", function(id, oldval, newval) {
    if (newval === 0)
        blink();
    else 
        stopBlink();
});