Javascript 重写Webbrowser控件上的window.location
这似乎是一个奇怪的问题,但是有没有一种方法可以覆盖window.location而不让浏览器控件导航到它?我遇到的问题是,我正在控件中注入html代码,而window.location是关于:blank-导致某些javascript代码出错。试图让他们认为自己在一个URL中,而不是在about:blankHTML5草稿包含+,但Trident(MSHTML)不支持这一点,也不允许跨域导航,更不用说URL方案了 一些JavaScript实现还支持用户定义的getter和setter,因此您可以使用Javascript 重写Webbrowser控件上的window.location,javascript,webbrowser-control,iwebbrowser2,Javascript,Webbrowser Control,Iwebbrowser2,这似乎是一个奇怪的问题,但是有没有一种方法可以覆盖window.location而不让浏览器控件导航到它?我遇到的问题是,我正在控件中注入html代码,而window.location是关于:blank-导致某些javascript代码出错。试图让他们认为自己在一个URL中,而不是在about:blankHTML5草稿包含+,但Trident(MSHTML)不支持这一点,也不允许跨域导航,更不用说URL方案了 一些JavaScript实现还支持用户定义的getter和setter,因此您可以使用
窗口
回应评论者:你在做什么?无法替换窗口.location
属性<代码>窗口。位置
是不可配置的属性,这意味着它无法修改
我可以使用的唯一麻烦的解决方法是在执行脚本文本之前对脚本文本进行查找和替换(用空字符串或其他东西替换
窗口.location
行)。当document.documentMode>=9
(IE9+)时,我成功地使用了Object.defineProperty()
要在IE9+模式下获取WebBrowser控件,我首先加载以下URL:
about:<!doctype html><meta http-equiv="X-UA-Compatible" content="IE=edge">
完整的顺序如下所示:
- 加载控件
- 等待
或WebBrowser.ReadyState==4
事件DocumentComplete
- 调用
(重要)document.open()
- 评估或编写重新定义位置的脚本
- 编写HTML内容
- 调用
(确保调用onload)document.close()
注意:我使用ActiveX控件,而不是.NET组件,它是该控件的包装器。在.NET中可能也会这样。你想实现什么?在公共论坛上有点难以解释,但黑客控制几乎可以显示我想要显示和监视的某些代码。问题是他们有JavaScript来检查window.location,这会中断。当然,答案可能是不要在浏览器中插入,导航到一个URL-但我试图避免这种情况。不会起作用<代码>未经处理的错误:_udefinegetter_;:对不可配置属性的修改无效
Object.defineProperty(window, 'location', {value: {href: 'fubar'}});