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固有の機能を使用する必要がある理由はありますか?クロスサイトリクエストまたはそれを特に必要とする何かをしていますか?Wiki for Greasemonkeyを見ると、asynchronousfalseに設定するオプションが見つかりません。

最も簡単なオプションは、GreasemonkeyスクリプトにJQueryを含め、JQueryの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の応答ハンドラー内に配置して、すぐに返されるようにします。そのページを取得すると、必要なコードを実行します。

本当に特定の順序でそれらを発生させる必要がある場合は、最初の呼び出しの戻りを2番目の呼び出しに戻すことができます。

于 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 に答える