这是俺提问的一个帖子,如下:
- norsd
- 等级:
- 可用分等级:贫农
- 总技术分:932
- 总技术分排名:20992
- 结帖率:100.00%
- BeforeNavigate2(...) 中的参数 *Cancel=VARIANT_TRUE, 取消导航后,无法使页面Complete
- 我打开一个页面A,页面A中有frame(B,C,D), 然后会多次BeforeNavigate2, 我取消了其中页面C的请求, 但是页面A无法收到DocumentComplete,
- StatusText 也一直是显示: Waiting A .....
- 求解决办法!
- jameshooo
- 等级:
- 可用分等级:富农
- 总技术分:65080
- 总技术分排名:121
- 25
- 发表于:2008-12-09 11:47:352楼 得分:150
- 可以让禁止的frame导航到about:blank,例如可以这样写:
- MyBeforeNavigate2(IDispatch* pDisp, VARIANT* url, ..., VARIANT_BOOL* Cancel)
- {
- if (pDisp == FrameC && lstrcmpW(V_BSTR(url), L"about:blank")!=0 )
- {
- *Cancel = VARIANT_TRUE;
- CComQIPtr <IWebBrowser2> spBrowser = <script src="http://hi.images.youkuaiyun.com/js/blog/tiny_mce/themes/advanced/langs/zh.js" type="text/javascript"></script> <script src="http://hi.images.youkuaiyun.com/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js" type="text/javascript"></script> pDisp;
- CComVariant vUrl=L"about:blank", vTmp;
- spBrowser->Navigate2(&vUrl, &vTmp, &vTmp, &vTmp, &vTmp);
- }
- }
- oyljerry
- 等级:
- 可用分等级:小地主
- 总技术分:170357
- 总技术分排名:18
- 32
- 发表于:2008-12-09 12:35:144楼 得分:50
- 自己再navigate到别的一个缺省页面...不让它阻塞
- norsd
- 等级:
- 可用分等级:贫农
- 总技术分:932
- 总技术分排名:20992
- 发表于:2008-12-11 16:53:407楼 得分:0
- 有效果了,把代码贴一下,为后来人着想 :)
- BeforeNavigate2( IDispatch *pDisp,VARIANT *&url,VARIANT *&Flags,VARIANT *&TargetFrameName,VARIANT *&PostData,VARIANT *&Headers,VARIANT_BOOL *&Cancel)
- {
- if( 0 == ::wcscmp( url->bstrVal , L"about:blank" )
- return;
- //
- // 判断哪一些url,是需要屏蔽的,设置 *Cancel = VARIANT_TRUE;
- // Your Codes Here..............
- //
- if( *Cancel == VARIANT_TRUE )
- {
- VARIANT varNewUrl;
- varNewUrl.vt = VT_BSTR;
- varNewUrl.bstrVal = ::SysAllocString(L"about:blank");
- IWebBrowser2* pWB2;
- pDisp->QueryInterface(IID_IWebBrowser2,(void**)&pWB2 );
- pWB2->Stop();//此句可有可无
- pWB2->Navigate2( &varNewUrl, Flags, TargetFrameName, PostData, Headers);
- ::SysFreeString( varNewUrl.bstrVal );
- }
- }
- 顺便说一句, 如果一个页面没有收到 document complete 消息, 有一些JS消息是无法响应的,比如 window.onresize 就是这样,在页面完成之前,window.onresize都不会相应!
比如我在浏览 www.youkuaiyun.com 时, 如果页面请求"www.google.cn" ,我就可以屏蔽掉,来回避google广告.
但是有一个问题一定要注意:
新的url对象要注意安全性问题,如果页面是http://, 你设置新的页面为: file:///c:/test.html , 就会在 pWB2->Navigate2(...)时发生错误,因为基于安全性的原因,本地和远程文件不能在同一个WB中显示.
但是,有一个
弱点,呵呵, 就是协议是 res: 和 其他自定义协议就没有关系哦!