Firefox插件中的Javascript:for循环延迟

时间:2009-11-02 02:14:33

标签: javascript firefox javascript-events firefox-addon

我知道在编写扩展时,除了使用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中实现这一点......

编辑:抱歉没有更详细......

3 个答案:

答案 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>