我正在尝试将一些伴随其他 HTML 的 CSS 注入到 C# 管理的 WebBrowser 控件中。我尝试通过底层 MSHTML(DomDocument 属性)控件来实现此目的,因为此代码充当完整 IE8 BHO 的原型。
问题是,虽然我可以注入 HTML(通过 mydomdocument.body.insertAdjacentHTML)和 Javascript(通过 mydomdocument.parentWindow.execScript),但它完全拒绝我的 CSS 代码。
如果我在注入后将包含要插入的 HTML 的字符串与目标页面源进行比较,MSHTML 的源实际上将包含所有内容except为了<style>
元素及其底层源。
CSS 通过了 CSS 2.1 的 W3C 验证。它不会做任何太棘手的事情,除了一些背景图像属性将图像直接嵌入到 CSS 中(例如background-image: url("data:image/png;base64
...),注释掉这些行不会改变结果。
更奇怪的是(我不确定这是否相关),上周我对此没有任何问题。我本周又回到了这个问题,在实际注入之前切换了一些处理待注入 HTML 的代码后,它不再起作用了。当然,我认为我的更改之一可能是问题所在,但在注释掉所有逻辑并为其提供一个直字符串之后,HTML 仍然显示为未格式化。
此刻我正在注入<body>
标签,尽管我尝试注入<head>
也得到了类似的结果。
在此先感谢您的帮助!
tom
最终我自己解决了这个问题:
mshtml.HTMLDocument test = (mshtml.HTMLDocument)webBrowser1.Document.DomDocument;
//inject CSS
if (test.styleSheets.length < 31) { // createStyleSheet throws "Invalid Argument if >31 stylesheets on page
mshtml.IHTMLStyleSheet css = (mshtml.IHTMLStyleSheet)test.createStyleSheet("", 0);
css.cssText = myDataClass.returnInjectionCSS(); // String containing CSS to inject into the page
// CSS should now affect page
} else {
System.Console.WriteLine("Could not inject CSS due to styleSheets.length > 31");
return;
}
我没有意识到 createStyleSheet 创建了一个在文档 DOM 中仍然“活动”的指针...因此您不需要将创建的样式表附加回其父级。我最终通过研究 Javascript 的动态 CSS 代码来解决这个问题,因为它们的实现几乎是相同的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)