# Schließen vom Browser abfragen



## meste (30. Januar 2012)

Hallo allerseits,

ich versuche verzweifelt den Event NUR beim schließen des Browsers abzufangen ohne Erfolg. Habe es bereits mit

```
<script language="javascript" type="text/javascript">
        function closeIt() {
            Check = confirm("Wollen Sie diese Seite wirklich beenden?");
            if (Check == false) { alert("Nein"); }
            else { alert("Ja"); }
        }
        window.onbeforeunload = closeIt;
    </script>
```
probiert allerdings wird die messageBox immer angezeigt auch beim klick auf einen Link und/oder beim schließen des Browsers bzg. Tab-Reiter. Weiters kommt nach dieser MessageBox eine zweite und eine dritte MessageBox welches eigentlich nicht kommen sollte.

Anhang anzeigen msg1.bmp

Anhang anzeigen msg2.bmp




Wie kann ich auf einfachste Art und Weise eine MessageBox anzeigen und je nach was der User auswählt, entweder das Fenster schließen oder eine ASP-Methode im CodeBehind aufrufen?

Wäre für jede Hilfe sehr dankbar.
Lg
m.e.s.t.e


----------



## CPoly (30. Januar 2012)

meste hat gesagt.:


> ich versuche verzweifelt den Event NUR beim schließen des Browsers abzufangen ohne Erfolg.



Das geht nicht.



meste hat gesagt.:


> allerdings wird die messageBox immer angezeigt auch beim klick auf einen Link und/oder beim schließen des Browsers bzg. Tab-Reiter.



Das ist bei onunload eben so.



meste hat gesagt.:


> eine zweite und eine dritte MessageBox welches eigentlich nicht kommen sollte.



Dann musst du die auch aus deinem Code raus nehmen. Du rufst dort ja explizit "confirm" UND "alert" auf (beide nicht nötig).




meste hat gesagt.:


> Wie kann ich auf einfachste Art und Weise eine MessageBox anzeigen und je nach was der User auswählt, entweder das Fenster schließen oder eine ASP-Methode im CodeBehind aufrufen?



Das ist nicht möglich. Das Event gehört nicht zum Standard und wird überall anders unterstützt. https://developer.mozilla.org/en/DOM/window.onbeforeunload


----------



## meste (30. Januar 2012)

... danke vorerst für deine Antwort aber wei funktioniert es bei MSDN.
Wenn man dort einen Beitrag schreibt und dann mitten drin auf x klickt kommt die meldung.
Wenn man aber auf speichern klickt kommt keine Meldung.

Der Sinn meiner Frage:
Sobald sich der user abmeldet oder den Browser schließt möchte die Spalte "isOnline" in der DB auf false setzen. Beim ordnungsgemäßem Abmelden ist das kein Problem aber wenn der User den Browser schließt würde ich das sonst nicht mitbekommen und der User wäre trotzdem noch online.

Danke und Lg
m.e.s.t.e

Verwende ASP und MS-SQL


----------



## CPoly (30. Januar 2012)

meste hat gesagt.:


> ... danke vorerst für deine Antwort aber wei funktioniert es bei MSDN.
> Wenn man dort einen Beitrag schreibt und dann mitten drin auf x klickt kommt die meldung.
> Wenn man aber auf speichern klickt kommt keine Meldung.



Das ist hier im Forum genauso. Aber da wird nur der Standard Dialog vom Browser angezeigt. Und es wird auch nichts zum Server gesendet.

Das was du vor hast geht so nicht, weil wenn du was zum Server sendest, während das Fenster geschlossen wird, dann kommt das möglicherweise beim Server nicht an (race condition).

Du musst also entweder:

-Eine Verbindung zum Server offen halten (z.B. long polling oder websocket) und wenn diese Verbindung geschlossen wird, ist der Nutzer offline

-Den Nutzer einen Heartbeat senden lassen (z.B. alle 10 Sekunden). Wenn du 10 Sekunden lang nichts von ihm hörst, ist er offline


----------



## meste (30. Januar 2012)

... gibt es vielleicht ein Sample bzgl. Heartbeat wo ich mir den Ansatz anschauen kann.

Danke und Lg


----------



## CPoly (30. Januar 2012)

Sowas in der Art


```
setInterval(function() {
    //Hier AJAX request absetzen
}, 5000);
```


Auf dem Server dann ein Update auf die Tabelle (das ist MySQL spezifisches SQL, musst du auf MS anpassen). Das Update auch bei jedem normalen Seitenaufruf machen.


```
UPDATE users SET last_beat = NOW() WHERE id = 'foo';
```


Alle Nutzer, die online sind


```
SELECT * FROM users WHERE last_beat + INTERVAL 6 SECOND > NOW();
```


----------



## meste (30. Januar 2012)

Hallo CPoly,
danke für das nette Sample, werde mir die vorgehensweise mal umsetzen.

Lg
m.e.s.t.e


----------



## meste (3. Februar 2012)

Hallo cPoly,

habe das so weit fertig, jetzt habe ich noch eine Frage bzw. ein Problem.
Wie oder wo muss ich die Methode "setInterval" aufrufen damit es danach jede 5 Sek. autom wieder aufgerufen wird.
Im Body?

```
<body onLoad="setInterval()" ...>
```

Habe schon einige Erfolgslose Möglichkeiten bereits probiert.

Danke und Lg
m.e.s.t.e


----------



## Parantatatam (3. Februar 2012)

```
<script type="text/javascript">
window.addEventListener('load', function () {
  setIntervall(function () {
    // Request
  }, 5000);
}, false);
</script>
```


----------



## meste (3. Februar 2012)

Hallo crack!

danke für dein Beispiel, habe das jetzt mit ScriptManager, UpdatePanel, und Timer realisiert.
Trotzdem danke für die schnelle Antwort.


Lg
m.e.s.t.e


----------

