当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。

10-08 05:41