Wie das Dokument CDHtmlDialog nach Asp.Net AJAX Update erhalten

stimmen
1

Wenn die angezeigte Seite in unserem CDHtmlDialog funktioniert ein Asp.Net AJAX Update bekommen wir ein navigate Ereignis, aber alles danach scheint verloren zu sein. Wir haben kein Dokument mehr oder erhalten alle Mausereignisse auf der Seite.

Veröffentlicht am 10/12/2008 um 00:25
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
0

Sieht aus wie ich den Original-Beitrag als nicht registrierter Benutzer gemacht, so dass ich glaube nicht, dass ich es bearbeiten kann. Wir waren in der Lage um das ursprüngliche Problem zu arbeiten, aber es kam in einem anderen Kontext wieder auf (wirklich CDHtmlDialog zu hassen beginnen).

Hier ist die Ursache des Problems:
Javascript Anrufe verursachen eine Navigate - Ereignis, und CDHtmlDialog :: OnBeforeNavigate wird aufgerufen und die Verbindung trennt und löscht die IHTMLDocument2. Leider ist es nicht eine echte Navigation , da die Seite nie geändert. Das bedeutet CDHtmlDialog :: OnNavigateComplete wird das Dokument nie wieder zu bekommen genannt.

Erschwerend kommt hinzu, wenn ich CDHtmlDialog außer Kraft setzen :: OnBeforeNavigate ich die URL-Zeichenfolge zu finden, ist nicht lesbar (Bug)?

Die einfachste (? Beste) Lösung:
Wir müssen die Vor Navigieren Ereignisse abzufangen, und nur die _OnBeforeNavigate2 des CDHtmlDialog nennen , wenn die URL nicht eine Javascript Aktion ist:

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);
        }
    }
}

Das meiste ist ziemlich Standard für die Einrichtung eines CDHtmlDialog Unterklasse, und es ist ziemlich einfach, eigentlich, aber es hat mich ein wenig um herauszufinden, wie JavaScript zu behandeln. Leider bin ich nicht sicher, wie dies funktionieren wird, wenn die JavaScript selbst dynamische Änderungen an der Seite macht.

Ein paar Hinweise:

  • Ist die Navigation vollständig hier abgebrochen werden muss, dann setzen * Abbruch = TRUE und nicht _OnBeforeNavigate2 nennen. Hier vorsichtig sein, weil dies auch alle JavaScript-Aktionen abgebrochen.
  • Es war nicht klar , bis ich das sah , Quelle , aber CDHtmlDialog :: _ OnBeforeNavigate2 nur Anrufe CDHtmlDialog :: OnBeforeNavigate.
Beantwortet am 02/02/2009 um 18:34
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more