在托管 HTML 文档对象模型中访问未公开成员
托管 HTML 文档对象模型 (DOM) 包含一个名为 HtmlElement 的类,该类公开了所有 HTML 元素共有的属性、方法和事件。 但有时需要访问托管接口没有直接公开的成员。 本主题介绍访问未公开成员的两种方法,包括在网页内定义的 JScript 和 VBScript 函数。
通过托管接口访问未公开成员
HtmlDocument 和 HtmlElement 提供了四种支持访问未公开成员的方法。 下表显示了这些类型及其对应的方法。
使用这些方法时会假定你拥有正确基础类型的元素。 假设你想要侦听 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 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");
}
}
}
}
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
访问非托管接口
还可以使用每个 DOM 类公开的非托管组件对象模型 (COM) 接口访问托管 HTML DOM 上的未公开成员。 如果必须对未公开成员执行多次调用,或者如果未公开成员返回未由托管 HTML DOM 包装的其他非托管接口,则建议这样做。
下表显示了通过托管 HTML DOM 公开的所有非托管接口。 单击每个链接以了解其用法和示例代码。
类型 | 非托管接口 |
---|---|
HtmlDocument | DomDocument |
HtmlElement | DomElement |
HtmlWindow | DomWindow |
HtmlHistory | DomHistory |
使用 COM 接口的最简单方法是从应用程序中添加对非托管 HTML DOM 库 (MSHTML.dll) 的引用,尽管并不支持这样做。
访问脚本函数
HTML 页面可以使用诸如 JScript 或 VBScript 之类的脚本语言来定义一个或多个函数。 这些函数放置在页面中的 SCRIPT
页内,可以按需运行或响应 DOM 上的事件。
可以使用 InvokeScript 方法调用在 HTML 页面中定义的任何脚本函数。 如果脚本方法返回 HTML 元素,则可以使用强制转换将此返回结果转换为 HtmlElement。 有关详细信息和示例代码,请参阅 InvokeScript。