javascript - 如何覆盖 JavaScript web api 通知对象
问题描述
我有一个场景,我需要为电子窗口内的 web 视图中加载的网页打开和关闭通知。为此,我在 webview 中注入了一个 preload 文件,它像这样覆盖 Notification 对象。
window.oldNotification = window.Notification;
window.Notification = function() {
let notificationEnabled = localStorage.getItem('notification-permissions') === 'true';
if (notificationEnabled) {
new window.oldNotification(...arguments);
}
};
我通过更改本地存储变量来启用和禁用通知。
问题是我要控制的网页正在使用Notification.permission
方法(请参阅this)。现在我的新通知对象上没有权限属性。我无法以可以更新其构造函数的方式覆盖 Notification 对象,以便我可以禁用通知并拥有原始 Notification 对象的其他属性。
有没有办法实现这一点,或者这根本不可能?绝对欢迎任何帮助或建议。
解决方案
您可以轻松模拟 Notification API
window.Notification = function() {
const notificationEnabled = Notification.permission === 'granted';
return notificationEnabled ? new window.oldNotification(...arguments) : {};
};
Object.defineProperty(Notification, 'permission', {
get() {
return localStorage.getItem('notification-permissions') === 'true' ? 'granted' : 'denied';
}
});
Notification.requestPermission = (callback) => {
if (typeof callback === 'function') {
callback(Notification.permission);
}
return Promise.resolve(Notification.permission);
};
推荐阅读
- php - 纠正 Wordpress 文件夹 (Ubuntu) 的权限,以防止父文件夹中的恶意软件感染
- asp.net - SWAGGER 中未配置 RegionEndpoint 或 ServiceURL
- c - gcc 不编译 Visual Studio Code 中的任何其他库
- rust - 如何将值从一个枚举变体移动到另一个?
- c# - 模板 Xamarin.Forms Shell 应用程序中的 InvalidCastException
- api - Snapchat API 错误:出现错误 无效的 redirect_uri
- rust - `assert_eq!(a, b)` 和 `assert_eq!(a, b, )` 之间有区别吗?
- r - grepl ifelse 没有显示正确的值(R)
- javascript - 元素 ref 被指定为字符串 (wrappedInstance) 但未设置所有者。在 Netlify CMS 自定义小部件中连接到 Redux 存储
- firebase - Flutter - Firebase Auth + Firestore - 不同的查询结果