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;