避免使用第三方脚本的window.location.reload()

时间:2016-03-17 20:10:43

标签: javascript jquery html

我在我的网页上使用第三方脚本(Adobe DTM,对标记管理有用),这会导致以下问题:

我注意到我的页面在第一次完全加载后正在重新加载(在下一次加载时,它不再发生),并且责备在这个函数上,出现在其中一个脚本上由我的HTML中的DTM标记加载。

function Ne(Oe, Gc, nc, Ic) {
        if (Oe.targetJSLoaded) {
            return;
        }
        Ic.setCookie(Gc, true, nc);
        window.location.reload(); //in the first page load, this line is always executed
    }

如果脚本超过5000行并且它被混淆了,那么很难弄清楚脚本会发生什么。

我需要阻止执行window.location.reload(),但我遇到以下问题:

  1. 一旦是第三方加载的脚本(脚本标记指向在页面加载期间加载一堆其他脚本的URL),我无法手动编辑它。
  2. 我无法通过F5手动重新加载页面。
  3. 我已尝试使用以下jQuery代码,但它不起作用:

    $(window).bind("beforeunload",function(e){
            e.preventDefault();
    });
    

    考虑到所描述的情况,是否有表格可以防止编程重新加载?

3 个答案:

答案 0 :(得分:2)

不幸的是,您唯一的解决方案是修改脚本,然后替换DTM标记,使其指向您自己的版本(可能在此过程中破坏它),或者只是停止使用Adobe DTM。任何需要重新加载页面的跟踪设计都不是很好。

答案 1 :(得分:2)

关键是Oe。找出Ne是什么。尝试从TNT.a.ge = function (he, ie, Tb, nc, Ub) { if (!ie.targetJSLoaded) { Ub.setCookie(Tb, true, nc); he.location.reload(); } }; 函数开始执行调用堆栈。

例如,Harbor Freight的代码与您的代码类似:

targetJSLoaded

在您的函数和Harbor Freight的功能中,我们希望trueTNT.a.ge

环顾四周,我们发现TNT.a.je调用了TNT.a.je(window, document, b, H, Ub); ,它由匿名函数调用,如下所示:

TNT.a.je

ie.targetJSLoaded中,我们推断window._AT.targetJSLoaded是指window._AT.targetJSLoaded

定义属性以覆盖truefunction overrideTargetJsLoaded(_AT) { Object.defineProperty(_AT, "targetJSLoaded", { value: true, enumerable: true, configurable: true }); return _AT; } function override_AT() { let _AT = overrideTargetJsLoaded({}); Object.defineProperty(window, "_AT", { get: function get_AT() { return _AT; }, set: function set_AT(object) { _AT = overrideTargetJsLoaded(object); }, enumerable: true, configurable: true }); }

targetJSLoaded

现在,您需要在执行任何其他脚本之前覆盖override_AT,因此您需要在网页上的所有其他脚本之前放置调用private async Task<String> getRawPostData() { using (var contentStream = await this.Request.Content.ReadAsStreamAsync()) { contentStream.Seek(0, SeekOrigin.Begin); using (var sr = new StreamReader(contentStream)) { return sr.ReadToEnd(); } } } 函数的脚本。

答案 2 :(得分:0)

只要您不需要以编程方式在其他地方重新加载页面,您就可以尝试覆盖该功能。

window.location.reload = function(){}