判断一个页面加载完全完成的准确方法
!!http://www.codeproject.com/Articles/4411/IEHelper-Internet-Explorer-Helper-Class
bool CMyInternetExplorer::WaitTillLoaded (int nTimeout) { READYSTATE result; DWORD nFirstTick = GetTickCount (); do { m_pWebBrowser->get_ReadyState (&result); if (result != READYSTATE_COMPLETE) Sleep (250); if (nTimeout > 0) { if ((GetTickCount () - nFirstTick) > nTimeout) break; } } while (result != READYSTATE_COMPLETE); if (result == READYSTATE_COMPLETE) return true; else return false; }
!!http://hi.baidu.com/jakisou/item/e016473db5c99d637c034b90
public:
void DocumentComplete(LPDISPATCH pDisp, VARIANT* URL);
然后在实现文件中添加:
void CMyHtmlView::DocumentComplete(LPDISPATCH pDisp, VARIANT* URL)
{
// 这里写什么呢?
}
上面函数的实现部分写什么呢?就是前面所说的“判断页面是否加载完成”的代码了。我们从MS的这篇惨不忍睹的机器翻译的文章里,还是可以得到很多启发的,我修改了一下,使得代码适合于VC 2005+IE7的环境,如下:
void CMyHtmlView::DocumentComplete(LPDISPATCH pDisp, VARIANT* URL)
{
m_nCount++; // 这是一个类成员变量,用于计数
LPDISPATCH lpWBDisp = NULL;
HRESULT hr = NULL;
hr = m_pBrowserApp->QueryInterface(IID_IDispatch, (void**)&lpWBDisp);
ASSERT(SUCCEEDED(hr));
if (pDisp == lpWBDisp)
{
CString strMessage;
strMessage.Format(“页面加载完成!\n\n进入DocumentComplete函数的次数:%d”, m_nCount);
// Top-level Window object, so document has been loaded
MessageBox(strMessage);
}
lpWBDisp->Release();
}
http://blog.csdn.net/wangjia184/article/details/3684862
http://www.myexception.cn/vc-mfc/396586.html
设置一个定时器多等一下吧。
不光是百度,谷歌也是这样,为了尽快显示首页,页面设计得非常简单,等文档加载完成之后使用定时器再加载一个脚本标签,在脚本文件里通过DOM添加更多的页面内容,这都是加快页面显示速度的技巧。
OnDocumentComplete是在</html>标签处理完毕时就会发出,但是定时器都是在之后执行的,可能永远执行不完。