2016-04-21 94 views
3

我有一個userscript,如果目標頁面上存在某些內容,它會彈出通知。Userscript通知適用於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

火狐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的;你可以去那裏,並敦促領先的通用汽車開發商嘗試趕上Tampermonkey。 :)

在添加該功能之前,您可以通過使用the HTML5(ish) Notifications API來支持GM_notification,這在許多現代瀏覽器中都受支持。

您的測試腳本添加了Shim,如下所示。測試在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); 
      } 
     } 
    } 
} 
相關問題