CHtmlView多frame页判断页面是否完全加载的问题

daicong210 2021-02-03 09:54:55
为了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="#bottom" onclick="console.log('#bottom')">test #</a><br/>

消息响应日志如下:
 CMyHtmlView::BeforeNavigate2 url:【file:///D:/test.html#bottom】 ready state: 【READYSTATE_COMPLETE】
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】
结果显示:url已经变化,真实的页面其实还是test.html,但是有什么好的方法来来判断这种跳转,避免与页面相关的业务会再次触发

所以关键的问题:
1. 如何才能准确的知道本地页面已经完成了加载?
a.本地页面(如test.html)已经加载完成,不用等frame完成才算加载完成;

2. 如何建立页面从导航到完成的对应关系?
a.只跟踪本地页面间的跳转
b.对本地页书签跳转等不造成页面页面刷新的,不归类于新的页面跳转
...全文
187 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

3,055

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC HTML/XML
社区管理员
  • HTML/XML社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