覆盖Webbrowser控件上的window.location

时间:2010-11-09 21:01:47

标签: javascript webbrowser-control iwebbrowser2

这似乎是一个奇怪的问题,但有没有办法覆盖window.location而不让浏览器控件导航到它?我遇到的问题是我在控件中注入了html代码,而window.location是关于:blank - 导致某些javascript代码出错。试图让他们认为他们所在的网址不是:空白

3 个答案:

答案 0 :(得分:2)

document.documentMode >= 9(IE9 +)时,我在 Object.defineProperty()方面取得了成功。

要在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 == 4DocumentComplete事件。
  • 致电document.open()(重要)。
  • 评估或编写脚本重新定义位置
  • 撰写HTML内容。
  • 调用document.close()(确保调用onload)。

注意:我使用ActiveX WebBrowser控件,而不是.NET组件,它是该控件的包装器。它可能在.NET中也一样。

答案 1 :(得分:0)

HTML5草稿包括window.history.pushState + window.onpopstate,但Trident(MSHTML)不支持此功能,并且不允许跨域导航,从不使用URL方案。

有些JavaScript实现也支持用户定义的getter和setter,所以你可以做window.__defineGetter__('location', function() { return fakeLocation }),但我再次认为这不适用于IE的控件。

回应评论者:你在做什么?

答案 2 :(得分:0)

无法替换window.location属性。 window.location是一个不可配置的属性,这意味着它无法修改。

我可以使用的唯一杂乱的解决方法是在执行脚本文本之前执行查找和替换(用空字符串或其他东西替换window.location行)。