javascript - 避免第三方脚本的 window.location.reload()

标签 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,该 URL 在页面加载期间加载了一堆其他脚本),我无法手动编辑它。
  2. 我无法阻止用户通过 F5 手动重新加载页面。

我已经尝试使用以下 jQuery 代码,但它不起作用:

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

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

最佳答案

关键是Oe.targetJSLoaded。找出什么是 Oe。尝试从 Ne 函数开始跟踪调用堆栈。

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

TNT.a.ge = function (he, ie, Tb, nc, Ub) {
    if (!ie.targetJSLoaded) {
        Ub.setCookie(Tb, true, nc);
        he.location.reload();
    }
};

在您的函数和 Harbor Freight 的函数中,我们希望 targetJSLoadedtrue

环顾四周,我们发现 TNT.a.geTNT.a.je 调用,它被一个匿名函数调用,如下所示:

TNT.a.je(window, document, b, H, Ub);

TNT.a.je中,我们推导出ie.targetJSLoaded指的是window._AT.targetJSLoaded

定义属性以覆盖 window._AT.targetJSLoadedtrue:

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

关于javascript - 避免第三方脚本的 window.location.reload(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36070766/

相关文章:

javascript - 将 useState 状态传递给 React 中的路由器组件

php - 为什么我的日期选择器和时间选择器不显示?

jquery - XSLT 破坏 Firefox 中的 jQuery/Prototype 脚本

JQuery 淡出然后加载

javascript - 如何根据iframe内容从父窗口触发事件?

javascript - 显示 Chrome 扩展中当前事件选项卡的标题

jquery - bootstrap 中的下拉菜单 + 而不是列表我想要下拉列表中的 X 列列表

javascript - 如何在没有 Vue.js CLI 的情况下成功使用 axios(例如,使用 JS Fiddle)

javascript - 动态使用 iframe 作为页面覆盖

javascript - 支持事件的图像预加载器javascript