關於Win8對getElementsByTagName等dom方法兼容性的替代方法

在對Twebbrowser進行dom編程時,引用MSHTML並使用其中的HTMLDocument; IHTMLElementCollection;IHTMLElement;能得到較好的代碼提示web

其中封裝的一些方法如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中是會報錯的。dom

我推測出錯的緣由多是MSHTML對Win8支持很差,可能有些方法須要從新封裝。對象

目前解決的辦法只好放棄MSHTML改用Variant來代替HTMLDocument; IHTMLElementCollection;IHTMLElement;blog

Doc.getElementsByTagName(TagName)換成wbIE.OleObject.document.getElementsByTagName(TagName)來用,能解決win8不兼容的問題。get

相關文章
相關標籤/搜索