2012-06-18 78 views
3

我有一個Chrome擴展,它在網站上進行一些更改(編輯註釋)。Chrome擴展運行內容腳本AJAX變化

在網站上最近發生的變化(網站不是我的)之後 - 註釋塊使用ajax加載(在它是整個頁面重新加載的簡單發佈請求之前)。

現在,如果我第一次加載頁面 - 內容腳本起作用,但是當我轉到下一頁時,說第2頁 - 使用ajax添加註釋並且擴展腳本不再運行。所以評論不會按我想要的方式改變。

是否有任何簡單的方法來監聽頁面更改DOM並再次應用擴展腳本?

清單文件

我:

{ 
    "name": "Name", 
    "version": "1.0", 
    "description": "Description", 
    "icons": {"16":"16.png", 
      "48":"48.png", 
      "32":"32.png", 
      "128":"128.png"}, 
    "browser_action": { 
    "default_title": "Default title", 
    "default_icon": "48.png", 
    "popup": "popup.html" 
    }, 
    "permissions": [ 
    "tabs", 
    "http://www.site.com/*", 
    "notifications", 
    "unlimitedStorage" 
    ], 

    "options_page": "options.html", 
    "background_page": "background.html", 

    "content_scripts": [ 
       { 
        "matches": ["http://www.site.com/*","https://www.site.com/*"], 
        "js": ["jquery-1.7.1.min.js","content.js"], 
        "run_at": "document_end" 
       }] 
} 

回答

8

你可以叫上了DOMSubtreeModified事件添加監聽器。爲它綁定一個函數,每當有變化時它就會被調用。

在jQuery中:

$('#ContentContainer').bind('DOMSubtreeModified',modifyComments); 

UPDATE:

如果該事件被射擊多次,刪除在活動期間第一次結合,並有一定超時後,你可以調用修改評論並重新綁定事件。

function DOMModificationHandler(){ 
    $(this).unbind('DOMSubtreeModified.event1'); 
    setTimeout(function(){ 
     modifyComments(); 
     $('#ContentContainer').bind('DOMSubtreeModified.event1',DOMModificationHandler); 
    },1000); 
} 

//after document-load 
$('#ContentContainer').bind('DOMSubtreeModified.event1',DOMModificationHandler); 
+0

「.event1」後綴是什麼? –

+0

哦,我忘了從我的另一個腳本粘貼代碼之前刪除[event namespacing](http://www.learningjquery.com/2007/09/namespace-your-events)的東西.. – SuperSaiyan

+0

我用$( 「#ContentContainer」)。bind('DOMSubtreeModified',function(){ alert('changed'); });並且它在一次加載過程中觸發「更改」的次數太多 - 看起來所有的子元素都是逐個添加的,並且每次觸發事件 - 如果我運行腳本來編輯註釋 - 這不是浪費資源的好方法。有沒有辦法檢查這個元素是否改變了,並且在這個過程中沒有改變? – Volder

相關問題