2008-12-09 64 views
1

之后获取文档CDHtmlDialog当我们的CDHtmlDialog中显示的页面执行了Asp.Net AJAX UpdatePanel时,我们得到一个导航事件,但之后的所有内容似乎都丢失了。我们再也没有文档,或者在页面上获取任何鼠标事件。如何在Asp.Net AJAX UpdatePanel

回答

0

看起来像我原来的帖子是一个未注册的用户,所以我不认为我可以编辑它。我们能够解决最初的问题,但它在不同的环境中再次出现(真的开始讨厌CDHTMLDialog)。

这是问题的原因:
JavaScript调用都导致导航事件,CDHtmlDialog :: OnBeforeNavigate被调用和断开连接并删除的IHTMLDocument2。不幸的是,它不是真正的Navigate,因为该页面从未改变过。这意味着从来没有调用CDHtmlDialog :: OnNavigateComplete来获取文档。

更糟的是,当我重写CDHtmlDialog :: OnBeforeNavigate时,我发现URL字符串是不可读的(bug)?

最简单的(?最好)的解决方案:
我们需要拦截的导航事件之前,只有调用CDHtmlDialog的_OnBeforeNavigate2如果URL不是一个JavaScript动作:

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正在对页面本身进行动态更改,我不确定这将如何工作。

一对夫妇的注意事项:

  • 如果导航需要在这里被彻底取消,然后设置*取消= TRUE,不要叫_OnBeforeNavigate2。在这里要小心,因为这也会取消任何JavaScript操作。
  • 直到我看到source时才清楚,但CDHtmlDialog :: _ OnBeforeNavigate2只是调用CDHtmlDialog :: OnBeforeNavigate。