this userscript的目的是,当您访问Stack Exchange网站的/review
页面时,它会在顶部附近添加一个Desktop Notifications链接,并且如果您访问该页面,则在存在主持人标记或要审核的帖子。该脚本会定期重新加载自身。
这在我在多个OS-es(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);
}
}
}
最佳答案
根据GreaseMonkey's source,GM_notification
API尚未实现。
问题#1194是相关问题。 (我认为不会很快添加它)
作为临时的polyfill,您可以在文件的开头:
if (!GM_notification) {
GM_notification = function(details) {
alert(details.title + '\n' + details.text);
}
}
这使选项卡看起来像:
但不会产生通知。您现在还应该在
document.title
中包含信息,因为不会有任何实际的通知(如方括号中的通知数量)。当用户做其他事情时,您可以做的事情不仅仅会带来不便,例如
window.open
会将焦点窃取(但大多数尝试可能会被阻止)到新打开的选项卡。Firefox的一个扩展解决方案是将其扩展,因为Firefox和Chrome扩展均支持通知。