如何判断webbrowser里的网页下载完成,正确的版本和方法

概要

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 控件已完成下载网页。 以下是有关此事件的一些要点:
  • 在带有没有框架页的情况下 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
    					
要处理 DocumentComplete 事件在 Visual C++ 中的,并确定网页的下载是否完成,请执行这些步骤。

请注意您执行的步骤取决于使用 WebBrowser 控件的方式。
  • 如果要创建 WebBrowser 控件 CWnd / CView 对象中,您必须执行步骤 1 至 4。
  • 如果您 CDialog / CFormView 对象中创建 WebBrowser 控件,只需要执行步骤 4。
  • 如果您使用随 Visual C++6.0 提供 CHtmlView 类,覆盖 CHtmlView::DocumentComplete(),并按照步骤 4,使用 CHtmlView 类的该 m_pBrowserApp 成员访问 WebBrowser 控件。
  1. 在头文件为 CWnd / CView 派生类中定义 OnDocumentComplete 方法:
    afx_msg void OnDocumentComplete(LPDISPATCH lpDisp,
                                    VARIANT FAR* URL);
    					
  2. 声明事件接收器在相同的头文件中:
    DECLARE_EVENTSINK_MAP()
    					
  3. 在实现文件 (.cpp) 为 CWnd / CView 派生类,实现事件接收器映射:
    BEGIN_EVENTSINK_MAP(CYourView, CView)
       ON_EVENT(CWBTstView, ID_WEB_BROWSE, 259 /* DocumentComplete */,
                OnDocumentComplete, VTS_DISPATCH VTS_PVARIANT)
    END_EVENTSINK_MAP()
    					
  4. 实现 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 的图文框与不顶层框架。 是例如请考虑如下情形。

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和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。
Retired KB Article 不再更新的 KB 内容免责声明
本文介绍那些 Microsoft 不再提供支持的产品。因此本文按“原样”提供,并且不再更新。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值