`

Delphi中WebBrowser判断页面及JS ajax是否加载完成-转

 
阅读更多
在一个程序中需要判断WebBrowser打开的页面是否加载完成,通常的做完是使用Busy属性,代码如下:

while WebBrowser1.Busy do

    Application.ProcessMessages;

对于多框架:

procedure TForm1.WebBrowser1NavigateComplete2(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
begin
  if CurDispatch = nil then
   CurDispatch := pDisp  { save for comparison }


//如何判断WebBrowser中的某一个网页显示是否完成 ?
//只有当这个网页显示完成后才能对这个网页上的元素进行操作,否则会出错的!
//OnDocumentComplete事件在网页中含有Frame时就不行了,每个Frame都会产生OnDocumentComplete事件,无法知道什么时候真正完成了
//   原理是:第一次产生NavigateComplete2事件和最后一次产生DocumentComplete事件都是顶级(top-level)Frame,
//所以可以通过比较pDisp来判断是否完成。
//Only the final OnDocumentComplete event passes the same Dispatch interface as the OnNavigateComplete event handler.
///这个访问对于访问纯Html的页面时是一点儿问题都没有的,但有些页面在设计时为了不影响打开速度,
//是让html代码优先显示,然后再运行js代码或框架代码,
//由于我要访问的页面中没有调用框架页面,所以没作测试。

end;

procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
begin

try
 if (pDisp = CurDispatch) then
  if (pDisp =WebBrowser1.Application )then
  if   not(WebBrowser1.Busy)   then
  begin
  //对于含有ajax的页面,很可能没有加载完成。必须在ProgressChange事件中进行判断
    //Beep; {the document is loaded, not just a frame }
      if URL <> 'about:blank' then
         addtolog('  -页面下载成功 : ' + URL) ;

     // 保存页面
        doDownJob.SaveHTML();

    CurDispatch := nil; {clear the global variable }
  end;

except
     addtolog('本次页面下载失败: ' + URL) ;
     Processurlbegintime := 0; //
    // Processurlstate := '0';//状态改为0 ,以使下一个URL可以被处理
     Processstate := '0'; //处理结束了

end;
end;

这个访问对于访问纯Html的页面时是一点儿问题都没有的,但有些页面在设计时为了不影响打开速度,是让html代码优先显示,然后再运行js代码或框架代码,由于我要访问的页面中没有调用框架页面,所以没作测试。

经过一夜的摸索,最终找到了解决办法:

procedure TForm1.wb1ProgressChange(Sender: TObject; Progress,
  ProgressMax: Integer);
begin
    //判断页面及JS是否执行完毕
    if ( Progress = 0 ) and ( ProgressMax = 0 ) and
        ( OldProgress = -1 ) then
    begin
        IsWebLoadComplete := True;
    end;
    OldProgress := Progress;
end;

在此之前我对ProgressChange事件参数中的值进行了跟踪,发现当前进度的值和总进度的值相等后并不一定代表页面全部加载完成,但页面在加载完成后,Progress和ProgressMax的后两个值却总是-1/1000000和0/0。Progress的值为-1,有可能是页面全部加载完成了,但也有可能是只加载完了需要访问的其中一个页面文件。

经过多次测试,当-1/1000000和0/0接连出现时,就可以保证页面已经全部加载完成了。

 

分享到:
评论

相关推荐

    精确判断webbrowser是否加载完成demo(delphi)

    总结起来,通过监听`OnDocumentComplete`事件并跟踪加载的框架数量,我们可以精确判断Delphi中的WebBrowser组件是否已经加载完成。这个方法适用于那些需要在网页加载完成后执行特定操作的情况,例如自动化测试、数据...

    C#判断webbrowser页面最终加载完成

    综上所述,要判断WebBrowser控件的页面是否最终加载完成,通常需要结合多种策略,例如监听`DocumentCompleted`事件,检查`ReadyState`,监控`ProgressChanged`,以及可能的话,利用JavaScript交互。根据具体的应用...

    delphi动态 WebBrowser 释放问题.txt

    delphi动态 WebBrowser 释放问题.txt var web:TwebBrowser; procedure TForm1.Button1Click(Sender: TObject); begin web:=TWebBrowser.Create(Self); web.ParentWindow:=Self.Handle; web.SetBounds(100,100,...

    Delphi WebBrowser 将一段HTML文字显示在浏览器中.rar

    Delphi WebBrowser 将一段HTML文字显示在网页浏览器中,实际是创建了一个HTML格式内容并显示出来,主要使用Delphi中内置的WebBrowser方法来实现:  WebBrowser1.Navigate('about:blank');  while(tag=0) do ...

    Delphi禁止WebBrowser弹出IE的对话框

    当WebBrowser加载的页面中执行了JavaScript代码,比如`alert('Message')`,IE浏览器会显示一个带有指定消息的警告对话框,等待用户点击确定后继续执行后续代码。在大多数情况下,这是与用户交互的一种方式,但在自动...

    Delphi中WebBrowser的使用技巧汇总

    Delphi中WebBrowser的使用技巧汇总,对使用webbrowser开发很有帮助。

    Delphi中webBrowser控件bug.txt

    当使用WebBrowser控件加载包含JavaScript代码的网页时,可能会遇到一个bug:即当JavaScript尝试关闭当前页面时,程序会崩溃或者表现出异常行为。为了解决这个问题,可以通过重写`ApplicationMessage`方法来拦截`WM_...

    delphi操作webbrowser的几个技巧

    当页面包含iframe时,判断页面是否完全加载完成变得复杂。通常需要监听 `DocumentComplete` 或 `ProgressChange` 事件,并检查所有iframe的状态,确保整个页面及所有子框架都已完成加载。 通过掌握以上技巧,Delphi...

    webbrowser delphi 事件详解

    根据提供的文件信息,我们可以深入探讨 Delphi 中 WebBrowser 组件的相关事件及属性,这对于开发基于 Delphi 的应用程序具有重要意义。 ### WebBrowser 组件概述 在 Delphi 中,`WebBrowser` 组件允许开发者在其...

    WebBrowser控件(delphi)

    2. **事件处理**:WebBrowser控件有多个关键事件,如`OnBeforeNavigate2`用于在导航前执行操作,`OnDocumentComplete`表示文档加载完成,`OnProgressChange`可跟踪加载进度,`OnStatusTextChange`则更新状态栏信息。...

    fff.rar_WebBrowser delphi_delphi webbrowser_delphi 界面_webbrowser

    在Delphi中,WebBrowser可以通过拖放到窗体上来快速添加,并通过属性设置进行定制。 1. **基本使用** - 添加WebBrowser组件:在Delphi的工具箱中找到WebBrowser,将其拖放到窗体上,然后调整大小和位置。 - 设置...

    Delphi-EmbeddedWB-master_delphiwebbrowser_

    4. 事件处理:利用TEmbeddedWB提供的事件,如OnBeforeNavigate2处理页面加载前的事件,OnDocumentComplete响应页面加载完成,OnTitleChange更新标题栏内容等。 四、高级功能 1. JavaScript交互:通过TEmbeddedWB的...

    delphi与JavaScript进行交互,获取JS端返回值

    首先,要在Delphi中调用JavaScript函数,你需要一个能够解析和执行JavaScript代码的引擎。例如,可以使用开源的Chromium Embedded Framework (CEF) 或者CEFSharp,它们都包含了一个内建的V8 JavaScript引擎。一旦...

    DELPHI TWebBrowser控件使用

    当网页中包含`iframe`时,判断整个页面是否加载完成变得较为复杂。通常的做法是在`DocumentComplete`事件中检查`iframe`的状态。 #### 四、结论 通过上述介绍,可以看出`TWebBrowser`控件在Delphi中的应用范围广泛...

    webBrowser 网页放大缩小

    在Windows应用程序开发中,`WebBrowser`控件是一个非常实用的工具,它允许开发者在应用程序内嵌入一个浏览器引擎,从而展示网页内容。本话题主要围绕如何使用`WebBrowser`控件实现网页的放大和缩小功能进行深入探讨...

    解决delphi关于dbgrid和webbrowser的焦点冲突的问题

    为了解决Delphi中DBGrid和WebBrowser焦点冲突的问题,我们需要深入理解这两个组件的工作原理以及如何在代码层面进行干预。下面将详细介绍这一问题的原因、解决方案及其背后的实现细节。 ### DBGrid 和 WebBrowser ...

    Delphi WebBrowser Ole 自动登录网站

    - **等待页面加载完成**:通过监听`OnDocumentComplete`事件,确认页面已经完全加载。 - **获取登录表单元素**:使用`WebBrowser1.Document`访问HTML文档对象模型(DOM),找到用户名和密码输入框,以及提交按钮...

    Webbrowser判断 内容是否已修改

    其中,`DocumentCompleted`事件会在一个页面加载完成后触发,可以在这个事件中对比加载前后的网页内容,以判断是否有变化。 4. **内容比较**:要判断内容是否被修改,可以将页面加载后的初始状态保存下来,然后在...

    用VC获得webbrowser中的网页代码(包括dhtml及ajax变动后的)

    在VC++开发环境中,当你需要获取`WebBrowser`控件中的网页源代码,特别是涉及到动态HTML(DHTML)和AJAX技术的页面时,这通常是一个挑战。这些技术使得页面可以在不刷新整个页面的情况下进行更新,这给传统的获取页面...

Global site tag (gtag.js) - Google Analytics