【问题标题】:Overriding window.location on Webbrowser Control覆盖 webbrowser 控件上的 window.location
【发布时间】:2010-11-09 21:01:46
【问题描述】:

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

【问题讨论】:

  • 你想要完成什么?

标签: javascript webbrowser-control iwebbrowser2


【解决方案1】:

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 中也能正常工作。

【讨论】:

    【解决方案2】:

    HTML5 草稿包括window.history.pushState+window.onpopstate,但这不受 Trident (MSHTML) 支持,并且不允许跨域导航,更不用说 URL 方案。

    一些 JavaScript 实现还支持用户定义的 getter 和 setter,因此您可以使用 window.__defineGetter__('location', function() { return fakeLocation }),但我再次相信这不适用于 IE 的控件。

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

    【讨论】:

    • 在公共论坛上有点难以解释,但几乎可以破解控件来显示我想要显示和监控的某些代码。问题是他们有 JavaScript 来检查 window.location - 这会中断。当然,答案可能是不要在浏览器中注入,导航到一个 URL - 但我试图避免这种情况。
    • 行不通。 Unhandled Error: __defineGetter__: invalid modification of non-configurable property
    【解决方案3】:

    无法替换 window.location 属性。 window.location 是不可配置的属性,也就是说不能修改。

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

    【讨论】:

      猜你喜欢
      • 2023-03-03
      • 2013-04-18
      • 2010-09-29
      • 2010-12-04
      • 2014-10-15
      • 2012-02-04
      • 1970-01-01
      • 2023-03-10
      • 2011-10-13
      相关资源
      最近更新 更多