delphi – 如何获得由几个IHTMLElements组成的IHTMLElementColle
发布时间:2020-12-15 09:28:28 所属栏目:大数据 来源:网络整理
导读:伙计们:我在object-pascal编程中遇到了“如何获得由几个I HTMLElements组成的I HTMLElementCollection obj”的问题,我的代码如下: function TExDomUtils.GetElementsByClassName(vDoc:IHTMLDocument3; strClassName:string):IHTMLElementCollection;var vE
伙计们:我在object-pascal编程中遇到了“如何获得由几个I
HTMLElements组成的I
HTMLElementCollection obj”的问题,我的代码如下:
function TExDomUtils.GetElementsByClassName(vDoc:IHTMLDocument3; strClassName:string):IHTMLElementCollection; var vElementsAll : IHTMLElementCollection; vElementsRet : IHTMLElementCollection; vElement : IHTMLElement; docTmp : IHTMLDocument2; I,J: Integer; begin J := 0; vElementsAll := vDoc.getElementsByTagName('*'); for I:=0 to vElementsAll.length - 1 do begin vElement := vElementsAll.item(I,0) as IHTMLElement; if vElement.getAttribute('class',0) = strClassName then begin // how to get an IHTMLElementCollection obj which composed of several IHTMLElements? J := J + 1; end; end; Result := vElementsRet; end; 解决方法
您可以简单地创建自己的容器类,例如TList< IHTMLElement>或IHTMLElements数组:
type THTMLElements = array of IHTMLElement; function GetElementsByClassName(ADoc: IDispatch; const strClassName: string): THTMLElements; var vDocument: IHTMLDocument2; vElementsAll: IHTMLElementCollection; vElement: IHTMLElement; I,ElementCount: Integer; begin Result := nil; ElementCount := 0; if not Supports(ADoc,IHTMLDocument2,vDocument) then raise Exception.Create('Invalid HTML document'); vElementsAll := vDocument.all; SetLength(Result,vElementsAll.length); // set length to max elements for I := 0 to vElementsAll.length - 1 do if Supports(vElementsAll.item(I,EmptyParam),IHTMLElement,vElement) then if SameText(vElement.className,strClassName) then begin Result[ElementCount] := vElement; Inc(ElementCount); end; SetLength(Result,ElementCount); // adjust Result length end; 用法: procedure TForm1.FormCreate(Sender: TObject); begin WebBrowser1.Navigate('https://stackoverflow.com/questions/14535755/how-to-get-an-ihtmlelementcollection-obj-which-composed-of-several-ihtmlelements'); end; procedure TForm1.Button1Click(Sender: TObject); var Elements: THTMLElements; I: Integer; begin // show Tags information for SO page: Elements := GetElementsByClassName(WebBrowser1.Document,'post-tag'); ShowMessage(IntToStr(Length(Elements))); for I := 0 to Length(Elements) - 1 do Memo1.Lines.Add(Elements[I].innerHTML + ':' + Elements[I].getAttribute('href',0)); end; 将结果作为IHTMLElementCollection返回的主要问题是IHTMLElementCollection是由IHTMLDocument在内部创建的,我找不到任何方法来创建IHTMLElementCollection的新实例并向其添加元素的引用,例如: vElementsRet := CoHTMLElementCollection.Create as IHTMLElementCollection 将导致Class未注册的例外. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |