Javascript 避免使用第三方脚本';s window.location.reload()
我在我的页面上使用了第三方脚本(Adobe DTM,用于标记管理目的),它导致了以下问题: 我注意到我的页面在第一次完全加载之后就被重新加载了(在下一次加载中,它不再发生),这是由于这个函数,在我的HTML中DTM标签加载的一个脚本中出现了这个函数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
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()
,但我有以下问题:
$(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脚本首先要收费。