2010-07-15 58 views
3

我有一個URL列表,需要一個接一個地加載每個頁面。
這是我在我心中的主要功能。如何在greasemonkey中進行同步AJAX調用?

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,這是在「underfined」作爲函數結束前的頁面的內容可以檢索異步的,所以oPage結果。
func2也使用GM_xmlhttprequest,所以即使不論oPage是否未定義,aResult也是未定義的。

關於如何使所有這些工作的任何想法?

func1func2func3應該可以在整個腳本中重複使用,這些功能中的每一個都可以獨立使用或一起使用在腳本的不同部分。

回答

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); 

沒有測試它,但你有這個想法

1

通常情況下,您會將調用放入xmlhttprequest的響應處理程序中,以便它立即返回,並在它獲取該頁面時執行所需的代碼。

如果你真的需要讓他們在一個特定的順序發生,你可以爲第一個呼叫第二回,等

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); 

其餘的我認爲你可以弄清楚自己,好運氣。