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

本文介绍了一种在WebBrowser控件中判断页面加载完成的方法,包括使用Busy属性的基础方案及利用ProgressChange事件进行更准确判断的技术细节。

时间很完了,但问题总算解决了。

 

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

 

while WebBrowser1.Busy do

    Application.ProcessMessages;

 

这个访问对于访问纯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接连出现时,就可以保证页面已经全部加载完成了。

DelphiWebBrowser控件中加载HTML并与其内的JavaScript交互,可以按照以下步骤操作: 1. **设置HTML内容**: 在`Navigate`事件中,加载HTML内容,例如: ```delphi WebBrowser1.Navigate('about:blank'); // 清除初始页 WebBrowser1.Document.Write('<html><head></head><body id="myDiv">Hello from Delphi!</body></html>'); ``` 这会创建一个空白页面,并插入一段简单的文本。 2. **启用JavaScript支持**: 如果WebBrowser1没有启用JavaScript,需要设置: ```delphi WebBrowser1.Options := [wbDocCompleted]; // 加载完成后才运行JavaScript WebBrowser1.ScriptErrorsSuppressed := False; // 显示JavaScript错误 ``` 3. **在JavaScript中与Delphi通信**: JavaScript可以通过`window.parent`对象引用Delphi的全局变量。例如,在HTML中创建一个按钮点击事件,触发Delphi回调: ```javascript <button onclick="parent.callbackFunction()">Click Me</button> ``` 然后在Delphi代码中,为这个函数添加一个事件处理器: ```delphi procedure TForm1.callbackFunction(Sender: TObject); begin ShowMessage('JavaScript called from Delphi!'); end; ``` 4. **双向数据流**: 如果需要在JavaScript和Delphi之间共享数据,可以使用`window.postMessage`和Delphi的`OnMessage`事件。例如: ```javascript function sendData(data) { window.parent.postMessage(data, 'http://yourdomain.com'); } ``` 在Delphi中接收消息: ```delphi procedure TForm1.WebBrowser1Message(var Message: string); begin // Process the message here end; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值