在呈现之前从 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 兼容标签如何......
谢谢!
我也遇到了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 控件。测试了它,似乎可以正常加载文档的其余部分。