我正在創建一個Chrome擴展並嘗試在gMail撰寫框的SEND按鈕旁包含一個小文本。'MutationObserver'上'觀察':參數1不是'節點'類型
我正在使用MutationObserver來了解組合框窗口何時出現。我通過觀察類no
中的元素來完成此操作,因爲組合框元素是作爲此元素的子元素(類no
)創建的。
當用戶點擊撰寫按鈕並出現撰寫框窗口時,我使用.after()
方法在發送按鈕旁邊放置一個元素。發送按鈕類名稱是.gU.Up
。
這些是真正的gMail類名,也很奇怪。
下面是代碼我使用:
var composeObserver = new MutationObserver(function(mutations){
mutations.forEach(function(mutation){
mutation.addedNodes.forEach(function(node){
$(".gU.Up").after("<td> <div> Hi </div> </td>");
});
});
});
var composeBox = document.querySelectorAll(".no")[2];
var config = {childList: true};
composeObserver.observe(composeBox,config);
的問題是,我不斷收到以下錯誤:
Uncaught TypeError: Failed to execute 'observe' on 'MutationObserver': parameter 1 is not of type 'Node'
誰能幫助?我已經嘗試了很多東西,並在這裏查看了其他答案,但仍無法擺脫此錯誤。
這裏是我的manifest.json 文件:
{
"manifest_version": 2,
"name": "Gmail Extension",
"version": "1.0",
"browser_action": {
"default_icon": "icon19.png",
"default_title": "Sales Analytics Sellulose"
},
"background": {
"scripts": ["eventPage.js"],
"persistent": false
},
"content_scripts": [
{
"matches": ["https://mail.google.com/*"],
"js": ["jquery-3.1.1.js", "insQ.min.js", "gmail_cs.js"]
}
],
"web_accessible_resources":[
"compose_icon.png",
"sellulosebar_icon.png"
]
}
附:我已經嘗試過插入查詢庫,但它有一些缺點。它沒有讓我對具體元素的變化具體說明。我還沒有嘗試突變總結文庫,但由於它使用了MutationObserver,我認爲這個問題會持續存在。
加入評論:
的確,選擇器沒有給我一個節點。我檢查了控制檯,它提供了一個對象。我也檢查了控制檯,並選擇了我想觀察的適當元素。
但是,當我爲所選元素添加console.log
時,它顯示爲未定義。這意味着,在代碼執行之前執行代碼可能是正確的。你能告訴我如何確保延遲發生? 'setTimeout'會工作嗎?在MutationObserver的情況下它如何工作?
錯誤清楚地表明,document.querySelectorAll的'結果(「無」)[2]'不計算爲[節點(https://developer.mozilla.org/en-US/docs/Web/API/Node)。您需要查看頁面的結構以確定如何選擇適當的節點。您的代碼可能/可能在您希望在DOM中找到的節點之前執行。如果是這樣,你需要延遲添加觀察者,直到他們存在(許多方法這樣做)。 – Makyen
請將[問題]置於主題上:包括一個重複問題的**完整** [mcve]。通常包括一個* manifest.json *,一些背景*和*內容腳本。尋求調試幫助的問題(「**爲什麼不是這個代碼工作?」)必須包括:►期望的行爲,►特定問題或錯誤*和*►在問題中重現問題所需的最短代碼**本身**。沒有明確問題陳述的問題對其他讀者無益。請參閱:「**如何創建[mcve] **」,[我可以在此處詢問哪些主題?](http://stackoverflow.com/help/on-topic)和[問]。 – Makyen
謝謝@Makyen我已經添加了清單文件。 確實,選擇器沒有給我一個節點,我檢查了控制檯,它給了一個對象。我也檢查了控制檯,並選擇了我想觀察的適當元素。
但是,當我爲所選元素添加'console.log'時,它的未定義。這意味着,在代碼執行之前執行代碼可能是正確的。你能告訴我如何確保延遲發生? 'setTimeout'會工作嗎?在突變觀察者的情況下它是如何工作的? –