当CDHtmlDialog中显示的页面执行Asp.Net AJAX UpdatePanel时,我们会得到一个导航事件,但是此后的所有内容似乎都丢失了。我们没有文档了,或者页面上没有鼠标事件。
最佳答案
看起来我是以未注册用户的身份发布原始帖子的,所以我认为我无法对其进行编辑。我们能够解决原始问题,但又在不同的背景下再次出现(确实开始讨厌CDHTMLDialog)。
这是问题的原因:
Javascript调用导致了Navigate事件,并且CDHtmlDialog :: OnBeforeNavigate被调用,并断开连接并删除IHTMLDocument2。不幸的是,由于页面从未更改,因此这不是真正的导航。这意味着从不调用CDHtmlDialog :: OnNavigateComplete来取回文档。
更糟糕的是,当我重写CDHtmlDialog :: OnBeforeNavigate时,我发现URL字符串不可读(错误)?
最简单(最好?)的解决方案:
我们需要拦截“导航前”事件,并且仅在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对页面本身进行动态更改,我不确定这将如何工作。
几个注意事项:
如果需要在此处完全取消导航,则将* Cancel = TRUE设置为不调用_OnBeforeNavigate2。请注意此处,因为这也会取消所有JavaScript操作。
直到我看到source为止还不清楚,但是CDHtmlDialog :: _ OnBeforeNavigate2只是调用CDHtmlDialog :: OnBeforeNavigate。