Enrico: "history.forward abfangen" und aufzurufende Seite beeinflussen

Hallo,

jetzt beschäftigt mich ein anderes Problem (bzgl. meines Problems, weswegen ich die Seite php.net aufrufen wollte, konnte ich nun auf einer anderen Seite nachlesen und mein Problem lösen).

Ich habe in JavaScript ja das Objekt history mit der Eigenschaft length und den Methoden back(), forward() und go().

Wenn ich nun mit dem Browser eine Seite zurückblättere, dann bin ich bei "history - 1".

Gibt es in JavaScript, ohne Verwendung von jQuery oder (vergleichbarer) anderer Frameworks, die Möglichkeit, das Ereignis history.forward() zu überwachen und VOR dem Vorblättern mit dem String der aufzurufenden Seite weiterzuarbeiten?

Beispiel:

Ich bin auf einer Seite, bei der in der Adreßleiste (gekürzt) "Index.php?H=4&U=1&A=2&M=1&B=GewandungMuetzen2" steht.

Jetzt gehe ich mit dem Browser eine Seite zurück, in der Adreßleiste steht nun "Index.php?H=4&U=1".

Jetzt möchte auf der eben zurückgeblätterten Seite auf den Inhalt von "history + 1" VOR dem Vorblättern zugreifen und mit dem String "Index.php?H=4&U=1&A=2&M=1&B=GewandungMuetzen2" weiterarbeiten, um so die Anzeige der vorzublätternden Seite zu beeinflussen.

Beim ersten Schritt, die URL der Seite, die ich verlassen und von der aus ich eine Seite zurückblättern möchte, zu speichern, war mir diese Seite sehr hilfreich.

Nun muss ich "nur" noch das Ereignis history.forward überwachen.

Geht das mit einfachen Bordmitteln?

Ich hoffe, ihr habt verstanden, was ich erreichen will.

Danke für eure Hilfe.

