2008-12-09 63 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。