存取 Managed HTML 文件物件模型上未公開的成員
Managed HTML 文件物件模型 (DOM) 包含名為 HtmlElement 的類型,此類型公開了所有 HTML 項目共有的屬性、方法和事件。 不過,有時候需要存取 Managed 介面未直接公開的成員。 這個主題檢視了用以存取未公開成員的兩種方式,未公開成員中包括 Web 網頁內定義的 JScript 和 VBScript 函式。
透過 Managed 介面存取未公開的成員
HtmlDocument 和 HtmlElement 提供了四個存取未公開成員的方法。 下表將顯示型別及對應的方法。
成員型別 |
方法 |
---|---|
屬性 (HtmlElement) |
|
方法 |
|
事件 (HtmlDocument) |
|
事件 (HtmlElement) |
|
事件 (HtmlWindow) |
使用這些方法時,已假設您有一個項目為正確的基礎型別。 並且假設您想要接聽 HTML 網頁上 FORM 項目的 Submit 事件,以便在使用者送出 FORM 值給伺服器之前能夠對該值執行部分的前置處理。 理論上,擁有 HTML 的控制項就表示可定義 FORM 使其擁有唯一的 ID 屬性。
<HTML>
<HEAD>
<TITLE>Form Page</TITLE>
</HEAD>
<BODY>
<FORM ID="form1">
... form fields defined here ...
</FORM>
</BODY>
</HTML>
當您將這個頁面載入 WebBrowser 控制項之後,即可使用 GetElementById 方法,在執行階段以 form1 為引數來擷取 FORM。
Private Sub SubmitForm(ByVal FormName As String)
Dim Elems As HtmlElementCollection
Dim Elem As HtmlElement
If (WebBrowser1.Document IsNot Nothing) Then
With WebBrowser1.Document
Elems = .All.GetElementsByName(FormName)
If (Not Elems Is Nothing And Elems.Count > 0) Then
Elem = Elems(0)
If (Elem.TagName.Equals("FORM")) Then
Elem.InvokeMember("Submit")
End If
End If
End With
End If
End Sub
private void SubmitForm(String formName)
{
HtmlElementCollection elems = null;
HtmlElement elem = null;
if (webBrowser1.Document != null)
{
HtmlDocument doc = webBrowser1.Document;
elems = doc.All.GetElementsByName(formName);
if (elems != null && elems.Count > 0)
{
elem = elems[0];
if (elem.TagName.Equals("FORM"))
{
elem.InvokeMember("Submit");
}
}
}
}
存取 Unmanaged 介面
也可以利用每個 DOM 類別所公開的 Unmanaged 元件物件模型 (Component Object Model,COM),來存取 Managed HTML DOM 上的未公開成員。 如果必須對未公開的成員進行數次呼叫,或者如果未公開的成員所傳回的是未由 Managed HTML DOM 包裝的其他 Unmanaged 介面,則建議使用這個方式。
下表顯示所有透過 Managed HTML DOM 公開的 Unmanaged 介面。 按一下每個連結即可取得用法說明及範例程式碼。
型別 |
Unmanaged 介面 |
---|---|
使用 COM 介面的最簡單方法就是,加入應用程式的 Unmanaged HTML DOM 程式庫 (MSHTML.dll) 參考。 .NET Framework 2.0 中包含主要 Interop 組件,此組件將 Unmanaged 呼叫公開為 Managed 方法,而在舊版的 .NET Framework 中,您必須自行產生這個 Managed 包裝函式。 如需加入專案參考的詳細資訊,請參閱主要 Interop 組件和匯入型別程式庫做為組件。
存取指令碼函式
HTML 網頁利用指令碼語言 (例如 JScript 或 VBScript),即可定義一或多個函式。 這些函式是放置於網頁的 SCRIPT 頁面內,可視需要或為了回應 DOM 上的事件而執行。
可使用 InvokeScript 方法來呼叫 HTML 網頁中定義的任何指令碼函式。 如果此指令碼方法傳回 HTML 項目,可利用轉換 (Cast) 將傳回的結果轉換為 HtmlElement。 如需詳細資訊和範例程式碼,請參閱 InvokeScript。