Gruß,
Enrico

  1. Hallo,

    Das Überwachen der Zurück- und Vorwärts-Aktionen ist nicht direkt möglich. Das wäre höchstens in Single-Page-Apps mit pushState/popstate möglich.

    Du kannst beim Laden der Seite die aktuelle URL (location.href) im sessionStorage speichern und diese auf der Folgeseite auslesen. Das klappt auch bei der Vor-/Zurück-Navigation. Wozu musst du dazu wissen, dass Vorwärts oder Zurück aktiviert wurde?

    Grüße,
    Mathias

    1. Hallo Mathias,

      Wozu musst du dazu wissen, dass Vorwärts oder Zurück aktiviert wurde?

      Auf mein Beispiel bezogen bewirkt die Parameterkombination "A=2", dass ein Artikel zum Warenkorb hinzugefügt wird. Blättere ich zurück, dann habe ich den Parameter nicht in der URL und alles passt. Blättere ich wieder vor, dann habe ich ihn wieder in der URL und der Artikel wird erneut hinzugefügt.

      Wenn ich nun das forward-Ereignis abfangen bzw. steuern könnte, dann könnte ich "A=2" vor dem Vorblättern herausfiltern.

      Gruß,
      Enrico

      1. Hallo,

        Wenn ich nun das forward-Ereignis abfangen bzw. steuern könnte, dann könnte ich "A=2" vor dem Vorblättern herausfiltern.

        Das ist nicht möglich.

        Du löst damit ein altbekanntes Problem auf eine sehr umständliche Weise. Die Standardlösung ist:

        • Die URL-Architektur ist ressourcenbasiert (REST).
        • GET-Requests sollten nichts auf dem Server verändern. Sie haben keine Nebeneffekte.
        • Änderungen an Ressourcen werden mit PUT bzw. POST-Formularen übertragen. PUT-Requests sind idempotent, das heißt hier vollständig, in sich abgeschlossen und wiederholbar. POST-Requests können auch einen Teil einer Ressource verändern.
        • Der Browser warnt den Nutzer automatisch, wenn er nach einer POST-Aktion wie »in den Warenkorb hinzufügen« den Zurück-Button betätigt. Um solche Warnungen zu vermeiden und um das mehrfache Absenden von Formularen zu vermeiden, nutzt man das POST-Redirect-GET-Pattern.

        Grüße,
        Mathias

        1. Hallo Mathias,

          Das ist nicht möglich.

          Das ist ungünstig.

          OK, dann muss ich sehen, wie ich das Problem anders lösen kann, vielleicht geht es auch ganz ohne JavaScript und pushState/popstate.

          Gruß,
          Enrico

          1. Om nah hoo pez nyeetz, Enrico!

            OK, dann muss ich sehen, wie ich das Problem anders lösen kann,

            Indem du auf ein erprobtes Shop-System setzt, das keine bekannten Sicherheitslücken aufweist, das regelmäßig mit updates versorgt wird, ...

            Matthias

            --
            Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Don und Donald Duck.

            1. Hallo Matthias,

              Indem du auf ein erprobtes Shop-System setzt

              Dafür bin ich zu weit vorangeschritten bzw. ist der Sicherheitsaspekt gewahrt (Verschlüsselung sensibler Daten, Verifizierung übergebener Parameter auf schadhaften Code,...).

              Jetzt ist mir aber eine Idee gekommen, um zu verhindern, dass Artikel, unabhängig der URL doppelt angelegt werden.

              Ich habe folgende Abfolge:

              Anzeige Datei 1. Übersicht des Sortiments
                |
                +-> Anzeige Datei 2. Anzeigen der Details zu einem in Datei 1 ausgewählten Artikels
                      |
                      +-> Wiederum Anzeige von Datei 1 mit Ablegen des Artikels im Warenkorb

              Da die Steuerung der Dateien über JavaScript abläuft, könnte ich in Datei 2 vor dem eigentlichen Absenden (erneuten Aufrufen der Datei 1) doch einen Ajax-Aufruf einbauen, der lediglich eine PHP-Datei aufruft, die ihrerseits nur die Session-Variable $_SESSION["ArtikelAblegen"] = true; setzt.

              Datei 1 prüft nun, ob diese Session-Variable besteht. Wenn ja, dann wird der Artikel zum Warenkorb hinzugefügt, die Session-Variable wieder gelöscht und so verhindert, dass ein Artikel nur durch's Vor- und Zurückblättern im Browser mehrfach abgelegt wird. Die Abfrage, ob ein Artikel bereits abgelegt wurde oder nicht, funktioniert bereits.

              Könnte dies funktionieren?

              Gruß,
              Enrico

              1. Jetzt ist mir aber eine Idee gekommen, um zu verhindern, dass Artikel, unabhängig der URL doppelt angelegt werden.

                Doppelt anlegen? Das wäre doch so, als würde ich einen Apfel kaufen und noch einen und noch einen und ...

                Normal wäre doch wohl, eine Anzahl zu nennen und die ggf. zu ändern?

                Also, wenn jemand 1 Stück kauft und ändert dann auf 1 ist doch alles paletti.

                Linuchs

                1. Hallo Linuchs,

                  anders formuliert:

                  ich habe mein Vorhaben jetzt umsetzen können, das verhindert, dass Artikel doppelt im Warenkorb abgelegt werden, egal ob die Seite aufgefrischt oder im Browser vor- und zurückgeblättert wird.

                  Vielleicht kam das nicht ganz raus.

                  Gruß,
                  Enrico

  2. Hi,

    Gibt es in JavaScript, ohne Verwendung von jQuery oder (vergleichbarer) anderer Frameworks, die Möglichkeit, das Ereignis history.forward() zu überwachen und VOR dem Vorblättern mit dem String der aufzurufenden Seite weiterzuarbeiten?

    Du bist auf einer socialnetwork-Seite. Danach gehst Du auf eine Pornoseite. Dann gehst Du zurück auf die socialnetwork-Seite. Und wenn Du dann wieder vorwärts gehst, könnte dann die socialnetworkseite erkennen, daß Du auf eine Pornoseite willst.

    Daraufhin schickt die socialnetworkseite diese Information an alle Deine "Freunde".

    Würdest Du sowas wollen?

    Nun muss ich "nur" noch das Ereignis history.forward überwachen.
    Geht das mit einfachen Bordmitteln?

    hoffentlich nicht.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
    1. Gibt es in JavaScript, ohne Verwendung von jQuery oder (vergleichbarer) anderer Frameworks, die Möglichkeit, das Ereignis history.forward() zu überwachen und VOR dem Vorblättern mit dem String der aufzurufenden Seite weiterzuarbeiten?

      Du bist auf einer socialnetwork-Seite. Danach gehst Du auf eine Pornoseite. Dann gehst Du zurück auf die socialnetwork-Seite. Und wenn Du dann wieder vorwärts gehst, könnte dann die socialnetworkseite erkennen, daß Du auf eine Pornoseite willst.

      Daraufhin schickt die socialnetworkseite diese Information an alle Deine "Freunde".

      Würdest Du sowas wollen?

      Verstehe den Einwand nicht. Er war auf der Pornoseite, ist dann zurückgegangen, um die Pornoseite zu liken, twittern, flattern, instagrammieren oder was man sonst so macht, und geht dann wieder zur Pornoseite.

      Es wissen also eh alle seine drei Freunde, dass die Pornoseite oberscharf ist, und dass er auf Pornos steht, wissen die schon seit sie in der achten Klasse Pornos auf dem Handy getauscht haben.

      Gib's zu, du bist Ü20, womöglich gar Ü30, du alter Sack.

    2. Daraufhin schickt die socialnetworkseite diese Information an alle Deine "Freunde".

      Na und? Die freuen sich über die Info, wann und wie oft du das gemeinsame Video angeschaut hast ;-)

      Und wenn es nicht das gemeinsame Video ist, sind sie froh über jede An- und Aufregung ;-)

      Linuchs

  3. Hallo,

    ich konnte mein Vorhaben jetzt folgendermaßen umsetzen:

    Ich habe folgende Abfolge:

    Anzeige Datei 1. Übersicht des Sortiments
      |
      +-> Anzeige Datei 2. Anzeigen der Details zu einem in Datei 1 ausgewählten Artikels
            |
            +-> Wiederum Anzeige von Datei 1 mit Ablegen des Artikels im Warenkorb

    Datei 2 definiert beim Absenden über Ajax eine Session-Variable, die in der Datei 1 abgefragt wird.

    Besteht diese, dann wird der Artikel hinzugefügt und die Variable gelöscht. Besteht sie nicht, dann wird der Artikel nicht hinzugefügt.

    Dies funktioniert nun unabhängig der Parameter in der Adreßleiste und auch beim Aktualisieren der Seite, was auch wichtig ist.

    Gruß,
    Enrico

    1. Das kapier ich jetzt nicht auf Anhieb. Aber eine Idee hätt ich noch.
      Füg doch einfach den Artikel direkt per AJAX hinzu. Das wird durch kein Reload beeinflusst.