setTimeout/setInterval的Javascript循环问题 我希望每隔30秒反复检查此标志,直到标志变为0(由我无法控制的外部事件) 当标志为0时,30秒检查应结束,直到标志再次为1 只要标志为0,屏幕上的一些文本就会闪烁,如果标志返回到1,闪烁就会停止,30秒检查应该继续
我试图用setTimeout/setInterval来实现这一点,但我在将它们与循环结合起来时遇到了问题 以下是从另一个站点执行闪烁操作的一些代码: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
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();
});