2012-02-15 46 views
2

我對所有這些都很陌生,但是此腳本用於在Firefox上工作並最近停止。它將Gmail收件箱中的未讀數記錄到窗口/標籤標題的開頭。Greasemonkey腳本停止工作,出現以下錯誤:unsafeWindow.document.watch不是函數

unsafeWindow.document.watch('title', 
function(prop, oldval, newval) { 
if (matches = newval.match(/Inbox \((\d+)\)/)) { 
    names = newval.match(/\w+/) 
    newval = '(' + matches[1] + ') unread - ' + names[0] + ' Inbox'; 
} 
return (newval); 
}); 

運行時,錯誤控制檯顯示「unsafeWindow.document.watch不是函數」。我試圖在谷歌和這裏搜索,但無法弄清楚。任何幫助將不勝感激!

+0

unsafeWindow.document.watch是頁面特定的函數嗎?從我的(雖然有限)閱讀它是JavaScript,不應該是網站或頁面特定。我會在頁面源代碼中尋找哪些內容來識別新功能? – EBlackstone 2012-02-16 07:04:53

+0

是的,你是對的。 'watch()'不是頁面特定的。它是一個僅限Firefox的機制,用於設置觀察點和每個[文檔](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/watch)它不應該以這種方式使用。毫無疑問,當GM或FF發生變化時,這就是它破裂的原因之一。我會稍微發佈解決方法。 – 2012-02-16 08:24:48

回答

1

它看起來像Greasemonkey的沙箱(XPCNativeWrapper)已更改。這似乎是一個可能的錯誤,但我目前沒有看到任何未解決的問題。

此外,watch()是非標準的(可能會消失),並根據the documentationnot meant to be used except for temporary debugging

在此期間,您可以通過將其注入的頁面範圍,像這樣得到的代碼再次合作:

function AddTitleWatch() { 
    document.watch ('title', function (prop, oldval, newval) { 
     var matches, names; 
     if (matches = newval.match (/Inbox \((\d+)\)/)) { 
      names = newval.match (/\w+/) 
      newval = '(' + matches[1] + ') unread - ' + names[0] + ' Inbox'; 
     } 
     return (newval); 
    }); 
} 

function addJS_Node (text, s_URL, funcToRun) { 
    var D         = document; 
    var scriptNode       = D.createElement ('script'); 
    scriptNode.type       = "text/javascript"; 
    if (text)  scriptNode.textContent = text; 
    if (s_URL)  scriptNode.src   = s_URL; 
    if (funcToRun) scriptNode.textContent = '(' + funcToRun.toString() + ')()'; 

    var targ = D.getElementsByTagName('head')[0] || D.body || D.documentElement; 
    targ.appendChild (scriptNode); 
} 

addJS_Node (null, null, AddTitleWatch); 


但聰明的,長期的,更強大的,便攜的解決方案是重構代碼以使用間隔計時器。 ...

setInterval (RefactorTitle, 200); 

function RefactorTitle() { 
    var oldTitle = RefactorTitle.oldTitle || ""; 
    var docTitle = document.title; 

    if (docTitle != oldTitle) { 
     var matches, names; 
     if (matches  = docTitle.match (/Inbox \((\d+)\)/)) { 
      names  = docTitle.match (/\w+/); 
      docTitle = '(' + matches[1] + ') unread - ' + names[0] + ' Inbox'; 
     } 
     document.title   = docTitle; 
     RefactorTitle.oldTitle = docTitle; 
    } 
} 
+0

完美地工作,非常感謝您的詳細解答! – EBlackstone 2012-02-16 15:40:30

+0

不客氣,樂意效勞! – 2012-02-16 22:08:18