真正的DocumentComplete

原创 2008年09月29日 07:15:00
 DocumentComplete

当一个文档完整的完成下载Internet Explorer 激发DocumentComplete 事件. 仅仅当此事件激发后 文档对象才可安全使用.在一个无帧的Web页情形中文档对象是IHTMLDocument2 对象, 我们以后会讨论. 当文档对象准备好可用,他的状态为READYSTATE_COMPLETE.

关于 DocumentComplete 事件以西击点需要注意:

·         在没有帧的web页, DocumentComplete 事件在下载完成后激发一次.

  • 在多帧的web页,此事件激发多次.并非每一个帧激发一个事件, 但每一个帧激发DownloadBegin事件将会相应激发DocumentComplete 事件.
  • DocumentComplete又一个指向 IDispatch 的指针参数, 该参数指向激发此事件的窗口. 此窗口可以是帧中的窗口
  • 顶级帧在所有子帧激发了各自的DocumentComplete事件后激发自己的 DocumentComplete事件。 因此,,要看一个web页是否完整下载完成, 你需要从该事件的处理句柄中获取由事件产地过来的IDispatch 参数的IUnknown 接口。下一步,比较IUnknown 接口是否指向你正宿主的WebBrowser控件或者自动化的IE的实例的IUnknown 接口.如果这两个指针相同,这意味着全部HTML, 图片images, 控件,以及诸如此类在顶级帧或者子帧的全部对象元素都被下载了.

 

VB中实现以上四点及其容易.仅需要检查发送给事件的pDisp 参数事一个WebBrowser 对象. Visual Basic小心检查这些对象的 Iunknown否为同一个对象.此处为VB代码::

实现以上四点在Visual C++ 应用程序里较困难一点,但你可以做到! 首先在DocumentComplete 事件的宏中如下声明:

接下来声明OnDocumentComplete 方法作为事件处理句柄

最后,实现该方法以检测 是否页面已经下载,我们得到我们宿主控制bBrowser 控件的IUnknown. (注意我们不是简单获取指向 IUnknown ,而是要调用GetControlUnknown 方法. GetControlUnknown方法返回的IUnknown 指针 实际上并不等于被宿主话的 WebBrowser控件的IUnknown. 那将返回IOleObject 接口指针.) 下一步, 获取IUnknown 指针,如果QueryInterface 查询得到的Dispatch 参数同Iunknown接口是同一对象,则页面完成整个下载。.

有一点需要注意上面的代码我们在GetControlUnknown 返回的IUnknown 接口指针使用时并没有进行Release ,因为b IUnknown 指针并没有在GetControlUnknown方法中 AddRef'. GetControlUnknown 方法仅仅返回一个IOleObject 数据成员的指针,该指针由控件站点类—CcontrolSite 操纵处理. 如果你释放了IUnknown 接口指针, 载你关闭应用程序时,一个访问违例将会发生,因为MFC 将试图在对象被删除时候多释放一次.

DownloadBegin

DownloadBegin 事件通知应用程序一个导航操作开始. 一般情况下该事件在BeforeNavigate2 事件之后激发, 除非导航操作在BeforeNavigate2 事件处理过程中被取消.容器应当显示动画或者忙指示当前正处于连接的DownloadBegin事件. 每一个 DownloadBegin 事件有一个相应的DownloadComplete 事件. 在刷新页面的情形中, DownloadBegin DownloadComplete 使唯一的被激发的导航事件.

DownloadComplete

DownloadComplete在一个导航操作完成时候发生, 停止, 或者失败. 不像 NavigateComplete2仅仅当成功导航才发生, DownloadComplete总是在道涵开始后激发.任何在DownloadBegin 中显示的动画或者忙指示将会在DownloadComplete 中停止.

NavigateComplete2

NavigateComplete2 事件在导航到一个超连接整个窗口或者帧集合的元素全部完成时候发生. 第一此事件发生表示文档document已经准备好.在此事件发生后, 你可以通过Document 属性存取文档(document)而不接收到错误.但是能够访问一个文档不意味着你访问文档使安全的.你可以在DocumentComplete 事件激发后安全访问文档.

