2012-02-15 7 views
2

私はこのすべてにとても新しいですが、このスクリプトは以前はfirefoxで動作していましたが、最近停止しました。 Gmailの受信トレイに未読の数がウィンドウ/タブタイトルの先頭に表示されます。Greasemonkeyスクリプトがエラーで動作を停止しました:unsafeWindow.document.watchは関数ではありません

これを実行すると、エラーコンソールに「unsafeWindow.document.watch is not function」と表示されます。私はGoogleとここで検索しようとしましたが、これを理解できませんでした。どんな助けでも大歓迎です!

+0

unsafeWindow.document.watchはページ固有の機能ですか?私の(しかし、限られた)読んでからそれはjavascriptであり、サイトやページに特定すべきではありません。新しい機能を特定するためにページソースで何を探すべきでしょうか? – EBlackstone

+0

はい、そうです。 'watch()'はページ固有ではありません。ウォッチポイントを設定するためのFirefox専用のメカニズムであり、[ドキュメント](https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/Object/watch)にはこのように使用すべきではありません。 GMやFFが変わったときにそれがなぜ壊れたのかは間違いありません。私はちょっとした回避策を投稿します。 –

答えて

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

+0

あなたは大歓迎です。助けてうれしい! –