為了UI的修改靈活,我采用本地網頁做界面,在頁面完成回應的時候判斷具體哪一個頁面加載完成,然后做一些業務相關的操作,所以判斷一個頁面加載完成就顯得很重要,但頁面有多frame的情況下就變得很復雜,正常的frame加載成功是可以按照網友的方法來判斷如:
https://www.xuebuyuan.com/1182745.html文中提到的方式。
一旦涉及到失敗的frame這種判斷方式就會失效
查看了很多網友的判斷方式,基本上都有缺陷,目前還沒有真正找到一個好的方法來判斷頁面是否真正加載完成。
為了研究事件回應的規律,多載了大部分函式來跟蹤訊息路由沒做任何干擾的操作,只做日志輸出,如下:
void CMyHtmlView::NavigateComplete2(LPDISPATCH pDisp, VARIANT* URL)
{
PrintNavLog(URL->bstrVal); // 列印日志
CHtmlView::NavigateComplete2(pDisp, URL);
}
測驗1:
本地測驗網頁只包含一個失敗的frame元素http://127.0.0.1
<iframe ID = "test1" name = "test1" src="http://127.0.0.1"> </iframe>
訊息回應日志如下:
CMyHtmlView::BeforeNavigate2 url:【D:\test.html】 ready state: 【READYSTATE_LOADING】
CMyHtmlView::OnBeforeNavigate2 url:【D:\test.html】 ready state: 【READYSTATE_LOADING】
CMyHtmlView::BeforeNavigate2 url:【http://127.0.0.1/】 ready state: 【READYSTATE_LOADING】
CMyHtmlView::OnBeforeNavigate2 url:【http://127.0.0.1/】 ready state: 【READYSTATE_LOADING】
CMyHtmlView::NavigateComplete2 url:【D:\test.html】 ready state: 【READYSTATE_LOADING】
CMyHtmlView::OnNavigateComplete2 url:【D:\test.html】 ready state: 【READYSTATE_LOADING】
CMyHtmlView::NavigateError url:【http://127.0.0.1/】 ready state: 【READYSTATE_INTERACTIVE】
CMyHtmlView::OnProgressChange url:【-----】 ready state: 【READYSTATE_INTERACTIVE】
CMyHtmlView::DocumentComplete url:【】 ready state: 【READYSTATE_INTERACTIVE】
CMyHtmlView::OnDocumentComplete url:【】 ready state: 【READYSTATE_INTERACTIVE】
CMyHtmlView::NavigateError url:【http://127.0.0.1/】 ready state: 【READYSTATE_INTERACTIVE】
CMyHtmlView::BeforeNavigate2 url:【res://ieframe.dll/navcancl.htm#http://127.0.0.1/】 ready state: 【READYSTATE_INTERACTIVE】
CMyHtmlView::OnBeforeNavigate2 url:【res://ieframe.dll/navcancl.htm#http://127.0.0.1/】 ready state: 【READYSTATE_INTERACTIVE】
CMyHtmlView::NavigateComplete2 url:【res://ieframe.dll/navcancl.htm#http://127.0.0.1/】 ready state: 【READYSTATE_INTERACTIVE】
CMyHtmlView::OnNavigateComplete2 url:【res://ieframe.dll/navcancl.htm#http://127.0.0.1/】 ready state: 【READYSTATE_INTERACTIVE】
CMyHtmlView::OnProgressChange url:【-----】 ready state: 【READYSTATE_INTERACTIVE】
結果顯示:只會觸發一次DocumentComplete且還不帶url,所以不是本地頁test.html的完成回應,本地頁不會有完成回應出現
測驗2:
本地測驗網頁只包含一個失敗的frame元素http://192.168.0.1
<iframe ID = "test1" name = "test1" src="http://192.168.0.1"> </iframe>
訊息回應日志如下:
CMyHtmlView::BeforeNavigate2 url:【D:\test.html】 ready state: 【READYSTATE_LOADING】
CMyHtmlView::OnBeforeNavigate2 url:【D:\test.html】 ready state: 【READYSTATE_LOADING】
CMyHtmlView::BeforeNavigate2 url:【http://192.168.0.1/】 ready state: 【READYSTATE_LOADING】
CMyHtmlView::OnBeforeNavigate2 url:【http://192.168.0.1/】 ready state: 【READYSTATE_LOADING】
CMyHtmlView::NavigateComplete2 url:【D:\test.html】 ready state: 【READYSTATE_LOADING】
CMyHtmlView::OnNavigateComplete2 url:【D:\test.html】 ready state: 【READYSTATE_LOADING】
CMyHtmlView::NavigateError url:【http://192.168.0.1/】 ready state: 【READYSTATE_INTERACTIVE】
CMyHtmlView::NavigateComplete2 url:【http://192.168.0.1/】 ready state: 【READYSTATE_INTERACTIVE】
CMyHtmlView::OnNavigateComplete2 url:【http://192.168.0.1/】 ready state: 【READYSTATE_INTERACTIVE】
CMyHtmlView::OnProgressChange url:【-----】 ready state: 【READYSTATE_INTERACTIVE】
CMyHtmlView::DocumentComplete url:【http://192.168.0.1/】 ready state: 【READYSTATE_INTERACTIVE】
CMyHtmlView::OnDocumentComplete url:【http://192.168.0.1/】 ready state: 【READYSTATE_INTERACTIVE】
CMyHtmlView::DocumentComplete url:【D:\test.html】 ready state: 【READYSTATE_COMPLETE】
CMyHtmlView::OnDocumentComplete url:【D:\test.html】 ready state: 【READYSTATE_COMPLETE】
結果顯示:frame和本地頁面都會有完成事件觸發,但是順序是frame先于頁面觸發,這樣會造成本地頁觸發之前會一直等待frame完成,耗時較長。然后對比測驗1可以看出:http://127.0.0.1是具有某些特殊性嗎?
測驗3
本地頁包含有書簽:
<a href="https://bbs.csdn.net/topics/#bottom" onclick="console.log('#bottom')">test #</a><br/>訊息回應日志如下:
CMyHtmlView::BeforeNavigate2 url:【file:///D:/test.html#bottom】 ready state: 【READYSTATE_COMPLETE】結果顯示:url已經變化,真實的頁面其實還是test.html,但是有什么好的方法來來判斷這種跳轉,避免與頁面相關的業務會再次觸發
CMyHtmlView::OnBeforeNavigate2 url:【file:///D:/test.html#bottom】 ready state: 【READYSTATE_COMPLETE】
CMyHtmlView::NavigateComplete2 url:【file:///D:/test.html#bottom】 ready state: 【READYSTATE_COMPLETE】
CMyHtmlView::OnNavigateComplete2 url:【file:///D:/test.html#bottom】 ready state: 【READYSTATE_COMPLETE】
CMyHtmlView::DocumentComplete url:【file:///D:/test.html#bottom】 ready state: 【READYSTATE_COMPLETE】
CMyHtmlView::OnDocumentComplete url:【file:///D:/test.html#bottom】 ready state: 【READYSTATE_COMPLETE】
所以關鍵的問題:
1. 如何才能準確的知道本地頁面已經完成了加載?
a.本地頁面(如test.html)已經加載完成,不用等frame完成才算加載完成;
2. 如何建立頁面從導航到完成的對應關系?
a.只跟蹤本地頁面間的跳轉
b.對本地頁書簽跳轉等不造成頁面頁面重繪的,不歸類于新的頁面跳轉
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/256072.html
標籤:HTML/XML
上一篇:什么AI庫可以表示圓圈里面的判斷程序和各個連線的權重
下一篇:MFC應用程式界面美化
