用户脚本适用于Chrome / Tampermoney但不适用于Firefox / Greasemonkey

时间:2017-01-08 20:15:02

标签: javascript macos firefox

this userscript的目的是,当您访问Stack Exchange网站的/review页面时,它会在顶部附近添加桌面通知链接,如果您访问该页面,如果有要审核的主持人标记或帖子,它会生成桌面通知。该脚本会定期重新加载。

这在我在多个操作系统(OSX,Linux,Windows)中尝试的任何Chrome / Tampermonkey中都是开箱即用的。在Firefox / Greasemonkey中,它在OSX中不起作用(桌面通知不会出现)。如果我没记错的话,它确实可以在Linux中运行。访问该页面时, Web Developer Console 不会显示任何内容。用户脚本当然已安装并启用。

我能错过什么?如何调试?

// ==UserScript==
// @name Moderator Flag Notification
// @author Simon Forsberg
// @description Shows a desktop notification when there are flags or review items to be handled.
// @namespace https://github.com/Zomis/SE-Scripts
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_notification
// @match *://*.stackexchange.com/review*
// @match *://*.stackoverflow.com/review*
// @match *://*.superuser.com/review*
// @match *://*.serverfault.com/review*
// @match *://*.askubuntu.com/review*
// @match *://*.stackapps.com/review*
// @match *://*.mathoverflow.net/review*
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
// ==/UserScript==

if (window.location.href.indexOf('/desktop-notifications') === -1) {
    $('.tools-rev h1').append('<span class="lsep">|</span><a href="/review/desktop-notifications">Desktop Notifications</a></h1>');
} else {
    var KEY_NEXT = 'NextReload';
    var DELAY = 60 * 1000;
    var currentTime = Date.now ? Date.now() : new Date().getTime();
    var lastTime = GM_getValue(KEY_NEXT, 0);
    var nextTime = currentTime + DELAY;
    GM_setValue(KEY_NEXT, nextTime);

    var timeDiff = Math.abs(lastTime - currentTime);
    setTimeout(function(){ window.location.reload(); }, DELAY);

    $('.subheader h1').html('Desktop Notifications');
    $('.leftcol').html('Keep your browser open on this page and it will be automatically reloaded and alert you when something wants your attention.').removeClass('leftcol');
    $('.rightcol').remove();

    var title = document.title.split(' - '); // keep the site name
    document.title = 'Desktop Notifications - ' + title[1];

    // a way to detect that the script is being executed because of an automatic script reload, not by the user.
    if (timeDiff <= DELAY * 2) {
        var notifications = [];

        var topbarFlag = $('.topbar-links .mod-only .icon-flag .flag-count').html();
        var topbarFlagCount = parseInt(topbarFlag);
        if (topbarFlagCount > 0) {
            notifications.push(topbarFlagCount + ' Flags');
        }

        var reviewItems = $('.icon-tools-flag span');
        var reviewCount = 0;
        if (reviewItems.length > 0) {
            reviewCount = parseInt(reviewItems.html());
            if (reviewCount > 0) {
                notifications.push(reviewCount + ' Review Items');
            }
        }

        if (notifications.length > 0) {
            var details = {
                title: document.title,
                text: notifications.join('\n'),
                timeout: 0
            };
            GM_notification(details, null);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

根据GreaseMonkey's sourceGM_notification API尚未实施。

问题#1194是相关问题。 (我不认为它会很快添加)

作为临时填充,您可以在文件的开头:

if (!GM_notification) {
    GM_notification = function(details) {
        alert(details.title + '\n' + details.text);
    }
}

这使标签看起来像:

Tab title font is bold and favicon has flash

但是没有发出通知。您现在还应该在document.title中获得信息,因为不会有任何实际通知(例如方括号中的通知数量)。

除非用户正在做其他事情,例如window.open窃取焦点(但大多数尝试可能会被阻止),否则您无法做其他事情并不会造成不便一个新打开的标签。

长期解决方案是将此扩展为扩展程序,因为Firefox和Chrome扩展程序都支持通知。