javascript - 如何覆盖 JavaScript web api 通知对象

标签 javascript electron

我有一个场景,我需要为在 Electron 窗口内的 webview 中加载的网页打开和关闭通知。为此,我在 webview 中注入(inject)了一个预加载文件,它会像这样覆盖 Notification 对象。

window.oldNotification = window.Notification;
window.Notification = function() {
    let notificationEnabled = localStorage.getItem('notification-permissions') === 'true';
    if (notificationEnabled) {
        new window.oldNotification(...arguments);
    }
};

我通过更改本地存储变量来启用和禁用通知。

问题是我要控制的网页正在使用Notification.permission 方法(refer this) .现在我的新 Notification 对象没有权限属性。我无法以可以更新其构造函数的方式覆盖 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);
};

关于javascript - 如何覆盖 JavaScript web api 通知对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53390156/

相关文章:

javascript - jQuery 视频不循环播放

javascript - Bootstrap `nav` 元素不可点击

angular - 如何从 Angular 2 组件打开 Electron 对话框?

javascript - 在 React JSX 中返回配对元素

javascript - Bin Packing Js 实现使用盒子旋转以获得最佳匹配

javascript - PHP 查询返回相同的数据,即使它发生了变化

javascript - 如何将值作为参数从 Node js文件发送到 Electron main.js文件的loadURL()?

javascript - 我无法重新安装或更新 Electron 包

javascript - 使用 JS 对象查询 MySQL,返回 [object Object] 作为表名

javascript - 在 ember-cli 中配置 watchman