4

我有一个 URL 列表,需要一个接一个地加载每个页面。
这是我心中的主要功能。

mainFunction() {  
loop {  // Loop through URL list
oPage = func1(URL); //Get page contents
aResult = func2(oPage); //Analyse the contents
func3(aResult); //Do current page modifications
}  
}

func1使用 GM_xmlhttprequest,它是异步的,因此 oPage 导致“underfined”,因为函数在可以检索页面内容之前结束。
func2也使用 GM_xmlhttprequest,所以即使 oPage 未定义,aResult 也将未定义。

关于如何使所有这些工作的任何想法?

func1 func2并且func3应该在整个脚本中可重用,这些函数中的每一个都可以单独使用,也可以在脚本的不同部分一起使用。

4

3 回答 3

3

是否有任何理由需要使用 Greasemonkey 特定功能?您是在做跨站点请求还是特别需要它的东西?查看 Greasemonkey的Wiki,我找不到设置asynchronous为 false 的选项。

您最简单的选择是将JQuery包含在您的 Greasemonkey 脚本中并使用 JQuerys AJAX 功能。当然,这可以在没有 JQuery 的情况下完成,但是,这方面的跨浏览器不兼容是手动处理的痛苦。

使用 JQuery,您的代码将如下所示:

function func1(url) {
    var result;

    $.ajax({
        type: "GET",
        url: url,
        async: false,
        success: function(data){
            result = data;
        }
    });
    return result;
}

你会像这样声明你的变量oPage

var oPage = func1(url);

其余的我想你可以自己弄清楚,祝你好运。

于 2010-07-16T22:30:56.490 回答
1

通常,您会将调用放在 xmlhttprequest 的响应处理程序中,这样它会立即返回,并且当它确实获得该页面时,它会执行所需的代码。

如果你真的需要让它们以特定的顺序发生,你可以让第一个调用的返回第二个调用,等等。

于 2010-07-15T16:55:24.490 回答
0
var urls = [];

(function recursive(list)
{
    if (list[0])    // the list is not empty
    GM_xmlhttpRequest({ // that would be "func1"
        "url" : list[0],    // first url in the list
        "onload" : function(xhr)
        {
            var oPage = xhr.responseText,   // page contents
            aResult = func2(oPage); // analyse the contents
            func3(aResult); // do current page modifications

            list.shift();   // remove the first link of the list
            recursive(list);    // go to the next url in the list
        }
    });
    else
    alert("end of list");
})(urls);

没有测试过,但你明白了

于 2010-08-07T18:23:45.230 回答