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="#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.对本地页书签跳转等不造成页面页面刷新的,不归类于新的页面跳转