1. 程式人生 > >Delphi中WebBrowser判斷頁面及JS ajax是否載入完成-轉

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接連出現時,就可以保證頁面已經全部載入完成了。