簡體   English   中英

用戶腳本通知適用於Chrome而非Firefox?

[英]Userscript notifications work on Chrome but not 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用戶腳本中啟用通知的常見做法是什么?

Greasemonkey(Firefox)尚未支持GM_notification() 如果您檢查了錯誤控制台 ,您會看到此錯誤:

GM_notification未定義

一個舊功能請求將GM_notification()添加到Greasemonkey; 你可以去那里,並敦促領先的GM開發人員嘗試趕上Tampermonkey。 :)

在添加該功能之前,您可以使用許多現代瀏覽器支持的HTML5(ish) 通知 API “填充”對GM_notification的支持。

添加了填充程序的測試腳本如下所示。 在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);
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM