Javascript 正在从重定向停止window.location.replace

Javascript 正在从重定向停止window.location.replace,javascript,Javascript,我有一个html代码,我不能更改,但可以加载到它的.js文件 我可以添加一些java脚本代码来停止window.location.replace工作吗?要执行此操作,您必须替换location上的replace函数、完全替换location或完全替换window(这不是一个保证,因为您还可以在松散模式下在全局范围内以this的身份访问它,并通过几个其他别名) 这两种方法似乎都不可能,即使使用对象。defineProperty Benjamin提到了history API,但我在history A

我有一个html代码,我不能更改,但可以加载到它的.js文件


我可以添加一些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我想我不能使用代码不是内部函数,它只是内部条件。