【问题标题】:Delete tag from WebBrowser Control before rendering渲染前从 WebBrowser 控件中删除标记
【发布时间】:2012-06-05 23:35:40
【问题描述】:

问题:

我正在运行一个带有嵌入式 WebBrowser 控件的 winforms 应用程序。我使用魔法注册表设置将此控件切换到 IE 8 模式(如在此处回答 Will the IE9 WebBrowser Control Support all of IE9's features, including SVG?)。

但是现在,如果我导航到包含 Meta 标签 X-UA-Compatible IE=9(截至http://msdn.microsoft.com/en-us/library/cc288325(v=vs.85).aspx)的网站,我的网络浏览器控件将切换到 IE9 模式并忽略注册表设置。

我希望我的控件保持在 IE8 模式...

我的解决方案尝试

我尝试使用 IHTMLDOMNode.removeChild 在控件加载 (Document_complete) 后删除元标记,但该控件不会重新呈现页面。

我尝试手动加载 HTML 内容(使用 WebClient),删除元标记并将其提供给 webbrowser 控件(使用 Document.Write 或 DocumentText),但这样控件拒绝加载任何其他内容(喜欢图片)。

帮助

现在,我没有编写自己的 HTTPProxy 并在途中修改响应的想法(我不想这样做)。

有人有什么想法吗?

我使用的是 .Net 4,我无法更改将要显示的网站,并且无论 X-UA-Compatible 标签如何,我都需要它以 IE8 模式呈现...

谢谢!

【问题讨论】:

  • 只是出于好奇,您为什么希望它在 IE8 中呈现?
  • 您可以在我的个人资料中找到提示 :-)
  • 好吧,我知道了,我们用的是IE tester,也许你能从那里得到一些提示,不知道是不是开源的。
  • X-UA-Compatible 会覆盖兼容性视图设置,这意味着您只能通过删除 FEATURE_BROWSER_EMULATION 来忽略 X-UA-Compatible 并返回 IE7 模式。当然,如果您运行一个删除 X-UA-Compatible 标头的 http 代理,那就是另一回事了...
  • 您是否尝试过将元数据设置为不同的东西,而不是删除它?

标签: c# .net webbrowser-control


【解决方案1】:

DocumentText 我也有问题 - 我放弃了。

我的解决方案是编写一个进程内 HTTP 服务器并将 WebBrowser 指向该服务器。

我在这里写了一篇关于它的文章:http://SimplyGenius.net/Article/WebBrowserEx

就我而言,我是从文件系统中获取内容的。
您必须更改它才能调用您的目标网站,但这不应该是太多的工作。
然后您可以随意修改 HTML,链接仍然有效。

【讨论】:

    【解决方案2】:

    不知道如何让 WebBrowser 控件忽略该标记并且不覆盖您的注册表设置。对于快速(肮脏)的解决方法,您可以执行以下操作。

    为要在 WebBrowser 控件中显示的站点创建一个请求。

    var requestUri = new Uri("http://stackoverflow.com/");
    var request = (HttpWebRequest) WebRequest.Create(requestUri);
    

    得到响应。

    var response = request.GetResponse();
    using (var stream = response.GetResponseStream())
    using (var reader = new StreamReader(stream))
    {
        var html = reader.ReadToEnd();
        //...
    }
    

    使用 NuGet 安装 HTMLAgilityPack。

    http://nuget.org/packages/HtmlAgilityPack

    在 HtmlDocument 实例中加载您刚刚检索到的 HTML。

    var document = new HtmlAgilityPack.HtmlDocument();
    document.LoadHtml(html);
    

    选择标签。这里我以 StackOverflow.com 为例,选择它的样式表节点。找到后,只需删除该节点即可。

    var nodes = document.DocumentNode.SelectNodes("//link[@rel=\"stylesheet\"]");
    foreach(var node in nodes)
    {
        node.ParentNode.RemoveChild(node);
    }
    

    剩下的就是检索修改后的 HTML 并将其直接提供给 WebBrowser 控件。

    html = document.DocumentNode.OuterHtml;
    webBrowser.DocumentText = html;
    

    它无法解释不存在的东西。

    您也可以这样做来解决您的问题。发出请求,获取响应,修改 HTML 并将其提供给 WebBrowser 控件。测试了一下,好像可以加载文档的其余部分了。

    【讨论】:

    • 感谢您的回复!我会尝试你的答案,但如果我设置 DocumentText,webbrowser 控件不会加载使用相对路径(样式表等)的资源:-(
    猜你喜欢
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 2012-01-02
    • 2014-10-15
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多