【问题标题】:How to get all IHTMLStyle attributes of an IHTMLElement?如何获取 IHTMLElement 的所有 IHTMLStyle 属性?
【发布时间】:2013-01-07 16:46:06
【问题描述】:

我使用下面的代码:

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;

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

MARGIN
WIDTH
FLOAT
HEIGHT

【问题讨论】:

  • 我没有看到任何符合您要求的属性。不过,用 TStringList 解析它是一件轻而易举的事 :)
  • @whosrdaddy,我已经使用TStringList 解析它,将: 更改为= 以维护一个键/值,但我不喜欢这个解决方案。我一直在想我错过了什么,并且有这样的收藏:/

标签: css delphi dom mshtml twebbrowser


【解决方案1】:

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

【讨论】:

  • 我看不出在这种情况下迭代属性有什么帮助......假设我找到了marginLeft 属性。我应该假设我有一个margin-top 样式属性吗?或者我没明白你的意思。
  • 当你找到一个属性时,读取它的值并在使用前检查它是否为空。
【解决方案2】:
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

【讨论】:

    猜你喜欢
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 2013-10-20
    • 2012-01-28
    • 1970-01-01
    • 2023-01-20
    相关资源
    最近更新 更多