繁体   English   中英

删除HTML5通知权限

[英]Remove HTML5 notification permissions

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

Notification.requestPermission(callback);

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

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

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

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

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

您可以将权限检索为:

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

如果要显示通知,请检查您的权限:

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

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

如果您不想显示通知,只需不要调用new Notification

您可以在条件内将所有调用包装到new Notification

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

或者,您可以重写Notification构造函数以包含contiditional并根据需要调用原始Notification

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM