This might seem a weird question, but is there a way to override the window.location without making the browser control navigate to it? The problem I am having is that i am injecting html code in the control, and the window.location is about:blank - causing errors on some javascript code. Trying to make them think they are in a URL other than about:blank
相关问题
- Is there a limit to how many levels you can nest i
- How to toggle on Order in ReactJS
- void before promise syntax
- Keeping track of variable instances
- Can php detect if javascript is on or not?
I've had success with Object.defineProperty() when
document.documentMode >= 9
(IE9+).To get the WebBrowser control in IE9+ mode, I first load the following URL:
This gives a mostly empty document in the latest document mode.
Then to redefine
window.location
, I execute some script via eval() or document.write():The complete sequence is like this:
WebBrowser.ReadyState == 4
or theDocumentComplete
event.document.open()
(important).document.close()
(ensures onload gets called).Note: I use the ActiveX WebBrowser control, and not the .NET component which is a wrapper around that control. It will probably work the same in .NET.
HTML5 drafts include
window.history.pushState
+window.onpopstate
, but this is not supported by Trident (MSHTML), and doesn't allow for navigating across domains, nevermind URL schemes.Some JavaScript implementations also support user-defined getters and setters, so you could maybe do
window.__defineGetter__('location', function() { return fakeLocation })
, but yet again I believe that won't work with IE's control.Echoing the commenters: what are you doing?
It is not possible to replace the
window.location
property.window.location
is a non-configurable property, which means that it cannot be modified.The only messy workaround that I can use is to do a find and replace (replace the
window.location
line with an empty string or something) on the script text before executing it.