11

我正在使用 Google Tag Manager 来交付 Facebook Pixel。

然后,我使用这样的代码触发事件

  <body>
...
        <script>
            fbq('track', 'ViewContent', { 
                content_type: 'product',
                content_ids: ['1234'],
                content_name: 'ABC Leather Sandal',
                content_category: 'Shoes',
                value: 0.50,
                currency: 'USD'
            });
        </script>
    </body>

但是当代码被执行时,我得到了一个错误,因为 Facebook Pixel 是异步加载的并且 fbq 还不可用。

未捕获的 ReferenceError:未定义 fbq

我应该怎么办?

4

4 回答 4

15

无法让 Eike 的工作方法最终得到以下“肮脏的解决方法”(基本上它只是等到 fbq 启动):

<script>
    function waitForFbq(callback){
        if(typeof fbq !== 'undefined'){
            callback()
        } else {
            setTimeout(function () {
                waitForFbq(callback)
            }, 100)
        }
    }

    waitForFbq(function () {
        fbq('track', 'Registered');
    })
</script>

也许它也会帮助某人

于 2019-07-05T12:48:04.597 回答
10

使用标签排序功能。这允许以预定义的顺序触发标签,其中后续标签在执行之前等待前面的标签。

创建一个加载 FB 初始化代码的标签。在代码触发选项中选择“每页一次”(您只需加载一次,即使它被多个代码使用)。

转到您的 Facebook 事件标签。在高级设置中查找标签排序选项。将其设置为:

在此处输入图像描述

(Facebook init 是您加载 FB 库的标签,我假设您使用他们的标准引导代码)。启用最后一个复选框后,如果您的设置标签失败,则不会触发。

由于 FB 引导代码将使用命令队列设置 fbq 对象,您现在可以将数据推送到 fbq;即使库仍在下载,数据也会进入命令队列,并在库下载完成后执行调用。

标签序列确保在您的活动之前设置 fbq 对象。如果这是您唯一的 FB 事件,您可以省去麻烦,只需将加载程序粘贴到事件代码上方即可。

于 2017-10-27T14:00:06.020 回答
0

有同样的错误——最后都是关于排序的。

当通过 WP 插件在 wordpress 网站上通过标签管理器使用时,像素默认加载在页脚中,因此在页脚中声明之前使用的 fbq 变量在正文中无法识别: Google Tag Manager for WordPress options

我尝试了不同的设置,最后放弃了使用插件 - 只需使用我的页面构建器的脚本部分(Thrive Architect = TA)将它插入标题部分:TA 中的自定义脚本设置 现在一切正常!

于 2019-05-15T14:43:24.467 回答
0

处理此类问题的正确方法

您需要检查窗口引用是否存在,而不是其值为空!

虽然你不能使用:

if (fbq !== undefined) {
  // browser code
}
// or 
if (window.fbq !== undefined) {
  // browser code
}

因为这会尝试将不存在的变量(窗口)与未定义的变量进行比较,从而导致强大的“ReferenceError:未定义窗口”。您仍然可以使用:

if (typeof window !== "undefined") {
  // browser code
}

因为 typeof 不会尝试评估“window”,它只会尝试获取它的类型,

于 2021-08-16T10:52:37.303 回答