更改window.location原型以禁用某些重定向?

9
我正在尝试使用Greasemonkey在文档开头有选择性地禁用window.location。我不想完全禁用JavaScript,只是禁用一些使用JavaScript完成的重定向。它们看起来像这样:
window.location = "unwanted url";

1
你为什么想要这样做? - user2437417
重定向是如何进行的,确切地?至少有5种可能的方法。 - Brock Adams
@brock,window.location=urltoredirect; (at)crazy 我想停止一些重定向而不禁用JavaScript... - affiszervmention
3个回答

9
我认为这是不可能的。
  • 您无法覆盖window.location上的属性或方法(静默失败)
  • 您无法使用location.__proto__ = Something.prototype重新定义其原型
  • location.constructor.prototype基本上是Object.prototype
  • 构造函数实际上并没有做任何事情(例如创建属性或方法)
  • __definesetter__静默失败
  • Object.defineProperty会出现错误,如TypeError:Cannot redefine property: href
  • delete window.locationdelete window.location.href不起作用
我已经没有更多的想法了...

这真糟糕!看起来在2016年什么都没有改变 :-( - Petr Peller

5
你无法更改 window.location 原型,因为它是 window 的“本地属性”,并且它是不可配置的

在 Firefox(Greasemonkey)中,如果您尝试覆盖此属性,则会出现以下错误:

TypeError:无法重新定义不可配置属性“location”

以及

错误:拒绝访问阴影本机属性

...具体取决于您的尝试方式。其他浏览器也会给出类似的错误。


要阻止这种重定向,您需要逐个干预页面的 JavaScript。

有一个通用方法适用于 Firefox,请参见“停止执行 Javascript 函数(客户端)或调整它”。但基于您目标页面的确切代码,可能会更容易些。


好的,当它是<script>content</script>时可以工作,但是对于<script src="url"></script>呢?有没有办法也停止它? - affiszervmention
是的,checkForBadJavascripts() 有一个可以实现这个功能的模式。或者,您可以使用 Adblock 来阻止该脚本 URL。 - Brock Adams

-3

虽然有点晚,但你可以简单地使用Object.prototype.watch而无需删除整个脚本:

window.watch('location', function( attr ,_ , target){
    if(target.indexOf('unwanted url') !== -1)return '#';
});

类型错误:无法观察非本机类代理的对象 - user2867288
无法查看窗口或其他路径到位置。 - matthewdaniel
这个函数只在Gecko中实现,正如提问者所要求的。Firefox 23到27版本中存在一个导致此类型错误的bug,但现在已经修复了。 - Omar Elawady
这在FF 49中不起作用,如果它曾经起过作用的话。JS重定向仍然可以正常工作,没有任何干扰。 - Brock Adams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接