2013-10-24 141 views
3

我使用IHTMLDocument2接口来检索IHTMLStyleSheetRulesCollection使用IHTMLDocument2::styleSheets属性。它适用于检索<style>标记中的样式(在文档<head>中)。IHTMLStyleSheetRulesCollection样式标记(内联样式)

我用上面的方法找到所有设置为backgroundImage的样式(我需要读取这个值)。

然而,这个集合不包括内部<body>内嵌样式,如:

<p style="background:url(image.jpg);"></p>从这个<p>标签中提取“image.jpg的”。

什么是扫描整个DOM树发现有附有背景图片“风格”属性元素的方法吗?欢迎使用C++或Delphi代码示例。

回答

4

您将不得不迭代all而不是styleSheets并查看元素的样式。

uses mshtml; 

Procedure WebBrowserCreateStringListImagesFromElementStyles(const AWebBrowser: TWebBrowser; ResultList: TStrings; NoUrl: Boolean = false); 
var 
    nCount: Integer; 
    element: IHTMLElement; 
    elements: IHTMLElementCollection; 
    bgImage: String; 
begin 
    Assert(Assigned(AWebBrowser.Document) and Assigned(ResultList)); 
    if Assigned(AWebBrowser.Document) then 
    begin 
    elements := (AWebBrowser.Document as IHTMLDocument2).all; 
    for nCount := 0 To Pred(elements.Length) do 
    begin 
     element := elements.item(nCount, '') as IHTMLElement; 
     if (element.style.backgroundImage <> '') and (UpperCase(element.style.backgroundImage) <> 'NONE') then 
     begin 
     bgImage := element.style.backgroundImage; 
     if NoUrl then 
     begin 
      if Pos('URL(', UpperCase(bgImage)) = 1 then 
      begin 
      Delete(bgImage, 1, Length('URL(')); 
      if Pos(')', bgImage) = Length(bgImage) then 
       Delete(bgImage, Length(bgImage), 1); 
      end; 
     end; 
     ResultList.Add(AnsiLowerCase(bgImage)); 
     end; 
    end; 
    end; 
end; 
+0

+1你快:) – kobik

+0

@kobik抱歉:-( – bummi

+2

只是一个音符,因为OP是寻找'body'元素,他可能会考虑迭代'Document.body.all'。 – kobik