2008-12-09 6 views

Répondre

0

On dirait que j'ai fait le message original en tant qu'utilisateur non enregistré, donc je ne pense pas que je peux le modifier. Nous avons réussi à contourner le problème original, mais il est revenu dans un contexte différent (il commence vraiment à détester CDHTMLDialog).

est ici la cause du problème:
appels Javascript sont à l'origine d'un événement Navigate et CDHtmlDialog :: OnBeforeNavigate est appelé et se déconnecte et supprime le IHTMLDocument2. Malheureusement, ce n'est pas un vrai navigateur car la page n'a jamais changé. Cela signifie que CDHtmlDialog :: OnNavigateComplete n'est jamais appelé pour récupérer le document.

Pour aggraver les choses, lorsque je redéfinir CDHtmlDialog :: OnBeforeNavigate, je trouve que la chaîne URL est illisible (bug)?

La solution la plus simple (mieux?):
Nous devons intercepter l'événement Avant Navigate et appeler uniquement _OnBeforeNavigate2 du CDHtmlDialog si l'URL est pas une action 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); 
     } 
    } 
} 

La plupart des C'est assez standard pour configurer une sous-classe CDHtmlDialog, et c'est assez simple en fait, mais il m'a fallu un peu de temps pour comprendre comment gérer JavaScript. Malheureusement, je ne sais pas comment cela fonctionnera si le JavaScript apporte des changements dynamiques à la page elle-même.

notes A couple:

  • Si la navigation doit être complètement annulée ici, puis définissez * Annuler = TRUE et ne pas appeler _OnBeforeNavigate2. Faites attention ici car cela annule également les actions JavaScript.
  • Il n'était pas clair jusqu'à ce que j'ai vu le source, mais CDHtmlDialog :: _ OnBeforeNavigate2 appelle simplement CDHtmlDialog :: OnBeforeNavigate.
Questions connexes