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的事件处理程序,这样就没有问题了。



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

【win32 app调用html方法】解决VS2008中CHtmlView函数OnBeforeNavigate2不能禁止跳转的BUG

VS2008中CHtmlView的OnBeforeNavigate2函数有个莫名其妙的问题,竟然不然实现禁止导航.  函数定义如下: void CHtmlView::OnBefor...

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

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

fullpage插件动态添加节点,页面不能动态渲染问题解决方法

fullpage插件动态添加节点,页面不能动态渲染问题解决方法由于自己在用fullpage这个插件的时候,遇到了一个坑,各种百度都没有找到解决办法,最后查看源码在找到,故此记录下来,可以给同样遭遇的同...

IIS7错误:“由于扩展配置问题而无法提供您请求的页面”解决方法

由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本 ,请添加处理程序。如果勇载文件,请添加 MIME 映射。 解决方法一: 1.控制面板→程序和功能→...
  • yilip
  • yilip
  • 2012-10-18 09:22
  • 1084

前端页面布局常见的兼容性问题和解决方法

前端页面兼容问题主要表现在我们所做的页面在不同浏览器显示会有所不同,目前主要的兼容性问题比较多的是IE6和IE7,另外针对html5和css3新标签,比如css3动画,媒体查询,画布,视频等暂时不做讨...
  • gj1949
  • gj1949
  • 2016-12-26 13:26
  • 1200

SSH框架登录注册页面用struts的xml配置方式校验遇到的问题及解决方法

SSH框架用struts的xml配置进行前台验证,验证登录和注册页面遇到的问题及解决方法。

ASP中Utf-8与Gb2312编码转换乱码问题的解决方法 页面编码声明

出现这样的问题是当你浏览UTF-8编码的时候,服务器默认用UTF-8的引擎来输出html,当你用再浏览GB2312的页面时,它还是用UTF-8来输出本应是GB2312编码的页面所以会乱码。  为...

IFrame引用跨域站点页面时,Session失效问题解决

问题场景:在一个应用(集团门户)的某个page中, 通过IFrame的方式嵌入另一个应用(集团实时监管系统)的某个页面. 当两个应用的domain 不一样时, 在被嵌入的页面中Session失效。(s...
  • kntao
  • kntao
  • 2011-03-29 15:43
  • 1873
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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