我知道在编写扩展时,除了使用setTimeout调用之外我们无法延迟函数调用,但这是我想要在我为firefox开发的插件中实现的(这不适用于javascript嵌入到网页中的方式):
for(var i = 0; i< t.length; i ++){
//Load a URL from an array //On document complete, get some data
}
这个想法很简单。我有一系列URL,我想要解析并从中提取一些数据。这些URL中的每一个都需要一些时间来加载。因此,如果我尝试从当前页面获取一些数据而不等待页面加载,我将收到错误。现在,我所知道的唯一方法如下:
firstfunction:function(){
//Load the first url setTimeout("secondfunction", 5000);
}
第二个功能:function(){
//Load the second url setTimeout("thirdfunction", 5000);
}
依此类推......我知道这显然是错误的......我只是想知道人们如何在javascript中实现这一点......
编辑:抱歉没有更详细......
答案 0 :(得分:1)
我不相信这种类型的foolery是必要的,但我不是一个扩展开发者所以谁知道。如果这是您想要的方法,那么只需让setTimeout调用引用相同的函数:
var index;
firstfunction: function() {
// do something with `index` and increment it when you're done
// check again in a few seconds (`index` is persisted between calls to this)
setTimeout("firstfunction", 5000);
}
答案 1 :(得分:1)
我不确定如何从插件中执行此操作,但我过去使用iframe执行的操作是将回调附加到目标文档的onLoad事件。
可能是这样的:
var index = 0;
var urls = [ ..... ];
function ProcessDocument() { ....; LoadNextDocument(); }
function LoadNextDocument() { index++; /* Load urls[index] */; }
document.body.onLoad = ProcessDocument;
在那里你需要测试索引> urls.length也适合你的最终条件。
答案 2 :(得分:0)
我有同样的问题,但我使用递归而不是循环。 下面是运行代码,它通过循环遍历列表来更改元素的innerHTML。希望它有所帮助。
<Script type="text/javascript">
var l;
var a;
function call2()
{
l = document.getElementById('listhere').innerHTML;
a = l.split(",");
call1(0);
}
function call1(counter)
{
if(a.length > counter)
{
document.getElementById('here').innerHTML = a[counter];
counter++;
setTimeout("call1("+counter+")",2000);
}
}
</Script>
<body onload="call2()">
<span id="listhere">3,5,2,8</span><Br />
<span id="here">here</span>