访问托管环境下的 HTML 文档对象模型中未公开的成员

托管 HTML 文档对象模型(DOM)包含一个名为 HtmlElement 的类,该类公开所有 HTML 元素共有的属性、方法和事件。 然而有时,您需要访问不直接由托管接口公开的成员。 本主题探讨访问未公开成员的两种方法,包括网页中定义的 JScript 和 VBScript 函数。

通过托管接口访问未公开的成员

HtmlDocumentHtmlElement 提供四种方法,允许访问未公开的成员。 下表显示了类型及其相应的方法。

成员类型 方法
属性(HtmlElement GetAttribute

SetAttribute
方法 InvokeMember
事件(HtmlDocument AttachEventHandler

DetachEventHandler
事件(HtmlElement AttachEventHandler

DetachEventHandler
事件(HtmlWindow AttachEventHandler

DetachEventHandler

使用这些方法时,默认你具有一个正确基础类型的元素。 假设你想要监听 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

另请参阅