2010-11-24 7 views
1

Hallo Senioren (wie ich bin neu in Web-basierten Anwendungen), Ich war daran interessiert, Browserabschluss Veranstaltung zu implementieren oder zu erfassen. Ja! Ich habe es getan und es erfolgreich implementiert, indem ich Javascript {siehe Code unten} benutze, aber ich habe es in einer Webseite ohne MasterPage implementiert. Nun, wie ich versuche, es in einer Webseite mit MASTERPAGE zu implementieren, aber in jedem Post zurück ... das Ereignis window.onunload wird abgefangen, was mir Probleme gibt ... Gibt es irgendeine Technik oder Logik, um festzustellen, ob ich kann zwischen einer Schließen-Schaltfläche und dem Post-Back-Ereignis einer Seite unterscheiden.Catching ein Browser schließen Ereignis

Bitte führen Sie mich ... wie ich in einem Projekt so schnell wie möglich zu implementieren .... danke.

Ankit Srivastava

<script type="text/javascript"> 

     function callAjax(webUrl, queryString) 
     { 
      var xmlHttpObject = null; 

       try 
       { 
         // Firefox, Opera 8.0+, Safari... 

         xmlHttpObject = new XMLHttpRequest(); 
        } 
       catch(ex) 
       { 
         // Internet Explorer... 

       try 
        { 
         xmlHttpObject = new ActiveXObject('Msxml2.XMLHTTP'); 
        } 
       catch(ex) 
       { 
        xmlHttpObject = new ActiveXObject('Microsoft.XMLHTTP'); 
       } 
      } 

      if (xmlHttpObject == null) 
       { 
       window.alert('AJAX is not available in this browser'); 
       return; 
       } 

     xmlHttpObject.open("GET", webUrl + queryString, false); 
     xmlHttpObject.send(); 

     return xmlText; 
} 

</script> 

<script type="text/javascript"> 

var g_isPostBack = false; 

window.onbeforeunload = check() 
function check() 
{ 
if (g_isPostBack == true) 
    return; 

var closeMessage = 
    'You are exiting this page.\n' + 
    'If you have made changes without saving, your changes will be lost.\n' + 
    'Are you sure that you want to exit?'; 

if (window.event) 
{ 
    // IE only... 

    window.event.returnValue = closeMessage; 
} 
else 
{ 
    // Other browsers... 

    return closeMessage; 
} 

g_isPostBack = false; 
} 
window.onunload = function() 
{ 
if (g_isPostBack == true) 
    return; 

var webUrl = 'LogOff.aspx'; 
var queryString = '?LogoffDatabase=Y&UserID=' + '<%# Session["loginId"] %>'; 
var returnCode = callAjax(webUrl, queryString); 

} 

</script> 
+0

Schauen Sie in jquery. Du machst eine Menge unnötiger Arbeit. – Chris

+0

Schauen Sie sich dies an (http://stackoverflow.com/questions/1824421/detect-browser-close-on-asp-net/1824486#1824486). –

Antwort

3

Es gibt kein Javascript Ereignis, das zwischen einem Browser und dem Benutzer zu einer anderen Seite navigiert wird geschlossen unterscheidet (entweder über die Vor/Zurück-Taste oder Klicken auf einen Link oder ein anderes Navigations Methode). Sie können nur feststellen, wann die aktuelle Seite entladen wird. Nachdem ich das gesagt habe, bin ich mir nicht sicher, warum Sie den Unterschied überhaupt kennen müssen? Klingt wie ein XY-Problem für mich.

+0

... und selbst wenn das der Fall ist, wird der Browser nicht geschlossen, weil er abgestürzt ist oder die Netzwerkverbindung verloren gegangen ist oder ein Stromausfall den Computer heruntergefahren hat usw. – Quentin

0

Die Antwort kann auf SO zu finden: How to capture the browser window close event?

jQuery(window).bind("beforeunload", function(){return confirm("Do you really want to close?") }) 

und zu verhindern, dass die Bestätigung auf übermittelt:

jQuery('form').submit(function() { 
    jQuery(window).unbind("beforeunload"); 
    ... 
}); 
+0

Beachten Sie, dass Opera nicht unterstützt Standard 'onbeforeunload' und' onunload'. –

0

Erster Schritt: add globales JavaScript-Variable "_buttonClicked", die anfänglich auf falsch gesetzt.

Zweiter Schritt: Klicken Sie bei jedem Klick auf _buttonClicked Wert auf True. Mit jQuery ist es eine Zeile, reines JavaScript ist auch nur ein paar Zeilen.

Dritter Schritt: in Ihrer Funktion überprüfen _buttonClicked und wenn es wahr ist, nichts tun.

EDIT: Nach einem kurzen Blick in Ihren Code sehe ich Sie bereits die Schritte # 1 und # 3, so alles was Sie brauchen, ist der zweite Schritt, zuweisen g_isPostBack als wahr, wenn eine Schaltfläche zum Senden geklickt wird. Lassen Sie mich wissen, wenn Sie Hilfe beim Implementieren des Codes benötigen und wenn Sie jQuery haben können.

0

Wenn man sich abmelden will, wenn der Browser geschlossen ist (indem man auf das Kreuz klickt), können wir die Hilfe von Fensterereignissen nutzen. Zwei Ereignisse werden hilfreich sein: onunload und onbeforeunload. Aber das Problem tritt auf, dass der Code auch funktioniert, wenn Sie von einer Seite zu einer anderen navigieren sowie auch wenn eine die Seite aktualisiert. Wir wollen nicht, dass unsere Sitzungen klar sind, und wir müssen die Aufzeichnung der Abmeldung während der Aktualisierung einfügen. Also die Lösung ist, wenn wir den Unterschied zwischen Schließen und Aktualisieren oder Navigieren unterscheiden. Ich habe die Lösung:

  1. Write 'onbeforeunload = "loadout();"' im Body-Tag auf Master-Seite.

  2. Fügen Sie die folgende Funktion innerhalb Skript im Kopfbereich der Master-Seite: -

    Funktion loadout() { if ((window.event.clientX < 0) || (Window.event.clientY < 0)) {
    // den Code hinter Aufruf der Methode zum Einsetzen des Abmelde in der Datenbank } }

Und ihre getan. Es funktioniert für IE, überprüfen Sie bitte für andere Browser. Ähnlich können Sie das Ereignis erkennen, wenn das Fenster durch Drücken der Tastenkombination ALT + F4 geschlossen wird.

0

window.unload wird ausgelöst, wenn wir von einer Seite zu einer anderen navigieren, sowie wenn wir auf die Schließen-Schaltfläche unseres Browsers klicken. Um nur die Schließen-Schaltfläche des Browsers zu erkennen, müssen Sie Flag verwenden.

var inFormOrLink; 

$("a,:button,:submit").click(function() { inFormOrLink = true; }); 

$(":text").keydown(function (e) {  

    if (e.keyCode == 13) { 
     inFormOrLink = true; 
    } 
})/// Sometime we submit form on pressing enter 
$(window).bind("unload", function() { 
    if (!inFormOrLink) { 

     $.ajax({ 
      type: 'POST', 
      async: false, 
      url: '/Account/Update/' 

     }); 
    } 
}) 
Verwandte Themen