获取WebBrowser中的任一个Class或ID节点

当网页元素无ID但有ClassName时,传统的方法getElementByID无法使用。本文介绍了一个自定义函数GetElement,该函数接受ClassName和IDName作为参数,通过遍历文档元素来查找指定的Class或ID。在找不到ID时,可以使用ClassName作为备选,提高了程序的兼容性。示例代码展示了如何使用此函数,并在找不到元素时返回空,确保了安全性。
摘要由CSDN通过智能技术生成

我们知道,在Webbrowser代码中,如果有<div id="toolbar" style="position: fixed; top: 0px; left: 0px; width: 100%; z-index: 1993;"> </div>时

我们可以使用WebBrowser1.OleObject.Document.getElementByID(‘toolbar’)访问到这个IHTMLElement网页元素

随后就可以有WebBrowser1.OleObject.Document.getElementByID(‘toolbar’).innerHtml

WebBrowser1.OleObject.Document.getElementByID(‘toolbar’).innerText

等多种手段访问元素的各种属性。

但是,如代码是<div Class="toolbar" style="position: fixed; top: 0px; left: 0px; width: 100%; z-index: 1993;"> </div>没有了ID属性,无法用getElementByID访问元素的属性怎么办?有人说getElementByClassName可以访问到这个元素,但IE9以下的浏览器不支持,所以就会给我们的程序增加兼容性问题。

为了更好的解决这个问题,我们就来写个函数解决这个问题。

(以下代码均从使用中的系统里摘取主体代码没改只是略有修改,如有语法错误请见谅)

程序代码如下:

Uses MSHTML

function GetElement(Doc: IHTMLDocument2; ClassName, IDName: string): IHTMLElement;

var

  elem: IHTMLElement;

  coll: IHTMLElementCollection;

  i: integer;

  sTmp, title: string;

begin

  Result:=nil; //初始化返回结果

  coll := Doc.all; //得到所有元素

  for i := 0 to coll.Length - 1 do //循环访问每个元素

  begin 

    elem := (coll.item(i, 0) as IHTMLElement);

    if ClassName<>'' then //提供ClassName表示按ClassName查找

    begin

      sTmp := Trim(string(elem.getAttribute(WideString('ClassName'), 0)));

                //获取ClassName,没有则是空

      if ClassName=sTmp then //是否与提供的ClassName相同

      begin

        Result:=elem; //返回这个元素

        Exit;

      end;

      if IDName<>'' then //提供ID表示按ID查找

      begin

        //WebBrowser1.OleObject.Document.getElementByID(IDName);

             //可以用常规的getElementByID语句访问,本文暂不采用

        sTmp := Trim(string(elem.getAttribute(WideString('ID'), 0)));

            //获取ID属性,与getElementByID效果相同

        if IDName=sTmp then //是否与提供的IDName相同

        begin

          Result:=elem; //返回这个元素

          Exit;

        end;

      end;

    end;

  end;

end;

使用范例:

procedure TFormMain.sSpeedButton36Click(Sender: TObject);

var

    StrStream:TStringStream;

    SetNoteStr: string;

    IHTML:IHTMLElement;

begin

    IHTML:=GetElement((WebBrowser1.Document as IHTMLDocument2), ‘toolbar’, ‘toolbar’); //查找并返回名为toolbar的元素

    if IHTML<>nil then //判断是否找到元素
    begin
      SetNoteStr:=IHTML.outerHTML;
      StrStream:=TStringStream.Create(SetNoteStr);
      try
        StrStream.Position:=0;
        ( WebBrowser2.Document as IPersistStreamInit).Load(TStreamadapter.Create(StrStream));

        //将本元素的代码用StringStream写入另一个浏览器中,相当于只显示某个元素的网页内容
      finally
          StrStream.Free;
      end;
    end;

end;

注意事项

1、如果确定要查找的是ClassName则IDName可为空,同理,确定查找的是IDName时ClassName可为空,如果都不确定,则与上面的程序一样,ClassName和IDName都写。

2、网页查找不到元素时返回空,所以查找结束后要判断下是否为空

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值