2016-04-21 2 views
3

У меня есть пользовательский указатель, в котором появляется уведомление, если определенный контент существует на целевой странице.Уведомления о пользователях в Chrome работают, но не Firefox?

Под Tampermonkey/Chrome это не проблема. Я могу использовать функцию GM_Notification() для создания уведомлений с легкостью.

Когда я пытаюсь сделать это под Firefox, он не имеет такого же поведения.
Проверка в журналах ошибок в функции отсутствует, а также их уведомления не появляются.

Ниже приведен пример кода, который не работает в Firefox + Greasemonkey или Firefox + Tampermonkey, но делает работу в Chrome + Tampermonkey:

// ==UserScript== 
// @name  Test Notifier 
// @include  * 
// @grant  GM_notification 
// @grant  window.focus 
// ==/UserScript== 

console.log('I am a pretty test script'); 

var notificationDetails = { 
    text: 'THIS IS A TEST NOTIFICATION!!!', 
    title: 'TEST', 
    timeout: 15000, 
    onclick: function() { window.focus(); }, 
    }; 
GM_notification(notificationDetails); 

Это стандартное поведение для Firefox? Он обрабатывает уведомления HTML5 совершенно по-другому (если вообще)? и какова распространенная практика включения уведомлений в учетной записи Firefox?

+0

Firefox 46 теперь стабильный и GM_Notification до сих пор не работает в Tampermonkey в данный момент времени. Однако код, который вы предоставили ниже, работает отлично, поэтому я должен принять это как правильный ответ :) – Saintwolf

ответ

9

GM_notification() is not (yet) supported in Greasemonkey (Firefox). И если у вас checked the error console, вы бы видели эту ошибку:

GM_notification is not defined

Там есть an old feature request to add GM_notification() для Greasemonkey; вы можете пойти туда и призывать ведущего разработчика GM попробовать и догнать Tampermonkey. :)

До тех пор, пока эта функция не добавлена, вы можете «подгонять» поддержку GM_notification с помощью the HTML5(ish) Notifications API, который поддерживается во многих современных браузерах.

Ваш тестовый скрипт с добавленным дополнением выглядит следующим образом. Проверено на обоих Firefox и Chrome, но должны работы на Safari и Opera тоже:

// ==UserScript== 
// @name  _Cross browser notifications 
// @match  http://YOUR_SERVER.COM/YOUR_PATH/* 
// @grant  GM_notification 
// @grant  window.focus 
// ==/UserScript== 

console.log ('Test script start.'); 

shim_GM_notification() 

var notificationDetails = { 
    text:  'Test notification body.', 
    title:  'Test notice title', 
    timeout: 6000, 
    onclick: function() { 
     console.log ("Notice clicked."); 
     window.focus(); 
    } 
    }; 
GM_notification (notificationDetails); 

/*--- Cross-browser Shim code follows: 
*/ 
function shim_GM_notification() { 
    if (typeof GM_notification === "function") { 
     return; 
    } 
    window.GM_notification = function (ntcOptions) { 
     checkPermission(); 

     function checkPermission() { 
      if (Notification.permission === "granted") { 
       fireNotice(); 
      } 
      else if (Notification.permission === "denied") { 
       alert ("User has denied notifications for this page/site!"); 
       return; 
      } 
      else { 
       Notification.requestPermission (function (permission) { 
        console.log ("New permission: ", permission); 
        checkPermission(); 
       }); 
      } 
     } 

     function fireNotice() { 
      if (! ntcOptions.title) { 
       console.log ("Title is required for notification"); 
       return; 
      } 
      if (ntcOptions.text && ! ntcOptions.body) { 
       ntcOptions.body = ntcOptions.text; 
      } 
      var ntfctn = new Notification (ntcOptions.title, ntcOptions); 

      if (ntcOptions.onclick) { 
       ntfctn.onclick = ntcOptions.onclick; 
      } 
      if (ntcOptions.timeout) { 
       setTimeout (function() { 
        ntfctn.close(); 
       }, ntcOptions.timeout); 
      } 
     } 
    } 
} 
Смежные вопросы