递归的setTimeout
函数getRandomProducts在html body标签中调用onload
,不断迭代。
函数setCategoryTree正在被调用从导航栏的嵌套 ul 中的链接调用 onclick
。 此函数然后将变量 mainCategory 传递给 getRandomProducts,其中全局声明变量以保持其初始化。
...所以,我要做的是单击导航栏中的链接时重置 getRandomProducts 函数,并从单击的链接传递类别名称。然而,clearTimeout
似乎不起作用,因此迭代发生得更频繁,因为那时有多个递归循环同时执行。
不仅如此,我的全局变量也没有按预期存储来自 setCategoryTree 的数据(基本上我试图以类似于静态变量的方式使用全局变量)。我已经通过注释掉的 window.alert
识别出所有这些行为。
这是相关的 Javascript 代码:
var mainCategory = ""; // initialized from setCategoryTree
var category = mainCategory;
function getRandomProducts(category)
{
//window.alert(category);
if(typeof category == "undefined")
category = "all";
else
clearTimeout(t);
var req = new XMLHttpRequest();
var products = document.getElementById("products");
req.onreadystatechange = function()
{
if( (req.readyState == 4) && (req.status == 200) )
{
var result = req.responseText;
products.innerHTML = result;
}
}
req.open("GET", "default.php?category=" + category, true);
req.send(null);
var t = setTimeout("getRandomProducts()", 1000);
}
function setCategoryTree(link)
{
var categoryTree = document.getElementById("categoryTree");
/* climbing the DOM-tree to get the category name (innerHTML of highest "a" tag) */
mainCategory = link.parentNode.parentNode.parentNode.getElementsByTagName("a")[0].innerHTML;
var subcategory = link.innerHTML;
categoryTree.innerHTML = "-- " + mainCategory + " -- " + subcategory;
getRandomProducts(mainCategory);
}
最佳答案
您正在函数中设置变量 t
。下次调用此函数时,您将无法使用 var t
。
因此,将变量设置在函数之上(不在函数中)
var randomProductsTimeout = false;
function getRandomProducts(category){
randomProductsTimeout = setTimeout()[..]
关于javascript - 确保一次只有一个 setTimeout 运行(处于事件状态)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10084794/