2014-07-14 60 views
-3

我目前正在編寫一個非常簡單的Google Chrome瀏覽器擴展程序,它利用內容腳本,通過抓取元素並在頁面完成加載時附加到其網頁上,將其他文本簡單地添加到網頁上。加載後立即修改頁面元素

問題是,我正在修改的網頁在媒體上很豐富,需要幾秒鐘才能加載,因此導致其他文本在加載文本的其餘部分後幾秒鐘才顯示。

我抓的元素是span。有沒有什麼方法可以監聽這個元素,以便我可以儘快修改它?

+0

見[清單](https://developer.chrome.com/extensions/content_scripts),特別'run_at',即 「run_at」: 「document_start」 – Xotic750

+0

@ Xotic750在「document_idle」或「document_end」中運行會產生我在OP中描述的效果。在「document_start」處運行結果不起作用,因爲要修改的頁面元素尚不存在。 – DannyF247

+0

@ DannyF247看到這個[規範問題](http://stackoverflow.com/questions/2844565/is-there-a-jquery-dom-change-listener)。在開始時注入,傾聽改變。 – Xan

回答

1

正如在評論中指出,在「document_start」使用manifest設定注入你的內容腳本「run_at」

然後用MutationObserverdocument聽要添加它。

的Javascript

new MutationObserver(function (mutations) { 
    mutations.some(function (mutation) { 
     console.log(mutation); 
     if (mutation.type === 'childList') { 
      return Array.prototype.some.call(mutation.addedNodes, function (addedNode) { 
       if (addedNode.id === 'added') { 
        mutation.target.textContent = 'Added text'; 
        return true; 
       } 

       return false; 
      }); 
     } 

     return false; 
    }); 
}).observe(document, { 
    attributes: false, 
    attributeOldValue: false, 
    characterData: false, 
    characterDataOldValue: false, 
    childList: true, 
    subtree: true 
}); 

document.addEventListener('DOMContentLoaded', function onDOMContentLoaded() { 
    var div = document.createElement('div'); 

    div.id = 'added' 
    document.body.appendChild(div); 
    console.log('Added a div'); 
}, true); 

jsFiddle

+0

'document.body' does not not ** yet exists at'document_start'。如果我沒有記錯的話,就是'document.documentElement'。 – Xan

+0

(我不是OP的順便)等待'DOMContentLoaded'等同於運行在'document_end',這正是OP不需要的。您的代碼很好,除了您通過「觀察」調用附加的元素之外。 – Xan

+0

只需將'MutationObserver'添加到'document'。 – Xotic750

相關問題