Javascript 避免使用第三方脚本';s window.location.reload()

Javascript 避免使用第三方脚本';s window.location.reload(),javascript,jquery,html,Javascript,Jquery,Html,我在我的页面上使用了第三方脚本(Adobe DTM,用于标记管理目的),它导致了以下问题: 我注意到我的页面在第一次完全加载之后就被重新加载了(在下一次加载中,它不再发生),这是由于这个函数,在我的HTML中DTM标签加载的一个脚本中出现了这个函数 function Ne(Oe, Gc, nc, Ic) { if (Oe.targetJSLoaded) { return; } Ic.setCookie(Gc, true, n

我在我的页面上使用了第三方脚本(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()
,但我有以下问题:

  • 一旦是第三方加载的脚本(脚本标记指向一个URL,该URL在页面加载期间加载了一系列其他脚本),我就不能手动编辑它
  • 我无法阻止用户通过F5手动重新加载页面
  • 我尝试了以下jQuery代码,但不起作用:

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

    考虑到所描述的情况,是否有一种形式可以防止程序重新加载?

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

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


    window.location.reload=function()。找出什么是
    Oe
    。从
    Ne
    函数开始,尝试跟随调用堆栈

    例如,“港口货运”中的代码与您的代码类似:

    TNT.a.ge = function (he, ie, Tb, nc, Ub) {
        if (!ie.targetJSLoaded) {
            Ub.setCookie(Tb, true, nc);
            he.location.reload();
        }
    };
    
    在您的函数和港口货运函数中,我们希望
    targetJSLoaded
    true

    环顾四周,我们发现
    TNT.a.ge
    TNT.a.je
    调用,该函数由如下匿名函数调用:

    TNT.a.je(window, document, b, H, Ub);
    
    TNT.a.je
    中,我们推断
    ie.targetjsload
    指的是
    窗口

    定义要覆盖
    窗口的属性。_AT.targetJSLoaded
    true

    function 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\u AT
    函数的脚本放在网页上所有其他脚本之前。

    谢谢Jake!!问题:这会导致表单提交出现问题吗?我不这么认为,除非您的提交回调调用location.reload()。我已经尝试过了,但遇到了另一个问题。动态加载的脚本在我的自定义js之前加载。换句话说,当我重写
    window.location.reload
    时,页面已经被重新加载。该死射击在Firefox和Chrome中覆盖它看起来很棘手。很好,谢谢你的替代解决方案,但我也会遇到同样的问题。我所有的自定义脚本都不会产生任何效果,因为DTM脚本首先要收费。