相反的意見主張一定的方法更好,讓我更有建設性,並以展示添加回答的我合寫我自己,並解釋你可能會遇到的一些陷阱成。 代碼片段是指與Twitter不同的服務,但目標相同。事實上,此代碼的目標是報告未讀郵件的確切數量,因此您的郵件可能會更簡單。
我的方法是基於an answer這裏SO,和而不是被輪詢驅動(檢查以固定間隔條件)是事件驅動(在狀態通知的電勢變化)。
優點包括立即檢測到變化(否則在下一次輪詢之前不會檢測到),並且在條件沒有改變時不浪費輪詢資源。無可否認,第二個論點在這裏幾乎不適用,但第一個論點依然存在。
架構一目瞭然:
注入內容腳本到相關頁面。
分析標題的初始狀態,通過sendMessage
報告到背景頁面。
註冊標題更改事件的處理程序。
每當事件觸發且處理程序被調用時,分析標題的新狀態,通過sendMessage
報告到背景頁面。
已經步驟1具有疑難雜症到它。普通內容腳本注入機制在清單中定義內容腳本時,會在導航到與URL匹配的頁面時將其注入到頁面中。
"content_scripts": [
{
"matches": [
"*://theoldreader.com/*"
],
"js": ["observer.js"],
"run_at": "document_idle"
}
]
這工作得很好,直到你的擴展重新加載。這可能會在開發中發生,因爲您正在應用所做的更改,或者在部署實例中進行自動更新。然後會發生什麼情況是內容腳本而不是重新注入現有的打開頁面(直到導航發生,如重新加載)。因此,如果你依賴於基於清單注射,你也應該考慮包括程序注入到已經打開的標籤時擴展初始化:
function startupInject() {
chrome.tabs.query(
{url: "*://theoldreader.com/*"},
function (tabs) {
for (var i in tabs) {
chrome.tabs.executeScript(tabs[i].id, {file: "observer.js"});
}
}
);
}
在另一端,是活躍在延長的時間內容的腳本實例重新加載沒有終止,但是是孤立的:任何sendMessage
或類似的請求將失敗。正是因此,建議嘗試與父擴展交流時,經常檢查異常,並自終止(刪除處理),如果失敗的話:
try {
chrome.runtime.sendMessage({'count' : count});
} catch(e) { // Happens when parent extension is no longer available or was reloaded
console.warn("Could not communicate with parent extension, deregistering observer");
observer.disconnect();
}
第2步也有一個疑難雜症到它,但它取決於您正在觀看的服務的具體情況。內容腳本範圍內的某些頁面不會顯示未讀項目的數量,但這並不意味着沒有新消息。
在觀察Web服務的工作方式之後,我得出結論,如果標題在沒有導航的情況下更改爲某些內容,則可以安全地假設新值是正確的,但對於初始標題「不應該新項目」應該被忽略爲不可靠。
因此,分析代碼佔它是否初始讀數或處理的更新:
function notify(title, changed) {
// ...
var match = /^\((\d+)\)/.exec(title);
var match_zero = /^The Old Reader$/.exec(title);
if (match && match[1]) {
count = match[1];
} else if (match_zero && changed) {
count = 0;
}
// else, consider that we don't know the count
//...
}
這就是所謂的與最初的標題和在步驟2中changed
= false
。
步驟3 & 4是主要回答「如何監視標題的變化」(在事件驅動方式)。
var target = document.querySelector('head > title');
var observer = new window.MutationObserver(
function(mutations) {
mutations.forEach(
function(mutation){
notify(mutation.target.textContent, true);
}
);
}
);
observer.observe(target, { subtree: true, characterData: true, childList: true });
對於具體爲何的observer.observe
某些選項被設置,看到original answer。
注意notify
調用與changed
= true
,從「(1)老讀者」到「老讀者」那麼回事沒有導航被認爲是零個未讀郵件「真」的變化。
如果您正在投票,您是否需要事件?你不能只存儲最後一個標籤標題,並將其與當前的比較? – nrabinowitz
我認爲使用事件(如果有的話)是個好主意。但是,如果沒有一個,你的想法也可以使用。 –
我對倒計時感到困惑;如果他/她認爲這是一個無用的和/或不正確的迴應,那麼我可以改善它:) –