IHTMLStyleSheetRulesCollection для тегов стиля (встроенные стили)

Я использую IHTMLDocument2 интерфейс для извлечения IHTMLStyleSheetRulesCollection с использованием IHTMLDocument2::styleSheets имущество. Он отлично работает для получения стилей внутри <style> тег (в документе <head>).

Я использую выше, чтобы найти все стили, которые имеют backgroundImage установить (мне нужно прочитать значение).

Тем не менее, эта коллекция не включает встроенные стили внутри <body> лайк:

<p style="background:url(image.jpg);"></p> извлечь "image.jpg" из этого <p> тег.

Каков подход к сканированию всего дерева DOM, чтобы найти элементы, у которых есть свойство style, прикрепленное к фоновому изображению? Примеры кода на C++ или Delphi приветствуются.

1 ответ

Решение

Вы должны будете повторить 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;
Другие вопросы по тегам