Stefan: onbeforeunload Aktion in Abhängigkeit von der neuen URL

Hallo zusammen!

Ich suche nach einer Möglichkeit innerhalb eines Eventhandlers für onbeforeunload abzufragen, zu welcher URL gewechselt werden soll.

Hintergrund: Ich habe einen Online-Shop, bei dem der Warenkorb erhalten bleibt, solange man sich im Shop bewegt. Verlässt man den Shop, z.b. um auf andere Teile der Seite zu kommen, wird der Warenkorb geleert. Damit dem Benutzer das nicht versehentlich passiert, möchte ich ihn vorher fragen, wenn er die Shopseiten verlässt.

Hat jemand eine Idee?

Schöne Grüße,
Stefan

  1. Hi,

    Ich suche nach einer Möglichkeit innerhalb eines Eventhandlers für onbeforeunload abzufragen, zu welcher URL gewechselt werden soll.

    installiere bei Deinen Besuchern eine Webcam, die Dich darüber informiert.

    Hintergrund: Ich habe einen Online-Shop, bei dem der Warenkorb erhalten bleibt, solange man sich im Shop bewegt. Verlässt man den Shop, z.b. um auf andere Teile der Seite zu kommen, wird der Warenkorb geleert.

    Das ist absolut unmöglich, da es in HTTP so etwas wie "verlassen" nicht gibt.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
  2. Hallo,

    Ich suche nach einer Möglichkeit innerhalb eines Eventhandlers für onbeforeunload abzufragen, zu welcher URL gewechselt werden soll.

    Gibt es nicht.
    Da musst du das Konzept ändern: Bei einem Klick auf einen externen Link muss onbeforeunload gesetzt werden, vorher nicht. (Oder umgekehrt: Bei internen Links muss es gelöscht werden.) Oder eine globale Variable setzen, in der gespeichert wird, ob gerade ein externer Link geklickt wurde. (Vielleicht gibts auch noch bessere Ansätze.)

    Hintergrund: Ich habe einen Online-Shop, bei dem der Warenkorb erhalten bleibt, solange man sich im Shop bewegt. Verlässt man den Shop, z.b. um auf andere Teile der Seite zu kommen, wird der Warenkorb geleert.

    Warum? Session-ID geht flöten?

    Mathias

    1. Hallo,

      Oder eine globale Variable setzen, in der gespeichert wird, ob gerade ein externer Link geklickt wurde.

      Das sähe dann etwa so aus:

      <script>  
      [code lang=javascript]function onbeforeunload () {  
       if (window.externerLink) {  
        window.externerLink = false;  
        return "Wirklich verlassen?";  
       }  
      };  
      function handleClick (e) {  
       e = e || window.event;  
       var target = e.target || e.srcElement;  
       if (target.nodeName.toLowerCase() == "a" && target.href.match(/^http:\/\/nichtshop/)) {  
        window.externerLink = true;  
       } else {  
        window.externerLink = false;  
       }  
      }  
      function onload () {  
       document.body.onclick = handleClick;  
      }
      

      </script>

      <p>
      <a href="./shop">shop</a>
      <a href="http://nichtshop.example.org">nicht shop</a>
      </p>[/code]

      Alle click-Ereignisse werden zentral beim body-Element überwacht. Durch das Event-Bubbling kommen alle click-Ereignisse dort vorbei und können behandelt werden. Es wird abgefragt, bei welchem Element das Ereignis passiert ist (Event-Target), ob es sich um einen Link handelt und ob es sich um einen externen Link handelt. Diese Prüfung mit einem regulären Ausdruck ist hier nur angedeutet, das müsste man an die örtlichen Gegebenheiten anpassen (der reguläre Ausdruck bedeutet: Link-URI beginnt mit der Zeichenkette »http://nichtshop«). Wenn es sich um einen externen Link handelt, wird eine globale Variable gesetzt. Die wird im anschließend gefeuerten beforeunload-Handler abgefragt. Nur wenn vorher also ein externer Link geklickt wurde, wird ein Meldungsfenster ausgegeben.

      Jetzt nur zur Verdeutlichung des Konzeptes.

      Mathias

      1. Hi,

        Alle click-Ereignisse werden zentral beim body-Element überwacht. Durch das Event-Bubbling kommen alle click-Ereignisse dort vorbei und können behandelt werden. Es wird abgefragt, bei welchem Element das Ereignis passiert ist (Event-Target), ob es sich um einen Link handelt und ob es sich um einen externen Link handelt. Diese Prüfung mit einem regulären Ausdruck ist hier nur angedeutet, das müsste man an die örtlichen Gegebenheiten anpassen (der reguläre Ausdruck bedeutet: Link-URI beginnt mit der Zeichenkette »http://nichtshop«). Wenn es sich um einen externen Link handelt, wird eine globale Variable gesetzt. Die wird im anschließend gefeuerten beforeunload-Handler abgefragt. Nur wenn vorher also ein externer Link geklickt wurde, wird ein Meldungsfenster ausgegeben.

        Das hilft aber nicht, wenn die Seite durch Eintippen einer URL in die Adreßzeile oder durch Aufruf eines Bookmarks/Favoriten oder ähnlichem verlassen wird.

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
        1. Hallo,

          Das hilft aber nicht, wenn die Seite durch Eintippen einer URL in die Adreßzeile oder durch Aufruf eines Bookmarks/Favoriten oder ähnlichem verlassen wird.

          Ja, klar - bei Paranoia kann man die Sache natürlich umkehren und von Blacklist auf Whitelist umschalten.

          Mathias

  3. Hi,

    Ich suche nach einer Möglichkeit innerhalb eines Eventhandlers für onbeforeunload abzufragen, zu welcher URL gewechselt werden soll.

    Es geht Dich schlicht nichts an, zu welcher Seite ein Benutzer sich hinbewegt, wenn er Deine Seite nicht mehr sehen will.
    Daher gibt es diese Möglichkeit _natürlich_ nicht.

    Hintergrund: Ich habe einen Online-Shop, bei dem der Warenkorb erhalten bleibt, solange man sich im Shop bewegt. Verlässt man den Shop, z.b. um auf andere Teile der Seite zu kommen, wird der Warenkorb geleert. Damit dem Benutzer das nicht versehentlich passiert,

    wäre es sinnvoll, den Warenkorb nicht zu leeren, nur weil eine andere Seite aufgerufen wird.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  4. Hallo,

    Verlässt man den Shop, z.b. um auf andere Teile der Seite zu kommen, wird der Warenkorb geleert.

    dann lass den Unsinn doch einfach bleiben.

    Ciao,
     Martin

    --
    Auf jeden Menschen auf der ganzen Welt entfallen statistisch gesehen etwa 3000 Spinnen, wie Wissenschaftler jetzt festgestellt haben.
    Wer will meine haben? Denn ich will sie bstimmt nicht.