在我的代码中的某个地方,我称这个函数为:
function call_bid_button(id)
{
bid_button(id);
var refreshIntervalId = setInterval(function(){bid_button(id)},1000);
}
您可以看到调用函数bid_button()
并为其设置interval
。
我希望bid_button()
为自己激活clearInterval()
。这是bid_button()
:
function bid_button(id)
{
if (window.XMLHttpRequest)
{
xmlhttp=new XMLHttpRequest();
}
else
{
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200 && xmlhttp.responseText=='')
{
document.getElementById("bid_button").innerHTML=xmlhttp.responseText;
clearInterval(refreshIntervalId);
}
}
xmlhttp.open("GET","the_bid_button.php?id="+id,true);
xmlhttp.send();
return false;
}
如您所见,我正试图从另一个函数调用clearInterval()
。显然,这不起作用。这样做的正确方法是什么?
由于
答案 0 :(得分:3)
您实际上只需将参考传递给间隔:
var interval_id;
interval_id = setInterval(function(){bid_button(id, interval_id); },1000);
function bid_button (id, interval_id) {
clearInterval(interval_id);
}
这是有效的,因为稍后会调用区间中的回调函数。
请注意,由于实施bid_button
的方式,某些时间间隔可能无法清除。例如,如果您丢失了互联网连接,它将继续尝试并尝试。请求将通过status=0
解决。
答案 1 :(得分:2)
将refreshIntervalId
设置为全局变量,或者至少在两个函数的范围内。
var refreshIntervalId;
function call_bid_button(id)
{
bid_button(id);
refreshIntervalId = setInterval(function(){bid_button(id)},1000);
}
function bid_button(id)
{
if (window.XMLHttpRequest)
{
xmlhttp=new XMLHttpRequest();
}
else
{
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200 && xmlhttp.responseText=='')
{
document.getElementById("bid_button").innerHTML=xmlhttp.responseText;
clearInterval(refreshIntervalId);
}
}
xmlhttp.open("GET","the_bid_button.php?id="+id,true);
xmlhttp.send();
return false;
}
答案 2 :(得分:0)
var timer = setInterval(function(){
alert('delayed 1ms');
},1000);
当这是通过的时候,只要你不再调用它,它就会通过。 如果您,
clearInterval(timer);
如果计时器被包装在另一个函数中,var
将其限定为该函数。您可以删除它以使其成为全局变量,也可以稍后在包装函数的相同范围内执行它。