当我们的CDHtmlDialog中显示的页面执行Asp.Net AJAX UpdatePanel时,我们会得到一个导航事件,但之后的所有内容似乎都会丢失。我们不再有文档或在页面上获取任何鼠标事件。
答案 0 :(得分:0)
看起来我将原帖作为未注册用户,所以我认为我不能编辑它。我们能够解决原始问题,但它又在不同的环境中出现(真的开始讨厌CDHTMLDialog)。
以下是问题的原因:
Javascript调用导致Navigate事件,并调用CDHtmlDialog :: OnBeforeNavigate并断开连接并删除IHTMLDocument2。不幸的是,由于页面从未改变,因此它不是真正的Navigate。这意味着永远不会调用CDHtmlDialog :: OnNavigateComplete来获取文档。
更糟糕的是,当我覆盖CDHtmlDialog :: OnBeforeNavigate时,我发现URL字符串不可读(bug)?
最简单(最好?)解决方案:
我们需要拦截Before Navigate事件,如果URL不是javascript动作,则只调用CDHtmlDialog的_OnBeforeNavigate2:
BEGIN_EVENTSINK_MAP(CMyHTMLDlg, CDHtmlDialog)
ON_EVENT(CMyHTMLDlg, AFX_IDC_BROWSER, DISPID_BEFORENAVIGATE2, OnBeforeNavigate2, VTS_DISPATCH VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_PBOOL)
END_EVENTSINK_MAP()
void CMyHTMLDlg::OnBeforeNavigate2(LPDISPATCH pDisp, VARIANT* URL,VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData,VARIANT* Headers, BOOL* Cancel)
{
...
if (URL != NULL)
{
// Check if navigation is to a folder..
CString url = CString(*URL);
if(url.Left(11) != _T("javascript:"))
{
_OnBeforeNavigate2(pDisp, URL, Flags, TargetFrameName, PostData, Headers, (BOOL*)Cancel);
// If dynamic linking MFC then the above handler doesn't exist. Need to call OnBeforeNavigate direct.
// This is from a code site, and it compiles, but I've never tested it to see if it works.
//CDHtmlDialog::OnBeforeNavigate(pDisp,(LPCSTR)URL);
}
}
}
这大部分都是设置CDHtmlDialog子类的标准,实际上它非常简单,但我花了一些时间来弄清楚如何处理JavaScript。不幸的是,如果JavaScript对页面本身进行动态更改,我不确定这是如何工作的。
有几个笔记: