Вопрос, заданный пользователем, касается получения списка стилевых атрибутов элемента HTML с использованием интерфейсов COM, которые предоставляются браузером для работы с DOM. В частности, речь идет о том, как получить доступ ко всем атрибутам стиля IHTMLStyle элемента IHTMLElement, не прибегая к ручному разбору строки cssText.
Описание проблемы
Пользователь использует следующий код для вставки HTML-содержимого в документ браузера и получения информации о стиле элемента:
const
HTML_DOC =
'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">' +
'<BODY><P id="p1" style="width: 440px; height: 344px; margin: 3px 2px; float: left;">test</P></BODY>' +
'</HTML>';
procedure TForm1.Button1Click(Sender: TObject);
var
HTMLTxtRange: IHTMLTxtRange;
HTMLDocument: IHTMLDocument2;
HTMLElement: IHTMLElement;
HTMLStyle: IHTMLStyle;
begin
WebBrowser1.Navigate('about:blank');
while WebBrowser1.ReadyState < READYSTATE_COMPLETE do
Application.ProcessMessages;
HTMLDocument := WebBrowser1.Document as IHTMLDocument2;
HTMLTxtRange := (HTMLDocument.body as IHTMLBodyElement).createTextRange;
HTMLTxtRange.PasteHTML(HTML_DOC);
HTMLElement := (HTMLDocument as IHTMLDocument3).getElementById('p1');
if Assigned(HTMLElement) then
begin
HTMLStyle := HTMLElement.style {as IHTMLStyle2};
Memo1.Lines.Add(HTMLStyle.cssText); // MARGIN: 3px 2px; WIDTH: 440px; FLOAT: left; HEIGHT: 344px
Memo1.Lines.Add(HTMLStyle.getAttribute('margin', 0)); // 3px 2px
end;
end;
Пользователь хочет получить список всех атрибутов стиля элемента, например:
MARGIN
WIDTH
FLOAT
HEIGHT
Подходы к решению
Существующие интерфейсы IHTMLStyle и его потомки не предоставляют функциональности для получения списка атрибутов стиля напрямую. Однако, поскольку IHTMLStyle реализует интерфейс IDispatch, можно попробовать использовать IDispatch.GetTypeInfo() для получения интерфейса ITypeInfo, который описывает объект стиля, и затем проитерировать доступные свойства, используя IDispatch.Invoke() для чтения значений каждого свойства. Тем не менее, если GetTypeInfo() не возвращает подходящий ITypeInfo, то альтернативы ручному разбору cssText нет.
Альтернативный подход
Также рассматривается возможность использования IHTMLWindow7 и IHTMLCSSStyleDeclaration для получения сведений о стиле элемента, включая возможность перебора атрибутов:
var
Win7: IHTMLWindow7;
css: IHTMLCSSStyleDeclaration;
begin
Win7 := (WebBrowser1.Document as IHTMLDocument2).ParentWindow as IHTMLWindow7;
css := Win7.GetComputedStyle(HTMLElement as IHTMLDOMNode);
for var i := 0 to css.Length - 1 do
css.Item(i).Name; // Получение имени атрибута
end;
Заключение
В зависимости от версии Internet Explorer и реализации интерфейсов COM, предложенные подходы могут быть успешными или нет. В современных браузерах и с учетом политик безопасности, возможно, потребуется использование JavaScript для работы с DOM и CSS, особенно если приложение выполняется в контексте ограниченной безопасности.
Пример кода для разбора свойств стиля
var
typeInfo: ITypeInfo;
disp: IDispatch;
style: IHTMLStyle;
begin
disp := HTMLStyle as IDispatch;
if disp.GetTypeInfo(0, 0, typeInfo) then
begin
var propCount: Longint;
if typeInfo.GetProps(0, -1, propCount) then
begin
SetLength(props, propCount);
if typeInfo.GetProps(0, propCount, props[0], @propCount) then
begin
for var i := 0 to propCount - 1 do
begin
var prop: TAGPROPERTYINFO;
prop := props[i];
var varName: OleStr;
OleVariantGetTypeInfoName(prop.lpstrName, varName);
// Здесь можно извлечь информацию о свойстве стиля
end;
end;
end;
end;
end;
Этот код демонстрирует, как можно использовать ITypeInfo для получения списка свойств стиля. Однако, стоит отметить, что детальная реализация может потребовать учета особенностей конкретной версии браузера и возможных ограничений безопасности.
При работе с браузерами и интерфейсами COM в Delphi важно помнить о совместимости и возможных ограничениях, особенно в свете обновлений и изменений в политике безопасности.
Пользователь интересуется, как получить список стилевых атрибутов элемента в браузере, используя интерфейсы COM для работы с DOM.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.