4

我使用下面的代码:

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;

我的问题是:如何在不手动解析的情况下使用 DOM 集合获取可用样式属性的列表,HTMLStyle.cssText即预期输出:

MARGIN
WIDTH
FLOAT
HEIGHT
4

2 回答 2

1

IHTMLStyle(或其后代)不公开这种功能。但是,由于IHTMLStyle确实实现了IDispatch接口,您可以尝试使用IDispatch.GetTypeInfo()获取ITypeInfo描述样式对象的接口,然后遍历其可用属性,使用IDispatch.Invoke()读取您发现的每个属性的值。但是,如果GetTypeInfo()没有返回一个可行的ITypeInfo,那么你就不走运了,将不得不解析它IHTMLStyle.cssText

于 2013-01-07T18:18:46.003 回答
0
var win7: ihtmlwindow7;
     css: ihtmlcssstyledeclaration;
begin
  Win7:= (webbrowser1.document as ihtmldocument2).parentwindow as ihtmlwindow7;
  css:= win7.getcomputedstyle(htmlelement as ihtmldomnode);

  for... css.length
   css.item
于 2017-10-04T00:50:53.480 回答