Facebook像素fbq()无回调,如何获取其生成的_fbp cookie值
解决方法
方案1:使用fbq内置队列执行逻辑(优先推荐)
fbq本质是命令队列,所有推送给fbq的任务会按顺序执行。你可以将获取_fbp的逻辑包装成函数,push到fbq队列中排在PageView的track命令之后,会等PageView处理完成、_fbp cookie生成后再执行你的逻辑,无需额外处理异步时序问题。
fbq("track", "PageView"); // 逻辑推入fbq队列自动按顺序执行 fbq(function() { var fbp = document.cookie.split(";").filter(function(c) { return c.includes("_fbp=") }).map(function (c) { return c.split("_fbp=")[1]; })[0]; // 注意map返回数组,需取[0]拿到实际的cookie值 if (fbp) { // 此处调用自有API发送fbp即可 } });
该方案是Facebook官方支持的标准用法,性能好、成功率高。
方案2:轮询检测cookie(兜底方案)
如果特殊场景下方案1不生效,可以用短间隔轮询检测_fbp是否存在,拿到值后自动停止轮询,同时设置超时时间避免无限等待。
fbq("track", "PageView"); // 最多轮询10次,每次间隔200ms,共2秒超时,足够fbp完成生成 let retryCount = 0; const maxRetry = 10; const fbpTimer = setInterval(function() { var fbp = document.cookie.split(";").filter(function(c) { return c.includes("_fbp=") }).map(function (c) { return c.split("_fbp=")[1]; })[0]; if (fbp || retryCount >= maxRetry) { clearInterval(fbpTimer); if (fbp) { // 此处调用自有API发送fbp } else { // 自定义超时后的处理逻辑,比如忽略上报或者标记异常 } } retryCount++; }, 200);
另外补充你原有代码的小问题:你之前的写法拿到的fbp是数组类型,需要加[0]取第一个元素才是实际的cookie值,这也是可能你拿到的结果不符合预期的原因之一。
内容的提问来源于stack exchange,提问作者Bah S
相关产品推荐
相关产品推荐

