CDHtmlDialog类OnBeforeNavigate2取消页面浏览后页面元素事件失效问题的解决方法

原创 2013年12月06日 10:58:49

在基于CDHtmlDialog类的对话框使用OnBeforeNavigate2已经有很多人给出了方法

http://alee201.blog.163.com/blog/static/277908512007313113733617/

http://bbs.csdn.net/topics/390411927?page=1

但是正如第二个链接中4楼的人提出的问题”该方法我早就试过,却是起作用,但是只要DECLARE_EVENTSINK_MAP(),那么BEGIN_DHTML_EVENT_MAP就不起作用,也就是说,html中的button,onButton事件就没用了,不知道怎么回事。“,我也碰到了类似的问题,就是一旦在OnBeforeNavigate2事件中Cancel了当前页面继续浏览,页面上的原来的元素操作就收不到消息继续工作了,经过1天的研究,找到了解决方法。


原理上就是在OnBeforeNavigate2事件中设置Cancel参数为TRUE,确实会取消页面的浏览,但是仍然会触发DocumentComplete事件,而在CDHtmlDialog类中DocumentComplete事件处理程序不管是否取消了页面浏览都会进行一定的工作,这些工作在取消浏览时会造成一定的错误,然后页面上的原来的元素操作就收不到消息继续工作了。


说了原理,下面给出具体的解决方法

实现OnBeforeNavigate2方法时,同时实现DocumentComplete方法

在.h文件中加入

protected:
	DECLARE_EVENTSINK_MAP()
	void OnBeforeNavigate2(LPDISPATCH pDisp, VARIANT FAR* URL, VARIANT FAR* Flags,
		VARIANT FAR* TargetFrameName, VARIANT FAR* PostData, VARIANT FAR* Headers, BOOL FAR* Cancel);
	void OnDocumentCompleteThis(LPDISPATCH pDisp, VARIANT* URL);
	BOOL m_Cancel;


在.cpp文件中分别接入如下代码片段

BEGIN_EVENTSINK_MAP(CWebSizeWndTestDlg, CDHtmlDialog)
	ON_EVENT(CWebSizeWndTestDlg, AFX_IDC_BROWSER, 250 /* BeforeNavigate2 */, OnBeforeNavigate2, VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL)
	ON_EVENT(CWebSizeWndTestDlg, AFX_IDC_BROWSER, 259 /* DocumentComplete */, OnDocumentCompleteThis, VTS_DISPATCH VTS_PVARIANT)
END_EVENTSINK_MAP()


void CWebSizeWndTestDlg::OnBeforeNavigate2(LPDISPATCH pDisp, VARIANT FAR* URL, VARIANT FAR* Flags,
	VARIANT FAR* TargetFrameName, VARIANT FAR* PostData, VARIANT FAR* Headers, BOOL FAR* Cancel)
{
	//*Cancel = FALSE;
	//if (condition)
	//	*Cancel = TRUE;

	if (*Cancel)
		m_Cancel = TRUE;
	else
		_OnBeforeNavigate2(pDisp, URL, Flags, TargetFrameName, PostData, Headers, Cancel);
}

void CWebSizeWndTestDlg::OnDocumentCompleteThis(LPDISPATCH pDisp, VARIANT* URL)
{
	if (m_Cancel)
		m_Cancel = FALSE;
	else
		_OnDocumentComplete(pDisp, URL);
}


并且别忘了在初始化时将m_Cancel设置为FALSE,不然第一个正常页面都加载不进来。

这样如果取消了OnBeforeNavigate2,就不让调用CDHtmlDialog的DocumentComplete的事件处理程序,这样就没有问题了。




在 CDHtmlDialog 类中如何使用 OnBeforeNavigate2 方法

http://hi.baidu.com/alee201/blog/item/6196d38130a33fd19023d9ef.html 在 CDHtmlDialog 类中如何使用 OnB...
  • tonykk2008
  • tonykk2008
  • 2012年08月24日 17:09
  • 2704

如何让 WebBrowser控件 使用BeforeNavigate2(...)屏蔽特定页面

这是俺提问的一个帖子,如下:norsd等级:可用分等级:贫农总技术分:932总技术分排名:20992结帖率:100.00%BeforeNavigate2(...) 中的参数 *Cancel=VARIA...
  • norsd
  • norsd
  • 2008年12月11日 17:00
  • 8002

拦截用户刷新或离开页面

刷新、离开页面
  • qq_39759115
  • qq_39759115
  • 2017年11月10日 14:12
  • 85

jQuery Mobile页面跳转导致css、js失效原因及解决方法

# jQuery Mobile页面跳转导致css、js失效原因及解决方法Created by Yiyi_coding Last edited at 2015年7月10日——————- 昨天做项目画面...
  • tmacjackson
  • tmacjackson
  • 2015年07月10日 14:01
  • 1079

简述DCL失效原因,解决方法

DCL单例模式针对延迟加载法的同步实现所产生的性能低的问题,我们可以采用DCL,即双重检查加锁(Double Check Lock)的方法来避免每次调用getInstance()方法时都同步。实现方式...
  • zhaojw_420
  • zhaojw_420
  • 2017年04月22日 22:52
  • 1152

Myeclipse中JSP页面快捷键注释失效解决方法

一直未能解决JSP页面中不能使用快捷键注释,而在coding中,快捷键注释能大大提高编程效率,因此在网上查找各种资料,终于能够通过快捷键组合ctrl+shift+C在JSP页面中进行块注释,解决方法如...
  • ab6326795
  • ab6326795
  • 2013年09月19日 11:22
  • 2338

uploadify取消文件上传

最近这两天项目中用到了uploadify(文件上传),在这里进行一个总结uploadifyuploadify是一个基于JQuery的文件上传插件,有免费版和收费版两个版本,其中免费版采用了flash,...
  • benjaminlee1
  • benjaminlee1
  • 2016年11月20日 21:06
  • 2700

iOS如何在页面销毁时优雅的cancel网络请求

大家都知道,当一个网络请求发出去之后立即退出页面,会变成无用请求,那么如何用最少的代码,更简洁的方式cancel掉这个无用请求呢?...
  • u010124617
  • u010124617
  • 2017年11月22日 14:57
  • 1448

关于js动态添加的时候样式失效的问题

由于项目要搬家,某些地方还是一样的,但是UI用的不一样,在做动态添加的时候遇到一个问题,累加的时候明明代码都是一样一样的啊!怎么后面加出来的没有样式了哩,折腾了一下午,发现原来就是一个小问题。 所以进...
  • nnn_net
  • nnn_net
  • 2016年04月28日 18:43
  • 6004

onkeydown事件的拦截

android的按键事件是可以拦截,并自己处理的; 一般重写onkeydwon事件就行了; @Override public boolean onKeyDown(int keyCode, Key...
  • mulanlong
  • mulanlong
  • 2016年11月19日 14:11
  • 558
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CDHtmlDialog类OnBeforeNavigate2取消页面浏览后页面元素事件失效问题的解决方法
举报原因:
原因补充:

(最多只允许输入30个字)