Internet Explorer WebBrowser 控件触发 DocumentComplete 事件则在完成后下载网页。 您可以在此事件的应用程序中创建事...
<script type="text/javascript"></script>
Internet Explorer WebBrowser 控件触发 DocumentComplete 事件则在完成后下载网页。 您可以在此事件的应用程序中创建事件处理程序函数。 本文介绍确定是否需要执行步骤在 WebBrowser 控件已完成下载网页。
更多信息
WebBrowser 控件触发 DocumentComplete 事件的 ReadyState 属性更改为 READYSTATE_COMPLETE 时。 这表示...
<script type="text/javascript"></script>
WebBrowser 控件触发 DocumentComplete 事件的 ReadyState 属性更改为 READYSTATE_COMPLETE 时。 这表示 WebBrowser 控件已完成下载网页。 以下是有关此事件的一些要点:
请注意您执行的步骤取决于使用 WebBrowser 控件的方式。
WebBrowser 控件承载一个框架集。 框架集的一个框架中, 用户单击一个链接将外框本身中打开一个新的页面,并使该框架集的其余部分保持不变。 新建页可能再次包含多个框架。 因此,会有多个 DocumentComplete 通知 (一个用于每个新的框架)。 但是,因为更改,顶级框架也不会发生最终 DocumentComplete 会的框架的已更改。
如果您感兴趣检查在这种情况下完成最终文档,可以执行以下操作:
- 在带有没有框架页的情况下 DocumentComplete 触发一次所有完成后。
- 在多个的帧的情况下 DocumentComplete 获取触发多次。 并非每个框架将触发此事件,但触发 DownloadBegin 事件的每个框架将触发相应的 DocumentComplete 事件。
- DocumentComplete 事件有一个 IDispatch * 为参数是用于触发 DocumentComplete 框架 (Shdocvw) 的 IDispatch。
- 顶级框架触发最后 DocumentComplete。 以检查是否不进行页面下载,需要检查 IDispatch * 参数是否与 WebBrowser 控件的 IDispatch 相同。
对于 Visual Basic 以下是执行此检查的代码:Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant) If (pDisp Is WebBrowser1.Object) Then Debug.Print "Web document is finished downloading" End If End Sub
请注意您执行的步骤取决于使用 WebBrowser 控件的方式。
- 如果要创建 WebBrowser 控件 CWnd / CView 对象中,您必须执行步骤 1 至 4。
- 如果您 CDialog / CFormView 对象中创建 WebBrowser 控件,只需要执行步骤 4。
- 如果您使用随 Visual C++6.0 提供 CHtmlView 类,覆盖 CHtmlView::DocumentComplete(),并按照步骤 4,使用 CHtmlView 类的该 m_pBrowserApp 成员访问 WebBrowser 控件。
- 在头文件为 CWnd / CView 派生类中定义 OnDocumentComplete 方法:
afx_msg void OnDocumentComplete(LPDISPATCH lpDisp, VARIANT FAR* URL);
- 声明事件接收器在相同的头文件中:
DECLARE_EVENTSINK_MAP()
- 在实现文件 (.cpp) 为 CWnd / CView 派生类,实现事件接收器映射:
BEGIN_EVENTSINK_MAP(CYourView, CView) ON_EVENT(CWBTstView, ID_WEB_BROWSE, 259 /* DocumentComplete */, OnDocumentComplete, VTS_DISPATCH VTS_PVARIANT) END_EVENTSINK_MAP()
- 实现 OnDocumentComplete 方法:
void CWBTstView::OnDocumentComplete(LPDISPATCH lpDisp, VARIANT FAR* URL) { IUnknown* pUnk; LPDISPATCH lpWBDisp; HRESULT hr; pUnk = m_webBrowser.GetControlUnknown(); ASSERT(pUnk); hr = pUnk->QueryInterface(IID_IDispatch, (void**)&lpWBDisp); ASSERT(SUCCEEDED(hr)); if (lpDisp == lpWBDisp ) { // Top-level Window object, so document has been loaded TRACE("Web document is finished downloading/n"); } lpWBDisp->Release(); }
WebBrowser 控件承载一个框架集。 框架集的一个框架中, 用户单击一个链接将外框本身中打开一个新的页面,并使该框架集的其余部分保持不变。 新建页可能再次包含多个框架。 因此,会有多个 DocumentComplete 通知 (一个用于每个新的框架)。 但是,因为更改,顶级框架也不会发生最终 DocumentComplete 会的框架的已更改。
如果您感兴趣检查在这种情况下完成最终文档,可以执行以下操作:
请检查该 DocumentComplete 的 IDispatch 参数是否 IDispatch 参数的第一个 NavigateComplete2 事件相同。 因为第一个 NavigateComplete2 是顶级框架,而最后一个 DocumentComplete 还是顶层框架,执行这样的方式比较将告诉是否完成页下载。
下面是一些示例 C++ 代码:
LPDISPATCH glpDisp = NULL; // global LPDISPATCH, can also
// be of class scope
// NavigateComplete2 event
void CWebbrDlg::OnNavigateComplete2Explorer1(LPDISPATCH pDisp,
VARIANT FAR* URL)
{
// Check if glpDisp is NULL. If NULL, that means it is
// the top level NavigateComplete2. Save the LPDISPATCH
if (!glpDisp)
glpDisp = pDisp;
}
void CWebbrDlg::OnDocumentCompleteExplorer1(LPDISPATCH pDisp,
VARIANT FAR* URL)
{
if (glpDisp && glpDisp == pDisp)
{
// if the LPDISPATCH are same, that means
// it is the final DocumentComplete. Reset glpDisp
TRACE("Document is done downloading");
glpDisp = NULL;
}
}
这篇文章中的信息适用于:
- Microsoft Internet Explorer 4.0 128-Bit Edition
- Microsoft Internet Explorer 4.01 Service Pack 2
- Microsoft Internet Explorer 5.0
- Microsoft Internet Explorer 5.5
关键字: | kbmt kbhowto KB180366 KbMtzh |
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。如果您发现了错误并希望帮助我们提高机器翻译技术,请完成文章末尾的在线调查。
点击这里察看该文章的英文版:
180366
(http://support.microsoft.com/kb/180366/en-us/ )
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。