Javascript 正在从重定向停止window.location.replace
我有一个html代码,我不能更改,但可以加载到它的.js文件Javascript 正在从重定向停止window.location.replace,javascript,Javascript,我有一个html代码,我不能更改,但可以加载到它的.js文件 我可以添加一些java脚本代码来停止window.location.replace工作吗?要执行此操作,您必须替换location上的replace函数、完全替换location或完全替换window(这不是一个保证,因为您还可以在松散模式下在全局范围内以this的身份访问它,并通过几个其他别名) 这两种方法似乎都不可能,即使使用对象。defineProperty Benjamin提到了history API,但我在history A
我可以添加一些java脚本代码来停止
window.location.replace
工作吗?要执行此操作,您必须替换location
上的replace
函数、完全替换location
或完全替换window
(这不是一个保证,因为您还可以在松散模式下在全局范围内以this
的身份访问它,并通过几个其他别名)
这两种方法似乎都不可能,即使使用对象。defineProperty
Benjamin提到了history API,但我在history API中没有看到任何允许您取消由location.replace启动的导航的内容
所以我认为你做不到
(CW,因为这是一项社区工作。)要做到这一点,您必须要么替换位置上的替换功能,要么完全替换位置,要么完全替换窗口(这不是一个保证,因为您还可以在松散模式下在全局范围内以this
的身份访问它,并通过几个其他别名)
这两种方法似乎都不可能,即使使用对象。defineProperty
Benjamin提到了history API,但我在history API中没有看到任何允许您取消由location.replace启动的导航的内容
所以我认为你做不到
(CW,因为这是一项社区工作。)无法重新定义位置。请替换,因为它不是可配置的属性
但是,您可以尝试用类似的对象(例如代理)替换整个位置
对象,但要使用自定义的替换
问题在于window.replace
也不可配置,但您可以在内部范围中对其进行阴影处理:
(function() {
function customReplace() { /* ... */ }
var location = new Proxy(Object.create(window.location), {
get: function(target, property, receiver) {
if(property === 'replace') return customReplace;
return window.location[property];
},
set: function(target, property, value, receiver) {
return window.location[property] = value;
return true;
},
});
location.replace('http://example.com'); // Nothing happens
location.host; // Still works
location.host = 'example.com'; // Still works
})();
无法重新定义位置。请替换,因为它不是可配置属性
但是,您可以尝试用类似的对象(例如代理)替换整个位置
对象,但要使用自定义的替换
问题在于window.replace
也不可配置,但您可以在内部范围中对其进行阴影处理:
(function() {
function customReplace() { /* ... */ }
var location = new Proxy(Object.create(window.location), {
get: function(target, property, receiver) {
if(property === 'replace') return customReplace;
return window.location[property];
},
set: function(target, property, value, receiver) {
return window.location[property] = value;
return true;
},
});
location.replace('http://example.com'); // Nothing happens
location.host; // Still works
location.host = 'example.com'; // Still works
})();
查看历史api。@BenjaminGruenbaum:历史api如何阻止位置。replace
调用工作?@JamesThorpe:是的。我还尝试替换位置
对象(直接,当然不起作用,因为它以特殊的方式处理任务,也可以通过Object.defineProperty
,也不起作用)@Benjamin Gruenbaum我不需要返回上一页,我需要停止重定向到历史api中。@BenjaminGruenbaum:历史api如何阻止位置。replace
调用工作?@JamesThorpe:是的。我还尝试替换位置
对象(直接,当然不起作用,因为它以特殊的方式处理任务,也可以通过Object.defineProperty
,也不起作用)@Benjamin Gruenbaum我不需要返回到上一页,我需要停止重定向。是否有其他关于location.replace的解决方案?我可以在location.replace发生后停止重新加载页面吗?@mgalesic:您可以使用onbeforeuload
处理程序要求浏览器向用户显示一条消息,以然后,ch允许用户选择是否留在页面上甚至不显示您的消息,只是一条普通消息。谢谢,我会尝试的onbeforeunload@mgalesic另一种选择是尝试拦截调用位置的函数。替换,并用你的替代品替换它们,但如果试图保留正确的上下文等,则很容易变得混乱。@James Thorpe我想我不能“使用代码”不是内部函数,它是唯一的内部条件。是否有其他关于location.replace的解决方案?我是否可以在location.replace发生后停止重新加载页面?@mgalesic:您可以使用onbeforeuload
处理程序要求浏览器向用户显示一条消息,然后让用户选择是否一些浏览器(例如Firefox)甚至不显示您的消息,只是一条普通消息。谢谢,我会尝试的onbeforeunload@mgalesic另一种选择是尝试拦截调用位置的函数。替换,并用你的替代品替换它们,但如果试图保留正确的上下文等,则很容易变得混乱。@James Thorpe我想我不能使用代码不是内部函数,它只是内部条件。