Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在safari中查找持续页面刷新的原因?_Safari_Page Refresh_Google Dfp - Fatal编程技术网

如何在safari中查找持续页面刷新的原因?

如何在safari中查找持续页面刷新的原因?,safari,page-refresh,google-dfp,Safari,Page Refresh,Google Dfp,我试图找出一个客户网站上的问题,这个问题在过去一个月左右出现,因为iOS和OSX都有最新的更新。当Mac或iOS Safari的用户通过EDM中的链接被引导到站点中的任何页面时,他们会陷入不断刷新页面的循环中。它似乎也会在刷新之间泄漏内存,因为Activity Monitor显示该站点的Safari Web内容进程的内存使用量快速增长(在我杀死它之前的两分钟左右达到了4GB) 该问题只能在Safari浏览器上重现。Mac上的Chrome似乎没有受到影响。Safari for Windows显示刷

我试图找出一个客户网站上的问题,这个问题在过去一个月左右出现,因为iOS和OSX都有最新的更新。当Mac或iOS Safari的用户通过EDM中的链接被引导到站点中的任何页面时,他们会陷入不断刷新页面的循环中。它似乎也会在刷新之间泄漏内存,因为Activity Monitor显示该站点的Safari Web内容进程的内存使用量快速增长(在我杀死它之前的两分钟左右达到了4GB)

该问题只能在Safari浏览器上重现。Mac上的Chrome似乎没有受到影响。Safari for Windows显示刷新问题,但似乎没有开始囤积内存,尽管WebKit2WebProcess.ee进程的CPU使用率在窗口关闭之前一直处于相当高的值。我试着一个接一个地删除添加到EDM链接中的utm_*参数,直到我能够确认问题是由utm_*源本身引起的,然后发现我应该预料到这一点,因为它显然是GA寻找的主要标记。更有趣的是,删除GA并没有解决这个问题——我注释掉了创建脚本标签的代码(值得一提的是,使用的脚本不是普通的www.google-analytics.com/GA.js,而是stats.g.doubleclick.net/dc.js中的DFP脚本)

解决问题的方法是不加载GPT-注释以下代码:

var googletag = googletag || {};
    googletag.cmd = googletag.cmd || [];
    (function() {
        var gads = document.createElement("script");
        gads.async = true;
        gads.type = "text/javascript";
        var useSSL = "https:" == document.location.protocol;
        gads.src = (useSSL ? "https:" : "http:") + "//www.googletagservices.com/tag/js/gpt.js";
        var node =document.getElementsByTagName("script")[0];
        node.parentNode.insertBefore(gads, node);
    })();
所以我相当肯定GPT正在检测utm_源参数并试图做一些事情。。。在Safari上失败的原因是。。。不幸的是,GPT代码是模糊的,我不太可能在阅读它时发现问题,所以我希望在Safari的开发人员控制台刷新页面之前,有一些方法可以获取调用堆栈,但我不知道,或者其他一些我没有想到的调试技术。也许其他人也遇到过这个问题

据我所知,唯一关心这些参数的脚本是Google Analytics,因此我也乐于听到我正在沿着花园的道路前进


编辑:我尝试取消对GPT脚本标记的注释,然后在页面上的一个位置添加注释,我们将命令推送到该位置(使用
googletag.cmd.push()
),以防我们使用它导致问题(我们基本上只是在推送的cmd中定义然后发布8个插槽,然后启用广告服务)。注释此命令并没有解决问题,它似乎与加载了GPT有关。

因此,这在所有方面都是一个令人难以置信的令人困惑的问题,即使在我修复了它之后,情况仍然如此

我们能够通过更新网站上使用的History.js lib来解决这个问题,就其本身而言,我完全可以接受这是一个有效的故障排除步骤(因此我尝试了一下)。然而,对于History.js和gpt.js如何相互接口,我完全感到困惑。导致问题仅在以下情况下发生:

使用Safari 使用旧版本的History.js 使用GPT(应该对History.js没有影响) 使用utm_源标记(应该对History.js或GPT没有影响)

但我更喜欢被一个固定的问题而不是一个流行的问题弄糊涂,所以我将把它放在“太难”的篮子里

顺便说一句,我的主要问题是做什么,而不是问题本身,所以这里是我如何得出结论的,以防它对其他人有帮助:

  • 我在
    的顶部添加了一个脚本标记,它为beforeunload注册了一个事件处理程序,并调用调试器语句。这将给我时间在页面刷新之前实际检查时间线和探查器
  • 这向我表明,在beforeunload事件之前,调用了一个popstate事件(事后来看,我责备自己在看到popstate时没有直接进入History.js)。此事件安装了一个计时器,我注意到它会立即触发,然后每1000毫秒触发一次。这是beforeunload事件之前popstate事件中最后触发的事件,因此我认为它很有可能导致刷新
  • 接下来,我花了一些时间对safari没有公开其时间轴中事件的调用堆栈这一事实表示怀疑。我知道如何在Chrome中实现这一点,但我无法在Chrome中实现这一点。我所要做的就是定时器ID。最终我覆盖了setTimeout,如下所示:

  • 对setInterval也做了同样的操作。然后我可以重新加载页面,获取计时器的ID,然后在控制台中检查
    timers[ID]
    以获取安装计时器的函数的文本

  • 接下来,我需要在所有加载的脚本文件中搜索有问题的函数定义(这是一个模糊的、丑陋的脚本,我很难猜到),我不确定这在Safari中是否真的可行,如果是,我也不知道如何实现。幸运的是,这并不依赖于重现问题,所以我加载了Chrome并使用它的开发工具来搜索脚本文件
  • 在History.js中找到该函数后,我们对其进行了更新,发现问题已得到解决
var origST = window.setTimeout;
window.timers = [];
window.setTimeout = function(f,t) {
  window.timers[origST(f,t)] = window.setTimeout.caller ? window.setTimeout.caller : 'Global Scope';
}