托管 HTML 文档对象模型 (DOM) 包含一个名为 HtmlElement 的类,该类公开所有 HTML 元素所共同拥有的属性、方法和事件。 不过在某些情况下,您需要访问托管接口不直接公开的成员。 本主题将分析两种访问未公开成员的方法,包括在网页内部定义的 JScript 和 VBScript 函数。
通过托管接口访问未公开的成员
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 控件后,可以将 form1 作为参数使用 GetElementById 方法在运行时检索 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");
}
}
}
}
访问非托管接口
您还可以使用由每个 DOM 类公开的非托管组件对象模型 (COM) 接口来访问托管 HTML DOM 上的未公开成员。 如果必须多次调用未公开成员,或者未公开成员返回不是由托管 HTML DOM 包装的其他非托管接口,建议使用此方式。
下表显示了通过托管 HTML DOM 公开的所有非托管接口。 单击每个链接可以获取其用法及代码示例的解释。
类型 |
非托管接口 |
---|---|
使用 COM 接口的最简便方法是从应用程序中添加对非托管 HTML DOM 库 (MSHTML.dll) 的引用。 .NET Framework 2.0 包含一个主互操作程序集,该程序集将非托管调用作为托管方法公开;在以前版本的 .NET Framework 中,您必须自己生成此托管包装。 有关添加项目引用的更多信息,请参见主互操作程序集和将类型库当作程序集导入。
访问 Script 函数
通过使用脚本语言(如 JScript 或 VBScript),HTML 页可以定义一个或多个函数。 这些函数均放置在此页中的 SCRIPT 页内,并且可以按需运行或响应 DOM 中的事件。
您可以使用 InvokeScript 方法调用在 HTML 页中定义的任何脚本函数。 如果此脚本方法返回一个 HTML 元素,则可以使用强制转换将此结果转换为 HtmlElement。 有关详细信息及代码示例,请参见 InvokeScript。