用户脚本通知在 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 用户脚本中启用通知的常见做法是什么?
GM_notification()
is not (yet) supported in Greasemonkey (Firefox). And if you had ,你会看到这个错误:
GM_notification is not defined
Greasemonkey an old feature request to add GM_notification()
;你可以去那里敦促首席 GM 开发人员尝试赶上 Tampermonkey。 :)
在添加该功能之前,您可以使用 the HTML5(ish) Notifications API "shim" 支持 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);
}
}
}
}
我有一个用户脚本,如果目标页面上存在某些内容,它会弹出通知。
在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). And if you had
GM_notification is not defined
Greasemonkey an old feature request to add GM_notification()
;你可以去那里敦促首席 GM 开发人员尝试赶上 Tampermonkey。 :)
在添加该功能之前,您可以使用 the HTML5(ish) Notifications API "shim" 支持 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);
}
}
}
}