停止窗口.位置.替换重定向

Stopping window.location.replace from redirecting

本文关键字:替换 重定向 位置 窗口      更新时间:2023-09-26

我有一个 html 代码,我无法更改,但可以将.js文件加载到其中。

我可以添加一些 java 脚本代码来阻止window.location.replace工作吗?

为此,您必须替换 location 上的 replace 函数,完全替换location,或完全替换window(这不是保证,因为您也可以在松散模式下在全局范围内this访问它,并通过其他几个别名)。

似乎两者都是不可能的,即使有Object.defineProperty.

本杰明提到了历史 API,但我在历史 API 中没有看到任何允许您取消由 location.replace 发起的导航的内容。

所以我认为你不能这样做。

(CW,因为这是社区的努力。

无法重新定义location.replace,因为它不是可配置的属性。

但是,您可以尝试将整个location对象替换为类似的对象(例如代理),但使用自定义replace

问题是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
})();