文章目錄
- 整合MSHTML時獲得文檔介面
- 整合瀏覽器控制項時獲得文檔介面
- 從ActiveX控制項獲得文檔介面
學習Internet Explorer編程之前先瞭解一下MSHTML,IE對HTML語言中的標記(tag)實現了一一對應的物件模型(objectmodel),由MSHTML.DLL封裝。MSHTML是基於COM組件的物件模型,其介面是基於Idispatch。關於MSHTML的介紹請看MSDN文檔,中文版可以參考下面的文章。
關於MSHTML
訪問動態HTML(DHTML)物件模型的所有介面以IDispatch為基類,而且也是被用於指令碼的物件模型的基礎。因此對要操縱物件模型的任何人來說很重要的是熟悉定義在動態HTML介紹的概要和MSHTML包含的物件模型參考中的結構和功能。
MSHTML參考的介面和指令碼對象這一節說明了對象如何在DHTML物件模型裡面映射到介面。舉例來說,使用這一個映射,你可以看到IHTMLDocument2介面映射到文檔對象。對介面的進一步的研究說明了如何通過get_和put_方法訪問對象的屬性。對象的方法映射到可用的介面的方法,而且事件可以用標準的對OLE自動化連接點來捕獲。
如何使物件模型介面的範例的示範在Colbtn、Driller和WalkAll樣本中,這些樣本在Colbtn樣本原始碼頁面、Driller樣本原始碼頁面和WalkAll樣本原始碼頁面上。
- 使用介面的建議
- 獲得文檔介面
- 使用文檔介面
- 相關的主題
使用介面的建議
通常,在文檔中可以用指令碼完成的任何事都可以通過使用介面操縱物件模型來完成。因此推薦了在寫使用物件模型介面的代碼之前, 開發人員應該在一個 HTML文檔裡面使用指令碼設計功能原型。
下列HTML例子說明如何用指令碼導航文檔的all集合而且獲得文檔的每個元素的標籤名字。等價的使用物件模型介面Microsoft (R) Visual C++(R)代碼示範在Driller樣本原始碼頁面和WalkAll樣本原始碼頁面上。
例子
<HTML>
<HEAD>
<TITLE>Page Title</TITLE>
</HEAD>
<SCRIPT LANGUAGE="JavaScript">
function Loaded()
{
var c = document.all.length;
var i;
for(i = 0; i < c; i++)
{
spanTAGS.innerHTML = spanTAGS.innerHTML + document.all.item(i).tagName + "<BR>";
}
}
</SCRIPT>
<BODY onload="Loaded()">
<SPAN id="spanTAGS"></SPAN>
</BODY>
</HTML>
獲得文檔介面
要開始使用物件模型介面,就要從文檔獲得IHTMLDocument2介面。一旦你有了這個介面,你就能存取文檔中所有的元素。文檔介面如何被獲得依賴於你的應用程式如何?。 每一個下列場合需要以不同的方式獲得文檔介面。
- 整合MSHTML時
- 整合瀏覽器控制項的一個執行個體時。
- 從一個網頁中包含的一個Microsoft ActiveX(R)控制項。
整合MSHTML時獲得文檔介面
當整合一個MSHTML對象的時候,使用 CoCreateInstance建立對象。 一旦建立了對象,你可以調用它的QueryInterface 方法,請求IID_IHTMLDocument2。WalkAll樣本原始碼頁面的WalkAll範例說明了該如何做。
整合瀏覽器控制項時獲得文檔介面
當整合瀏覽器控制項的時候,執行下列步驟獲得文檔介面:
- 調用 IWebBrowser2::get_Document 獲得文檔的 IDispatch 介面。(譯者註:MFC的CHtmlView的GetHtmlDocument方法,瀏覽器控制項的Document屬性或者DHtmlEdit控制項的DOM屬性也可以用於擷取文檔介面)
- 調用在前面步驟中獲得的IDispatch指標的的QueryInterface,請求IID_IHTMLDocument2。
從ActiveX控制項獲得文檔介面
ActiveX文檔的存取動態HTML節解釋了如何從ActiveX (R)控制項獲得文檔介面。
使用文檔介面
使用文檔介面
一旦你獲得了文檔介面,你就可以使用任何一個IHTMLDocument2介面獲得或修改文檔的屬性。這通常包括從文檔包含的不同的元素中得到一些IHTMLElementCollection介面。
一個非常普遍的集合對象是all集合對象。all集合對象是通過使用IHTMLDocument2::all (譯者註:原文如此,似乎應該改成get_all)方法獲得的。 這個方法返回一個包含文檔的所有元素的IHTMLElementCollection介面。然後你可以使用IHTMLElementCollection::item方法枚舉元素。 IHTMLElementCollection::item方法為你提供一個你能調用 QueryInterface ,請求IID_IHTMLElement的IDispatch指標。這將會給你一個你能用來為個別的元素獲得或設定資訊的IHTMLElement介面指標。
大多數的元素提供一個介面操縱那個特定的元素。這些元素相關的介面名字具有IHTMLXXXXElement的格式,這裡XXXX是元素的名字。要獲得元素相關的介面,可以在IHTMLElement介面上調用QueryInterface,請求被需要的元素相關的介面。舉例來說img 元素提供一個 IHTMLImgElement介面以可能用來明確地操縱img元素。要查看可用的元素相關的介面列表,查看介面和指令碼對象的介面列表。