在呈现之前从 Web 浏览器控件中删除标记

本文关键字:控件 删除 浏览器 Web | 更新日期: 2023-09-27 18:36:06

问题:

我正在运行一个带有嵌入式 WebBrowser 控件的 winforms 应用程序。我已使用魔术注册表设置将此控件切换到IE 8模式(此处回答了IE9 Web浏览器控件是否支持IE9的所有功能,包括SVG?

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

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

我的解决方案尝试

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

我尝试手动加载HTML内容(使用WebClient),删除元标记并将其输入Web浏览器控件(使用Document.Write或DocumentText),但这样控件拒绝加载任何其他内容(如图像)。

帮助

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

有人有什么想法吗?

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

谢谢!

在呈现之前从 Web 浏览器控件中删除标记

我也遇到了DocumentText的问题——我放弃了。

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

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

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

不知道有什么方法可以使 WebBrowser 控件忽略该标记并且不重写注册表设置。对于快速(脏)解决方法,您可以执行以下操作。

为要在 Web 浏览器控件中显示的网站创建请求。

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 控件。测试了它,似乎可以正常加载文档的其余部分。