未捕获的TypeError:OneSignal.once不是函数

Siv*_*lan 3 javascript push-notification onesignal

Hai我想将推送通知发送到浏览器.所以我使用了信号.

var OneSignal = OneSignal || [];
OneSignal.push(["init", {
    appId           :   "xxxxxxx",
    autoRegister    :   false, /* Set to true to automatically prompt visitors */
    subdomainName   :   "https://foxtaxi.onesignal.com",
    notifyButton    :   {
        enable: true /* Set to false to hide */
    }
}]);

OneSignal.push(function() {
    OneSignal.once("init", function(event) {
        alert("hhh");
    });
 });
Run Code Online (Sandbox Code Playgroud)

但是我得到了Uncaught TypeError:OneSignal.once不是一个函数.如果有人知道,请帮助我.

Jas*_*son 7

你需要用OneSignal.push(function() { ... })以下方式打电话:

OneSignal.push(function() {
  /* ... */
});
Run Code Online (Sandbox Code Playgroud)

此外,OneSignal.once('init')不是有效的事件.在支持的事件在这里描述.

说明

OneSignal SDK在您的页面上异步加载,例如:

<script src="https://cdn.onesignal.com/sdks/OneSignalSDK.js" async"></script>
Run Code Online (Sandbox Code Playgroud)

您可以在此处此处阅读有关async属性的更多信息.

基本上,没有async属性的脚本在获取和执行页面时会停止加载页面的其余部分,但async脚本允许加载页面的其余部分,同时最终获取并执行该页面.这给依赖于OneSignal现有页面脚本的页面脚本带来了问题.如果OneSignal变量尚不存在,如何OneSignal使用?

大多数OneSignal代码示例都以:

var OneSignal = window.OneSignal || [];
Run Code Online (Sandbox Code Playgroud)

这说:创建一个OneSignal变量,如果加载OneSignal已经将它分配给加载的实例,否则让OneSignal等于空数组[].

所有数组都有一个.push()函数,所以在这一点上,OneSignal变量只是我们正在推动它的一系列函数.

当SDK最终加载时,SDK会处理到目前为止推送的所有函数并重新定义.push().