javascript - 用户脚本通知适用于 Chrome 但不适用于 Firefox?

标签 javascript greasemonkey userscripts tampermonkey

我有一个用户脚本,如果目标页面上存在某些内容,它会弹出一个通知。

在 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 用户脚本中启用通知的常见做法是什么?

最佳答案

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 开发人员 try catch 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);
            }
        }
    }
}

关于javascript - 用户脚本通知适用于 Chrome 但不适用于 Firefox?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36779883/

相关文章:

javascript - 用户/Javascript 格式

javascript - 文件未通过 socket.io 发送

javascript - 如何在单个 html 文件中使用 FontAwesome?

javascript - 如何使用 Greasemonkey 更改此 javascript?

javascript - 执行 php 后如何加载用户脚本?

javascript - 无需浏览器即可在网站上运行 javascript

javascript - 无法启用禁用的按钮

javascript - Redux:将选择器导入 Action ?

javascript - 如何区分一个链接是否会触发文件下载或跳转到其他地方,例如新的URL

javascript - 如何从动态创建的按钮传递参数?