2012-06-14 70 views
1

我有一個劇本:當頁面通過ajax更改時,如何運行Greasemonkey腳本?

// ==UserScript== 
// @name  example 
// @include http://xxx* 
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js 
// ==/UserScript== 

var findElem = function(elems, text) { 
    for (var i = 0; i < elems.length; i++) { 
     if (elems[i].textContent == text) { 
      return elems[i]; 
     } else { 
      var result = findElem(elems[i].children, text); 
      if (result != undefined) { 
       return result; 
      } 
     } 
    } 
    return; 
} 

switch (document.getElementById('my_id').value) { 
    case "1": 
     findElem(document.documentElement.children, "blabla1").click(); 
     break; 
    case "2": 
     findElem(document.documentElement.children, "blabla2").click(); 
     break; 
    case "3": 
     findElem(document.documentElement.children, "blabla3").click(); 
     break; 
    case "4": 
     findElem(document.documentElement.children, "blabla4").click(); 
     break; 
    default: 
     break; 
} 

它工作正常,但它只能主要頁面加載。我想在通過ajax更改頁面時運行此操作。我怎樣才能做到這一點?

也請給出你的答案的例子。我是新手。我不知道如何在答案中使用。

+0

名單到底是什麼改變。顯示足夠的HTML結構,我們可以選擇準確的選擇器 - 鏈接到它的目標頁面並非極其困難。 –

回答

3

由於瀏覽器的環境是事件驅動的,所以您必須設置一個計時器,綁定到發生在您尋找的更新周圍的事件。或者,您可以封裝更新的函數,並在post-hook中調用您的代碼。顯然,你需要將你的用戶代碼包裝在一些函數中才能重用。

下面是用定時器設置了setInterval(腳本的頂部仍然是相同的)一個例子:

setInterval(function(){ 
    switch (document.getElementById('my_id').value) { 
     case "1": 
      findElem(document.documentElement.children, "blabla1").click(); 
      break; 
     case "2": 
      findElem(document.documentElement.children, "blabla2").click(); 
      break; 
     case "3": 
      findElem(document.documentElement.children, "blabla3").click(); 
      break; 
     case "4": 
      findElem(document.documentElement.children, "blabla4").click(); 
      break; 
     default: 
      break; 
    } 
}, 1000) // if AJAX updates happen with some specific interval, set same number here to minimize useless work 
+0

定時器監聽實際上是一個非常好的解決方案,如果頁面內容的ajax重新加載也由setTimeout/setInterval觸發。 – raina77ow

+0

謝謝,但我不知道我可以這樣做。你可以舉例或編輯我的代碼來做到這一點? – Leadri

+0

那麼,你真的應該閱讀有關事件和計時器的基本文檔。正如你從例子中看到的那樣,變化是微不足道的。 –

0

您可以使用mutation event handler每個HTML被改變的時間來觸發功能。然而,browsersupport是不是最好的;)

+0

謝謝,但我不知道如何使用它。你可以舉例或編輯我的代碼來做到這一點? – Leadri

+0

您是否瞭解到[突變事件已被棄用]的部分(http://www.w3.org/TR/DOM-Level-3-Events/#events-mutationevents),Mozilla不建議這樣做,即使Firefox支持他們現在(但不是在未來)。 –

+0

@BrockAdams我知道,但這是一種可能的方式,反正有[Mutation Observers](http://www.w3.org/TR/dom/#mutation-observers)。 – Christoph

0

如果使用jQuery您的主機,可以使用ajaxSuccessajaxComplete

function mainCode(){ 
    // your script logic here ... 
    switch (document.getElementById('my_id').value) { 
     // truncated to save space 
    } 
} 

$(document).ready(function(){ 
    mainCode(); 
    unsafeWindow.$(document).ajaxSuccess(function(e, xhr, opt) { 
     mainCode(); 
    }); 
}; 
相關問題