Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Greasemonkey脚本停止工作,出现错误:unsafeWindow.document.watch不是函数_Javascript_Firefox_Greasemonkey - Fatal编程技术网

Javascript Greasemonkey脚本停止工作,出现错误:unsafeWindow.document.watch不是函数

Javascript Greasemonkey脚本停止工作,出现错误:unsafeWindow.document.watch不是函数,javascript,firefox,greasemonkey,Javascript,Firefox,Greasemonkey,我对这一切都很陌生,但是这个脚本曾经在firefox上工作,最近停止了。它将Gmail收件箱中的未读计数放在窗口/标签标题的开头 unsafeWindow.document.watch('title', function(prop, oldval, newval) { if (matches = newval.match(/Inbox \((\d+)\)/)) { names = newval.match(/\w+/) newval = '(' + matches[1] + '

我对这一切都很陌生,但是这个脚本曾经在firefox上工作,最近停止了。它将Gmail收件箱中的未读计数放在窗口/标签标题的开头

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不是函数”。我试着在谷歌和这里搜索,但没有找到答案。任何帮助都将不胜感激

看起来Greasemonkey的沙箱(XPCNativeWrapper)已经改变了。这似乎是一个可能的错误,但我目前没有看到任何未解决的问题

另外,
watch()
是非标准的(可能会消失),并且符合is标准

同时,通过将代码注入页面范围,可以使代码重新工作,如下所示:

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;
    }
}

unsafeWindow.document.watch是特定于页面的函数吗?从我(尽管有限)的阅读来看,它是javascript,不应该是特定于站点或页面的。我会在页面源代码中寻找什么来识别新函数?是的,你是对的<代码>监视()不是特定于页面的。这是一种仅用于设置观察点的Firefox机制,因此不应以这种方式使用。毫无疑问,这也是通用汽车或FF更换后其破产的部分原因。我将在稍后发布一个解决方案。