Javascript 删除facebook跟踪像素(或类似像素)后如何重定向*

Javascript 删除facebook跟踪像素(或类似像素)后如何重定向*,javascript,url-redirection,facebook-pixel,Javascript,Url Redirection,Facebook Pixel,尝试找出在删除Facebook重定目标像素后如何重定向到新页面 我们已经设置了其他所有功能,但希望添加此功能(与相同) 我们目前使用的是window.location.replace('https://thelinkgoeshere.com');但我认为Facebook是异步的,所以我们不能只在上面添加像素代码 谢谢你能提供的任何帮助 如果仔细查看Facebook像素代码,您会注意到,在该代码的某个地方,像素插入的动态脚本标记的async属性设置为true,如下所示: t.async=!0;

尝试找出在删除Facebook重定目标像素后如何重定向到新页面

我们已经设置了其他所有功能,但希望添加此功能(与相同)

我们目前使用的是
window.location.replace('https://thelinkgoeshere.com');
但我认为Facebook是异步的,所以我们不能只在上面添加像素代码


谢谢你能提供的任何帮助

如果仔细查看Facebook像素代码,您会注意到,在该代码的某个地方,像素插入的动态
脚本
标记的
async
属性设置为
true
,如下所示:

t.async=!0; 
!0的计算结果为
true

要更改此行为,请查找此属性在像素中的设置位置,然后将其更改为false:

t.async=false; 
通常不建议这样做,因为关闭
async
将阻止进一步执行,直到加载并执行脚本,但在您的情况下,这正是您需要的

async
设置为false后,可以保证FB pixel JS代码将在像素后面的下一个脚本之前加载并运行:

<script> 
    // FB pixel here with async false 
</script>

<script>
    window.location.replace('https://thelinkgoeshere.com');
<script>

//此处为FB像素,异步为false
window.location.replace('https://thelinkgoeshere.com');

您可以修改页面上的facebook像素脚本

  !function(f,b,e,v,n,t,s)
  {if(f.fbq)return;n=f.fbq=function(){n.callMethod?
  n.callMethod.apply(n,arguments):n.queue.push(arguments)};
  if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
  n.queue=[];t=b.createElement(e);t.async=!0;
  t.src=v;s=b.getElementsByTagName(e)[0];
  s.parentNode.insertBefore(t,s)}(window, document,'script',
  'https://connect.facebook.net/en_US/fbevents.js');
  fbq('init', '111......1');
  fbq('track', 'PageView');

  //add your redirect here
  window.location.replace('https://thelinkgoeshere.com');

目前的答案并不能完全解决这个问题

确实,重定向将等待fbevents.js加载。但是,它不会等待fbq事件被发送,这正是您希望从这个解决方案中得到的

以下是两个Chrome如何在极慢的连接和3G上处理您的提案的示例:

在第一个例子中,Facebook甚至没有时间在重定向之前启动跟踪请求。在第二个例子中,它确实设法启动它,但是Chrome取消了跟踪,因为等待重定向

如果Facebook能像Google Analytics那样提供回调功能,那就很容易了,但在撰写本文时,它目前还没有提供回调功能

网络上有很多解决方案,只需使用固定的setTimeout在一秒钟后重定向即可。但这一解决方案带来了两类问题:

  • 当连接速度比预期慢得多时,它不工作。在这种情况下,重定向仍将发生在轨迹之前。所以你会丢失数据
  • 它强制快速连接的用户在重定向之前等待您的任意计时器通过 不过,为了达到预期效果,你可以做的是一次彻底的黑客攻击,如果Facebook最终实现回调,我会很高兴,所以请小心使用此回调:

    注意:我为此使用了两个库(jQuery和imagesLoaded)。你可能不需要这些,但我选择了简单的路线,不太在意开销

    
    //标题材料
    //常规Facebook像素代码(不需要使用async修改!)
    $(函数()
    {
    $(“#像素加载”).imagesLoaded().done(函数(inst)
    {
    setTimeout(函数(){window.location.href='someURL';},100);
    });
    });
    
    这将从Facebook加载fbq方法中使用的精确跟踪图像,从而允许补偿到Facebook服务器的缓慢连接。遗憾的是,您必须使用图像,不能使用简单的AJAX请求,因为Facebook的源代码策略不允许这样做

    以下是Chrome在更改后如何处理重定向和Facebook像素请求的示例:

    这似乎允许浏览器正确地将重定向排队,因此它发生在像素跟踪事件之后。我还没有在传统浏览器上尝试过这一点,所以我将重复我自己:使用此代码时要小心

    编辑:
    Edge和Firefox表现出类似的行为,这个解决方案似乎也能与它们配合使用。

    您考虑过使用Google Tag Manager吗

    它使您能够更好地控制脚本的加载方式。此外,您可以在标记管理器中创建脚本,以便在FB one启动后重定向

    这正是我设置我的:


    如前所述,JS代码不起作用,因为在页面重定向之前不一定跟踪事件。如果您不想添加片状超时,那么最好使用fallback pixel
    img
    标记

    这是我的密码:

    
    请稍候。。。
    
    如果没有重定向,请单击。 var img=document.createElement('img'); 变量函数=函数(){ window.location=”https://...."; }; img.onload=重定向功能; img.onerror=重定向功能; 文件.正文.附件(img); img.src=”https://www.facebook.com/tr?id=PIXEL_ID&ev=PageView&noscript=1";

    专业提示:您可能需要添加
    我必须交换jquery脚本和
    定义的位置,有时图像加载太快,并且没有调用
    imagesLoaded()
    。现在它可以工作了。但是,它看起来还是很不可靠,有时候像素就是没有被跟踪。
    <html>
    <head>
        // Header Stuff
        <script>
           // Regular Facebook Pixel Code (Does not need to be modified with async!)
        </script>
        <script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>
        <script src="https://unpkg.com/imagesloaded@4/imagesloaded.pkgd.min.js"></script>
    </head>
    <body>
        <!-- You should provide a Fallback Button here in case automatic redirect fails! -->
        <img id="pixelLoad" src="https://www.facebook.com/tr/">
        <script>
            $(function()
            {
                $("#pixelLoad").imagesLoaded().done(function(inst)
                {
                    setTimeout(function(){ window.location.href='someURL'; },100);
                });
            });
        </script>
    </body>