未捕获的类型错误:OneSignal.once不是一个函数。

5

嗨,我想向浏览器发送推送通知。所以我使用了OneSignal。

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");
    });
 });

但是我遇到了Uncaught TypeError: OneSignal.once is not a function的问题。如果有人知道,请帮助我。

2个回答

10

解决方案

您需要使用OneSignal.push(function() { ... })将调用进行包装:

OneSignal.push(function() {
  /* ... */
});

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

说明

OneSignal SDK会异步加载到您的页面中,例如:

<script src="https://cdn.onesignal.com/sdks/OneSignalSDK.js" async"></script>

您可以在这里在这里了解有关async属性的更多信息。

基本上,没有async属性的脚本会在获取和执行期间停止页面其余部分的加载,但是包含async属性的脚本允许页面的其余部分加载,同时它会被最终获取和执行。这对依赖于现有OneSignal的页面脚本构成了问题。如果OneSignal变量尚不存在,如何使用OneSignal

大多数OneSignal代码示例都以以下方式开始:

var OneSignal = window.OneSignal || [];

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

所有数组都有一个 .push() 函数,所以此时,OneSignal 变量只是我们正在向其推送的一组函数的数组。

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


嗨,Jason。感谢你的回答。现在我没有收到控制台错误。但是当我在init函数中放置警报时,我没有收到警报消息。我已更改代码以供参考。 - Sivabalan

0
OneSignal.push(function() {
    OneSignal.once("init", function(event) {
        // This callback fires only once when the event occurs, and does not refire
    });
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接