2017-01-08 2 views
0

Цель this userscript есть, когда вы посещаете /review страницу веб-сайта Stack Exchange, он добавляет Desktop Notifications ссылку в верхней, и если вы посещаете, что page, он генерирует уведомление на рабочем столе, если есть флаги модератора или сообщения для просмотра. Сценарий периодически перезагружается.Userscript работает в Chrome/Tampermoney, но не в Firefox/Greasemonkey

Это работает из коробки в любом Chrome/Tampermonkey, который я пытался использовать в нескольких OS-es (OSX, Linux, Windows). В Firefox/Greasemonkey он не работает в OSX (Desktop Notifications не отображается). Если я правильно помню, он работает в Linux. Консоль разработчика ничего не показывает, когда я посещаю страницу. Пользовательский указатель, конечно, установлен и включен.

Что я могу пропустить? Как отладить это?

// ==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

Согласно GreaseMonkey's source, то GM_notification API пока не реализована.

Вопрос #1194 является актуальной проблемой. (Я не думаю, что это будет добавлено в ближайшее время)

В качестве временного polyfill, вы можете иметь в начале файла:

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 поддерживают уведомления.

+0

Если возникла неопределенная «ошибка GM_notification», скрипт выйдет из строя только тогда, когда эта строка будет выполнена, нет? На данный момент скрипт вообще не работает. Например, он не добавляет ссылку ** Desktop Notifications **. – janos

+0

Кажется, у меня есть более фундаментальная проблема ... Если я заменю весь скрипт (под заголовком) одной строкой 'document.title = 'hello';', даже это не сработает. Поэтому я предполагаю, что я неправильно установил сценарий. На странице GitHub, с которой я связан, когда я нажимаю кнопку '[Raw]', Greasemonkey предлагает ее установить. Вот как я его установил. И когда я посещаю страницу обзора, меню Greasemonkey указывает, что сценарий активен. Что я могу пропустить? – janos

+0

@janos Перейти к 'about: addons' в Firefox, и вы должны увидеть вкладку« Пользовательские скрипты »на левой панели. Оттуда проверьте, установлен ли скрипт, а затем проверьте, включено ли оно, затем перейдите в «Параметры-> Изменить этот файл». Оттуда проверьте, установлен ли он правильный скрипт. – Artyer

Смежные вопросы