档你需要访问document对象但是不需要访问文档内的元素,你可以在NavigateComplete2 事件中尽可能快的处理,例如当你在文打工通过高级宿主接口. NavigateComplete2 事件有2个参数—IDispatch of 代表激发事件的对象URL 为你需要导航到的URL.

在CHtmlView中,判断一个页面加载完成的准确方法,解决OnDocumentComplete多次调用问题

在CHtmlView中,判断一个页面加载完成的准确方法 凌晨了,但是关于这个问题一定要记录下来,要不然以后不记得了,还得走弯路。 今天在对一个小系统做一个测试,为了便于自动操作,于是用VC写了...
  • z331719654
  • z331719654
  • 2014年02月25日 22:28
  • 2665

如何使用V2005建立一个BHO组件--响应documentcomplete事件,去除页面中的图片

原文 http://blog.sina.com.cn/s/blog_4a34240c0100d35o.html 前言:       本文档是为了演示如何使用V2005开发一个简单的BHO组...
  • FirstHope
  • FirstHope
  • 2013年12月24日 13:04
  • 1833

实现和IE浏览器交互的几种方法的介绍(二)

法。IDispatch是从IUnknown中继承的一个接口的类型,通过COM接口提供的任何服务都可以通过IDispatch接口来实现。IDispatch::Invoke的工作方式同vtbl幕后的工作方...
  • shifuren
  • shifuren
  • 2015年08月20日 11:15
  • 644

C# 获取IE浏览器句柄

///         /// 获取指定窗体的标题         ///         /// 窗体句柄         /// 缓冲区取用于存储标题         /// 缓冲区大小   ...
  • chengjunlin0793
  • chengjunlin0793
  • 2015年11月20日 18:35
  • 1875

C#直接调用IE打开指定的网页文件

之前在一级的项目中遇到了一个问题,就是其他的系统需要用谷歌的浏览器作为支持,而我们的系统是需要IE浏览器做支持的,另外我们的页面都是在本地的所以可以由指定浏览器打开,所以有了这个研究,这对于软件和系统...
  • tr1912
  • tr1912
  • 2016年12月25日 10:56
  • 1196

C#设置IE代理

首先,我想通过修改注册表来设置IE代理。 以下是修改注册表的代码: [csharp] view plaincopy //打开注册表   Mi...
  • hemeinvyiqiluoben
  • hemeinvyiqiluoben
  • 2015年09月06日 18:25
  • 609

C# 设置IE浏览器代理

这个小工具可以用来设置 ie浏览器的代理 ip,其实就是去修改注册表相关键值。。 理论上来说 ,只要是 使用ie内核的浏览器都可以,不过我没试。。。 下面上图,上代码,上程序 usi...
  • zky0901
  • zky0901
  • 2015年10月22日 16:08
  • 276

基于c#的IE 代理服务器设置

在进行IE代理服务设置时,需要手动打开代理服务器以及设置IE浏览器代理设置、开启或关闭。此处利用c#编写窗体,一键打开代理服务器、设置IE代理。此程序是基于一改进方案进行开发。一般的做法是直接修改注册...
  • a1368783069
  • a1368783069
  • 2015年04月25日 20:52
  • 1466

C#使用Windows API控制IE切换标签页TAB至某网址网页

//引用 using SHDocVw; using msHTML; //函数 public static void ActiveIETab(string url) { ...
  • lifengxia84520
  • lifengxia84520
  • 2014年05月19日 11:55
  • 1590

C# 设置webbrowser 引用的IE版本

今天再弄WebBrowser Control元件的測試,發現IE9無法運行我寫的WebSocket程式,因此稍微測試了一下HTML5的支援程度,發現用IE開起來可以跑出138的分數,但在WebBrow...
  • snakorse
  • snakorse
  • 2014年02月22日 16:24
  • 2042
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:真正的DocumentComplete
举报原因:
原因补充:

(最多只允许输入30个字)