如何确定某页时是否完成 web 浏览器控件中的加载

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 180366
不再更新的 KB 内容免责声明
本文介绍那些 Microsoft 不再提供支持的产品。因此本文按“原样”提供,并且不再更新。
概要
Internet 浏览器的 web 浏览器控件将触发 DocumentComplete 事件完成后下载 Web 页。您可以在此事件的应用程序中创建事件处理程序函数。本文介绍在确定是否需要执行该步骤在 web 浏览器控件已完成下载 Web 页。
更多信息
web 浏览器控件将触发 DocumentComplete 事件时其 ReadyState 属性更改为 READYSTATE_COMPLETE。这表明 web 浏览器控件已完成下载 Web 页。下面是一些关于此活动的要点:
  • 在没有框架的网页的情况下 DocumentComplete 触发一次完成所有内容之后。
  • 在多个的框架的情况下 DocumentComplete 获取激发多次。 不是每个框架时触发此事件,但每个框架,将触发 DownloadBegin 事件触发相应 DocumentComplete 事件。
  • DocumentComplete 事件有一个 IDispatch * 参数,它是的框架 (shdocvw) 为其触发 DocumentComplete 的 IDispatch。
  • 顶层的框架将触发最后 DocumentComplete。可以检查是否进行页下载,您需要检查 IDispatch * 参数是否是相同的 web 浏览器控件 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 IfEnd Sub					
要处理 DocumentComplete 事件在 Visual c + + 中的,并确定是否 Web 页的下载完毕,请按照下列步骤。

请注意您执行该步骤取决于您使用 web 浏览器控件的方法。
  • 如果要在 web 浏览器控件中创建一个 cwnd/cview 对象,则必须按照步骤 1 到 4。
  • 如果要在 web 浏览器控件中创建一个 cdialog/cformview 对象,只需遵循步骤 4。
  • 如果使用的与 Visual c + + 6.0 一起提供的 CHtmlView 类重写 CHtmlView::DocumentComplete(),并按照步骤 4,使用 CHtmlView 类 m_pBrowserApp 成员访问 web 浏览器控件。
  1. cwnd/cview 派生类的头文件中定义 OnDocumentComplete 方法:
    afx_msg void OnDocumentComplete(LPDISPATCH lpDisp,                                VARIANT FAR* URL);					
  2. 声明事件接收器在相同的头文件中:
    DECLARE_EVENTSINK_MAP()					
  3. 在 cwnd/cview 派生类的一个实现文件 (.cpp),实现事件接收映射:
    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();}					
当 web 浏览器控件定位到的更改在顶层的框架页时,此方法有效。假设是否导航发生在一个框架本身,则激发该最终 DocumentComplete 的框架,并不是顶层的框架。例如对于请考虑以下情形。

web 浏览器控件宿主框架集。框架集的一个框架中, 在用户单击一个链接,会在其自身的框架中打开一个新页,并保持框架集的其余部分保持不变。再次在新页可能包含多个帧。因此,将有多个 DocumentComplete 通知 (一个用于每个新的框架)。但一直没有更改顶级框架,因为最终 DocumentComplete 就是框架的已更改。

如果您感兴趣检查在这种情况下完成最终文档您可以执行下列操作:
请检查该 DocumentComplete IDispatch 参数是否 IDispatch 参数的第一个 NavigateComplete2 事件相同。由于第一个 NavigateComplete2 是顶层的框架的并且最后一个 DocumentComplete 也是顶层的框架的进行比较以这样的方式将告诉页是否完成下载。
下面是一些示例 c + + 代码:
LPDISPATCH glpDisp = NULL; // global LPDISPATCH, can also                           // be of class scope// NavigateComplete2 eventvoid 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;   }}				
DocumentComplete

警告:本文已自动翻译

Властивості

Ідентифікатор статті: 180366 – останній перегляд: 07/01/2004 16:33:16 – виправлення: 2.1

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
Зворотний зв’язок