Change window.location prototype to disable certain redirects?

别说谁变了你拦得住时间么 提交于 2019-12-23 08:51:37

问题


I'm trying to selectively disable window.location, using Greasemonkey, at the start of the document.

I don't want to fully disable javascript, just disable some redirects done with javascript. They look like this:

window.location = "unwanted url";

回答1:


You can't change the window.location prototype, because this a "native property" of window and it is not configurable.

On Firefox (Greasemonkey), if you try to override this then you will get errors like:

TypeError: can't redefine non-configurable property 'location'

and

Error: Permission denied to shadow native property

...depending on how you attempt it. Other browsers give similar errors.


To block this kind of relocation, you need to interfere with the page's javascript on a case-by-case basis.

See "Stop execution of Javascript function (client side) or tweak it" for a general approach that works in Firefox. Although it may be much easier, depending on your target page's exact code.




回答2:


I don't think it's possible.

  • You can't overwrite properties or methods on window.location (fails silently)
  • you can't redefine its prototype with location.__proto__ = Something.prototype
  • location.constructor.prototype is basically Object.prototype
  • the constructor doesn't really do anything (like create the attributes or methods)
  • __definesetter__ fails silently
  • Object.defineProperty gives an error like, TypeError: Cannot redefine property: href
  • delete window.location and delete window.location.href don't do anything

I'm out of ideas...




回答3:


quite too late but you can do it simply without removing the whole script with Object.prototype.watch:

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


来源:https://stackoverflow.com/questions/18283453/change-window-location-prototype-to-disable-certain-redirects

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!