这似乎是一个奇怪的问题,但是有没有办法覆盖 window.location 而不让浏览器控件导航到它?我遇到的问题是我在控件中注入 html 代码,并且 window.location 是 about:blank - 导致某些 javascript 代码出错。试图让他们认为他们在一个 URL 中,而不是 about:blank
3 回答
我在(IE9+)时使用Object.defineProperty()取得了成功。document.documentMode >= 9
为了在 IE9+ 模式下获取 WebBrowser 控件,我首先加载以下 URL:
about:<!doctype html><meta http-equiv="X-UA-Compatible" content="IE=edge">
这会在最新文档模式下提供大部分为空的文档。
然后重新定义window.location
,我通过 eval() 或 document.write() 执行一些脚本:
Object.defineProperty(window, 'location', {value: {href: 'fubar'}});
完整的顺序是这样的:
- 加载控件。
- 等待
WebBrowser.ReadyState == 4
或DocumentComplete
事件。 - 打电话
document.open()
(重要)。 - eval 或编写脚本重新定义location。
- 编写 HTML 内容。
- 调用
document.close()
(确保调用 onload)。
注意:我使用 ActiveX WebBrowser控件,而不是 .NET 组件,它是该控件的包装器。它可能在 .NET 中同样有效。
HTML5 草稿包括window.history.pushState
+ window.onpopstate
,但这不受 Trident (MSHTML) 支持,并且不允许跨域导航,更不用说 URL 方案。
一些 JavaScript 实现还支持用户定义的 getter 和 setter,所以你也许可以这样做window.__defineGetter__('location', function() { return fakeLocation })
,但我再次相信这不适用于 IE 的控件。
回应评论者:你在做什么?
无法更换window.location
财产。window.location
是一个不可配置的属性,这意味着它不能被修改。
window.location
我可以使用的唯一混乱的解决方法是在执行之前对脚本文本进行查找和替换(将行替换为空字符串或其他内容)。