【问题标题】:Remove HTML5 notification permissions移除 HTML5 通知权限
【发布时间】:2015-02-12 13:03:04
【问题描述】:

您可以通过运行提示用户允许或拒绝来自浏览器的桌面通知:

Notification.requestPermission(callback);

但是是否可以通过代码删除该权限?我们希望我们的用户可以选择切换通知。这可以通过 JavaScript 实现,还是我们需要将该选项保存在其他地方?

【问题讨论】:

    标签: javascript html html5-notifications


    【解决方案1】:

    查看NotificationMDNWHATWG 上的文档,似乎没有办法请求撤销权限。但是,您可以使用 localStorage 模拟您自己的权限版本,以支持缺少的功能。假设您有一个用于切换通知的复选框。

    <input type="checkbox" onChange="toggleNotificationPermission(this);" />
    

    您可以将记住的权限存储在本地存储中notification-permission 键下,并更新权限状态类似于:

    function toggleNotificationPermission(input) {
        if (Notification.permission === 'granted') {
            localStorage.setItem('notification-permission', input.checked ? 'granted' : 'denied');
        } else if (Notification.permission === 'denied') {
            localStorage.setItem('notification-permission', 'denied');
            input.checked = false;
        } else if (Notification.permission === 'default') {
            Notification.requestPermission(function(choice) {
                if (choice === 'granted') {
                    localStorage.setItem('notification-permission', input.checked ? 'granted' : 'denied');
                } else {
                    localStorage.setItem('notification-permission', 'denied');
                    input.checked = false;
                }
            });
        }
    }
    

    您可以通过以下方式检索权限:

    function getNotificationPermission() {
        if (Notification.permission === 'granted') {
            return localStorage.getItem('notification-permission');
        } else {
            return Notification.permission;
        }
    }
    

    当您想显示通知时,请检查您的权限:

    if (getNotificationPermission() === 'granted') {
        new Notification(/*...*/);
    }
    

    【讨论】:

      【解决方案2】:

      不,您的脚本无法以编程方式放弃显示通知的权限。 API specification 除了requestPermission 之外没有任何权限相关的功能。 (当然,浏览器可能有一个选项菜单,允许用户撤销对域的权限,但这是浏览器级别的选项,而不是站点级别的选项。例如,在 Chrome 中,您可以通过以下方式查看此选项菜单点击地址栏左侧的图标。)

      如果您不想显示通知,只需不要致电new Notification

      您可以将所有对 new Notification 的调用封装在条件中:

      if(notifications_allowed) {
          new Notification(...);
      }
      

      或者您可以重写Notification 构造函数以包含一个条件语句并酌情调用原始Notification

      (function() {
          var oldNofitication = Notification;
          Notification = function() {
              if(notifications_allowed) {
                  oldNotification.apply(this, arguments);
              }
          }
      })();
      

      如果您使用以供应商为前缀的构造函数或函数(例如,webkitNotifications.createNotification),那么您还需要重写其中的每一个,以取决于您的 options 变量。

      【讨论】:

      • 好吧,我以为是这样。然后我们会选择将其保存在其他地方谢谢您的回答。
      猜你喜欢
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      • 2018-09-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多