样式标记的IHTMLStyleSheetRulesCollection(内联样式)

时间:2013-10-24 00:39:15

标签: delphi dom webbrowser-control twebbrowser ihtmldocument2

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

我使用上面的代码来查找设置了backgroundImage的所有样式(我需要读取该值)。

但是,此集合不包括<body>内的内联样式,如:

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

扫描整个DOM树以查找具有附加背景图像的“样式”属性的元素的方法是什么?欢迎使用C ++或Delphi中的代码示例。

1 个答案:

答案 0 :(得分: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;