您的位置:首页 > 其它

如何确定某页时是否完成 web 浏览器控件中的加载(微软观法)

2011-05-16 14:21 716 查看
http://support.microsoft.com/kb/180366

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


点击这里查看逐句中英文对照机器翻译


查看机器翻译免责声明


不再更新的 KB 内容免责声明
查看本文应用于的产品

概要

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 此处是执行此检查的代码:

[code]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

[/code]

要处理 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 浏览器控件。

cwnd/cview 派生类的头文件中定义 OnDocumentComplete 方法:

[code]afx_msg void OnDocumentComplete(LPDISPATCH lpDisp,
                                VARIANT FAR* URL);

[/code]

声明事件***在相同的头文件中:

[code]DECLARE_EVENTSINK_MAP()

[/code]

在 cwnd/cview 派生类的一个实现文件 (.cpp),实现事件接收映射:

[code]BEGIN_EVENTSINK_MAP(CYourView, CView)
   ON_EVENT(CWBTstView, ID_WEB_BROWSE, 259 /* DocumentComplete */,
            OnDocumentComplete, VTS_DISPATCH VTS_PVARIANT)
END_EVENTSINK_MAP()

[/code]

实现 OnDocumentComplete 方法:

[code]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();
}

[/code]

当 web 浏览器控件定位到的更改在顶层的框架页时,此方法有效。假设是否导航发生在一个框架本身,则激发该最终 DocumentComplete 的框架,并不是顶层的框架。例如对于请考虑以下情形。

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

如果您感兴趣检查在这种情况下完成最终文档您可以执行下列操作:
请检查该 DocumentComplete IDispatch 参数是否 IDispatch 参数的第一个 NavigateComplete2 事件相同。由于第一个 NavigateComplete2 是顶层的框架的并且最后一个 DocumentComplete 也是顶层的框架的进行比较以这样的方式将告诉页是否完成下载。
下面是一些示例 c + + 代码:

[code]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;
   }
}

[/code]

这篇文章中的信息适用于:

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



回到顶端
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: