访问托管环境下的 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。