Notification.requestPermission() 在 Mozilla 上抛出错误

Notification.requestPermission() throwing error on Mozilla

我正在尝试获取 Mozilla 的通知。但是它不断抛出这个错误。

The Notification permission may only be requested from inside a short running user-generated event handler.

这是我的代码。相同的代码在 Chrome、EDGE 和 Opera 上运行良好。

Notification.requestPermission().then(function (status) {
    if (status === 'denied') {
        //
    } else if (status === 'granted') {
        //
    }
});

我发现了一些与此相关的问题,但其中 none 对我有帮助。

该消息表示您的订阅代码必须在用户生成的事件(如点击)中调用。

可能您正在尝试在页面加载时订阅用户,但这在某些浏览器(如 Firefox 和 Safari)上是不可能的,因为这被认为是用户的烦恼。

这就是为什么许多推送服务(如 OneSignal、Pushpad 等)建议使用双重选择加入的原因之一:首先显示一个订阅提示或按钮,设计为 HTML / CSS 然后,在单击按钮后,您实际请求权限(上面的代码)。

这也发生在我身上。 如果您不想使用按钮或其他元素事件,您可以使用更高级别的文档单击事件并从那里请求权限。

document.addEventListener('click', () => {
        Notification.requestPermission().then(function (status) {
        if (status === 'denied') {
            //
        } else if (status === 'granted') {
            //
        }
    });
})

这段代码对我有用:

JS

if (Notification.permission === 'granted') {
    //do something
}
else if (Notification.permission === 'default') {
    $('#allow-push-notification-bar').show();
}

$('#allow-push-notification').click(function () {
    $('#allow-push-notification-bar').hide();
    Notification.requestPermission().then(function (status) {
        if (status === 'denied') {
            //do something
        } else if (status === 'granted') {
            //do something
        }
    });
});

HTML

<div id="allow-push-notification-bar" class="allow-push-notification-bar">
    <div class="content">
        <div class="text">
            Want to get notification from us?
        </div>
        <div class="buttons-more">
            <button type="button" class="ok-button button-1" id="allow-push-notification">
                Yes
            </button>
            <button type="button" class="ok-button button-1" id="close-push-notification">
                No
            </button>
        </div>
    </div>
</div>

这将在加载带有 2 个按钮的网页后打开一个弹出窗口(/)。单击,浏览器将要求允许通知。