【问题标题】:C#: Best way to inject CSS into MSHTML instance?C#:将 CSS 注入 MSHTML 实例的最佳方法?
【发布时间】:2010-10-17 01:11:51
【问题描述】:

我正在尝试将一些伴随一些其他 HTML 的 CSS 注入到 C# 托管的 WebBrowser 控件中。我正在尝试通过底层的 MSHTML(DomDocument 属性)控件来执行此操作,因为此代码用作完整 IE8 BHO 的各种原型。

问题是,虽然我可以注入 HTML(通过 mydomdocument.body.insertAdjacentHTML)和 Javascript(通过 mydomdocument.parentWindow.execScript),但它完全拒绝了我的 CSS 代码。

如果我将包含我想要插入的 HTML 的字符串与注入后的目标页面源进行比较,MSHTML 的源将真正包含 <style> 元素及其基础源的所有内容除了

CSS 通过了针对 CSS 2.1 的 W3C 验证。它没有做任何太棘手的事情,除了一些背景图像属性将图像直接嵌入到 CSS 中(例如 background-image: url("data:image/png;base64 ...),并且注释掉这些行不会改变结果。

更奇怪的是(我不确定这是否相关),上周我对此没有任何问题。这周我又回到了它,在切换了一些在实际注入之前处理要注入的 HTML 的代码之后,它不再起作用了。自然地,我认为我的其中一个更改可能是问题所在,但是在注释掉所有这些逻辑并将其输入一个直字符串之后,HTML 仍然显示为未格式化。

目前我正在注入 <body> 标记,尽管我尝试注入 <head> 并且遇到了类似的结果。

提前感谢您的帮助!

汤姆

【问题讨论】:

    标签: c# internet-explorer-8 browser code-injection mshtml


    【解决方案1】:

    最终自己解决了这个问题:

    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 代码来解决这个问题,因为实现几乎相同。

    【讨论】:

      猜你喜欢
      • 2012-11-12
      • 2021-01-04
      • 1970-01-01
      • 2018-10-20
      • 1970-01-01
      • 1970-01-01
      • 2016-01-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多