关于Win8对getElementsByTagName等dom方法兼容性的替代方法

在对Twebbrowser进行dom编程时,引用MSHTML并使用其中的HTMLDocument; IHTMLElementCollection;IHTMLElement;能获得较好的代码提示

其中封装的一些方法如getElementsByTagName也能较好的在xp、vista、win7等系统中使用,但是一旦到了win8系统,getElementsByTagName就不能获取IHTMLElementCollection了,如果你下一步想遍历IHTMLElementCollection就会提示‘对象未实现’的错误提示,然后程序崩溃。例如我封装的一个方法:

function FindElementByClassName(Doc: HTMLDocument; TagName, ClassName: String)
  : IHTMLElement;
var
  Elements: IHTMLElementCollection;
  Element: IHTMLElement;
  I: Integer;
begin
  Result := nil;
  Elements := Doc.getElementsByTagName(TagName);
  for I := 0 to Elements.length - 1 do
  begin
    Element := Elements.Item(I, varEmpty) as IHTMLElement;
    if Element._className = ClassName then
    begin
      Result := Element;
      exit;
    end;
  end;
end;

从指定的Doc中根据TagName获取指定的ClassName元素,这个代码在Win8\8.1中是会报错的。

我推测出错的原因可能是MSHTML对Win8支持不好,可能有些方法需要重新封装。

目前解决的办法只好放弃MSHTML改用Variant来代替HTMLDocument; IHTMLElementCollection;IHTMLElement;

Doc.getElementsByTagName(TagName)换成wbIE.OleObject.document.getElementsByTagName(TagName)来用,能解决win8不兼容的问题。

posted on 2014-12-02 11:06  Delphi7456  阅读(1505)  评论(0编辑  收藏  举报

导航