RichClient: window.stop()

Hi,

wenn ich im Firefox vom onunload-Event aus die Funktion window.stop() aufrufe, geht gar nichts mehr. In der Statusleiste steht noch "Angehalten", zum Weiterarbeiten muß der Browser neu gestartet werden.

Hat jemand eine Idee, wie man das Laden einer Seite anders verhindern kann?

Gruß
RichClient

  1. Es ist nicht der Sinn eines Browsers, das Laden einer Seite zu verbieten. Du kannst im onunload bestenfalls ein Popup öffnen und dem Benutzer solcherart auf den Geist gehen.

    Grundsätzlich: Jeder Versuch, das Verhalten des Benutzers durch etwas anderes als semantisches Markup, logische Seitenstrukturen und lohnenswerte Inhalte zu beeinflussen, ist von vorneherein zum Scheitern verurteilt.

    Gruß, LX

    --
    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: Unusual
    X-Please-Search-Archive-First: Absolutely Yes
    1. Es ist nicht der Sinn eines Browsers, das Laden einer Seite zu verbieten. Du kannst im onunload bestenfalls ein Popup öffnen und dem Benutzer solcherart auf den Geist gehen.

      Bestenfalls? Schlimmstenfalls. Das werden Popup-Blocker natürlich verhindern.

      Mathias

    2. Es ist nicht der Sinn eines Browsers, das Laden einer Seite zu verbieten. Du kannst im onunload bestenfalls ein Popup öffnen und dem Benutzer solcherart auf den Geist gehen.

      Grundsätzlich: Jeder Versuch, das Verhalten des Benutzers durch etwas anderes als semantisches Markup, logische Seitenstrukturen und lohnenswerte Inhalte zu beeinflussen, ist von vorneherein zum Scheitern verurteilt.

      Gruß, LX

      Vielen Dank für diese hilfreiche Antwort. Die Web-Anwendung, für die diese Möglichkeit geschaffen werden soll, kennt hingegen nur einen wohldefinierten Anwenderkreis (Intranet) und nicht die ganze Welt. Ziel ist es auch nicht, das Web-Verhalten des Anwenders negativ zu beeinflussen, sondern Bugs der Frameworks (Struts, JSF) zu umgehen. Sollte der Anwender z.B. einmal versehentlich oder aus Gewohnheit den Zurück-Button des Browsers verwenden und die Anwendung dadurch zum Absturz bringen, kann das auch kaum in seinem Sinne sein.

      Beim IE geht das über document.execCommand('Stop'); ziemlich reibungslos. Nur der Firefox verhält sich nicht so, wie es hier bei SelfHTML dokumentiert ist :(

      Hat noch jemand einen konstruktiven Beitrag?

      Gruß
      RichClient

      1. Die Web-Anwendung, für die diese Möglichkeit geschaffen werden soll, kennt hingegen nur einen wohldefinierten Anwenderkreis (Intranet) und nicht die ganze Welt.

        Das ist schön, aber leider nicht die Bedingungen, unter denen JS i.d.R. läuft und entsprechend sicher sein muss. D.h. es darf in JS keine Möglichkeiten geben, Aktionen zu unterbinden, die ein verlassen der Seite verhindern können. Das der IE sowas anbietet ist nicht verwunderlich, eine seiner spezialitäten sind Sicherheitslücken.

        Und so wie du es beschreibst (ein Fehler in deiner Anwendung) wäre es ein sinnvollerer Weg, wenn du verhinderst das ein reload möglich ist (z.b. mit einer Weiterleitungseite).

        Struppi.

        1. »» Die Web-Anwendung, für die diese Möglichkeit geschaffen werden soll, kennt hingegen nur einen wohldefinierten Anwenderkreis (Intranet) und nicht die ganze Welt.

          Das ist schön, aber leider nicht die Bedingungen, unter denen JS i.d.R. läuft und entsprechend sicher sein muss. D.h. es darf in JS keine Möglichkeiten geben, Aktionen zu unterbinden, die ein verlassen der Seite verhindern können. Das der IE sowas anbietet ist nicht verwunderlich, eine seiner spezialitäten sind Sicherheitslücken.

          Und so wie du es beschreibst (ein Fehler in deiner Anwendung) wäre es ein sinnvollerer Weg, wenn du verhinderst das ein reload möglich ist (z.b. mit einer Weiterleitungseite).

          Struppi.

          Wenn das meine Anwendung wäre, hätte ich diese Probleme nicht ...

          Ein Refacturing in Deinem Sinne ist sicherlich auf lange Sicht sinnvoll und notwendig, im Moment jedoch, weil wesentlich aufwendiger, nicht machbar.

          Im Übrigen ist das eine Sicherheitslücke in beiden Browsern, nur das ich beim Firefox so ohne Aufwand die Seite total lahmlegen kann, während ich beim IE wenigstens noch aus dem Dilemma rauskomme.

          Gruß
          RichClient

          1. Wenn das meine Anwendung wäre, hätte ich diese Probleme nicht ...

            Ein Refacturing in Deinem Sinne ist sicherlich auf lange Sicht sinnvoll und notwendig, im Moment jedoch, weil wesentlich aufwendiger, nicht machbar.

            Eine Ausgabe in der Form:
            Status: 302 Found
            Location: http://anderseite.de

            ist aufwendig?

            Im Übrigen ist das eine Sicherheitslücke in beiden Browsern, nur das ich beim Firefox so ohne Aufwand die Seite total lahmlegen kann, während ich beim IE wenigstens noch aus dem Dilemma rauskomme.

            Ja eben, FF stürzt ab, der IE macht irgendwas ... in dem Fall, für dich und dein Vorhaben genau das Richtige, aber in einer anderen Situation tut sich hier evtl. die Lücke für den Angreifer auf.

            Struppi.

            1. »» Wenn das meine Anwendung wäre, hätte ich diese Probleme nicht ...
              »»
              »» Ein Refacturing in Deinem Sinne ist sicherlich auf lange Sicht sinnvoll und notwendig, im Moment jedoch, weil wesentlich aufwendiger, nicht machbar.

              Eine Ausgabe in der Form:
              Status: 302 Found
              Location: http://anderseite.de

              ist aufwendig?

              Das wäre nicht aufwendig. Die Anwendung ist jedoch hoch komplex. Eine Umleitung bedeutet evtl. hohen Datenverlust und ist nicht erwünscht.

              »» Im Übrigen ist das eine Sicherheitslücke in beiden Browsern, nur das ich beim Firefox so ohne Aufwand die Seite total lahmlegen kann, während ich beim IE wenigstens noch aus dem Dilemma rauskomme.

              Ja eben, FF stürzt ab, der IE macht irgendwas ... in dem Fall, für dich und dein Vorhaben genau das Richtige, aber in einer anderen Situation tut sich hier evtl. die Lücke für den Angreifer auf.

              Struppi.

              Das sind philosophische Betrachtungen. Eines ist sicher: Einen Absturz zum Schutz gegen Angriffe haben die Programmierer des Firefox nicht beabsichtigt - hoffentlich.

              Gruß
              RichClient

              1. » Eine Ausgabe in der Form:
                » Status: 302 Found
                » Location: http://anderseite.de
                »
                » ist aufwendig?

                Das wäre nicht aufwendig. Die Anwendung ist jedoch hoch komplex. Eine Umleitung bedeutet evtl. hohen Datenverlust und ist nicht erwünscht.

                also ich weiß nicht. Wenn man zurück geht stürzt die Anwendung ab, wenn du eine Weiterleitung einbaust droht Datenverlust. Es scheint diese Anwendung ist nicht für den Einsatz im Netz gedacht. Schließlich sind die Dinge die du ansprichst völlig normal Vorgänge, mit der jede Webanwendung umgehen muss.

                Struppi.

                1. »» » Eine Ausgabe in der Form:
                  »» » Status: 302 Found
                  »» » Location: http://anderseite.de
                  »» »
                  »» » ist aufwendig?
                  »»
                  »» Das wäre nicht aufwendig. Die Anwendung ist jedoch hoch komplex. Eine Umleitung bedeutet evtl. hohen Datenverlust und ist nicht erwünscht.

                  also ich weiß nicht. Wenn man zurück geht stürzt die Anwendung ab, wenn du eine Weiterleitung einbaust droht Datenverlust. Es scheint diese Anwendung ist nicht für den Einsatz im Netz gedacht. Schließlich sind die Dinge die du ansprichst völlig normal Vorgänge, mit der jede Webanwendung umgehen muss.

                  Struppi.

                  Wie bereits gesagt: Es geht um eine fehlerhafte Programmierung der Anwendung und Bugs in den Frameworks, die clientseitig wesentlich schneller zu umgehen wären als serverseitig zu beheben, wenn window.stop() so arbeiten würde wie beschrieben. Wie sie serverseitig auch für den Anwender befriedigend zu beheben sind, weiß ich genau, deswegen war es auch nicht meine Frage hier im Forum. Wenn Du weißt, wie man das JavaScript des Firefox wieder zum Laufen bekommt, nachdem es sich entschlossen hat, "Angehalten" zu sein: Immer her mit der Lösung!

                  Gruß
                  RichClient

                  1. Wie bereits gesagt: Es geht um eine fehlerhafte Programmierung der Anwendung und Bugs in den Frameworks, die clientseitig wesentlich schneller zu umgehen wären als serverseitig zu beheben, wenn window.stop() so arbeiten würde wie beschrieben.

                    window.stop() unterbricht den Ladevorgang der Seite und so arbeitet es doch auch.

                    Struppi.

                    1. »» Wie bereits gesagt: Es geht um eine fehlerhafte Programmierung der Anwendung und Bugs in den Frameworks, die clientseitig wesentlich schneller zu umgehen wären als serverseitig zu beheben, wenn window.stop() so arbeiten würde wie beschrieben.

                      window.stop() unterbricht den Ladevorgang der Seite und so arbeitet es doch auch.

                      Struppi.

                      Echt? Mein Mini-Beispiel sagt da etwas anderes:

                      <html>
                      <head>
                      <title>Test</title>
                      <script type="text/javascript">

                      seitenwechselOk=false;

                      function seitenwechselPruefen() {
                          if (!seitenwechselOk) {
                            window.stop();
                          }

                      </script>
                      </head>
                      <body onunload="seitenwechselPruefen();">
                        <a href="javascript:seitenwechselOk=true;history.back();">
                          zur&uuml;ck
                        </a>
                        <br>
                      </body>
                      </html>

                      Wenn ich die Seite zum Beispiel mit dem Back-Button verlassen will, geht das nicht, mit dem Zurück-Link ist es kein Problem. Habe ich jedoch einmal den Zurück-Button betätigt, arbeitet der Zurück-Link nicht mehr. Warum?

                      Gruß
                      RichClient

                      1. Echt? Mein Mini-Beispiel sagt da etwas anderes:

                        Du willst nicht das laden einer Seite unterbrechen, sondern das verlassen einer Seite und dafür ist window.stop() nicht zuständig.

                        Wenn ich die Seite zum Beispiel mit dem Back-Button verlassen will, geht das nicht, mit dem Zurück-Link ist es kein Problem. Habe ich jedoch einmal den Zurück-Button betätigt, arbeitet der Zurück-Link nicht mehr. Warum?

                        Vielleicht weil dann die history leer ist.

                        Struppi.

                        1. »» Echt? Mein Mini-Beispiel sagt da etwas anderes:

                          Du willst nicht das laden einer Seite unterbrechen, sondern das verlassen einer Seite und dafür ist window.stop() nicht zuständig.

                          »»

                          Bist Du der Anwalt von Firefox? ;)

                          »» Wenn ich die Seite zum Beispiel mit dem Back-Button verlassen will, geht das nicht, mit dem Zurück-Link ist es kein Problem. Habe ich jedoch einmal den Zurück-Button betätigt, arbeitet der Zurück-Link nicht mehr. Warum?

                          Vielleicht weil dann die history leer ist.

                          Nein, wäre außerdem schon wieder ein Bug. Statt history.back() kann ich hinschreiben, was ich will: Der Firefox macht keinen Mucks mehr. Tot, absolut tot. Das JavaScript scheint danach deaktiviert zu sein.

                          Struppi.

                          Gruß
                          RichClient

                          1. » »» Echt? Mein Mini-Beispiel sagt da etwas anderes:
                            »
                            » Du willst nicht das laden einer Seite unterbrechen, sondern das verlassen einer Seite und dafür ist window.stop() nicht zuständig.
                            »»

                            Bist Du der Anwalt von Firefox? ;)

                            Wieso? Hast du eine andere Dokumentation, wo etwas anderes steht?

                            » Vielleicht weil dann die history leer ist.

                            Nein, wäre außerdem schon wieder ein Bug. Statt history.back() kann ich hinschreiben, was ich will: Der Firefox macht keinen Mucks mehr. Tot, absolut tot. Das JavaScript scheint danach deaktiviert zu sein.

                            Oder du hast eine Endlosschleife.

                            Struppi.

                            1. »» » »» Echt? Mein Mini-Beispiel sagt da etwas anderes:
                              »» »
                              »» » Du willst nicht das laden einer Seite unterbrechen, sondern das verlassen einer Seite und dafür ist window.stop() nicht zuständig.
                              »» »»
                              »»
                              »» Bist Du der Anwalt von Firefox? ;)

                              Wieso? Hast du eine andere Dokumentation, wo etwas anderes steht?

                              Ich werde meine Beobachtung an SelfHTML weitergeben. Dann hab ich in Kürze die richtige Dokumentation.

                              »» » Vielleicht weil dann die history leer ist.
                              »»
                              »» Nein, wäre außerdem schon wieder ein Bug. Statt history.back() kann ich hinschreiben, was ich will: Der Firefox macht keinen Mucks mehr. Tot, absolut tot. Das JavaScript scheint danach deaktiviert zu sein.

                              Oder du hast eine Endlosschleife.

                              "Angehalten" klingt nicht wirklich nach Endlosschleife. Aber vielleicht liefert der Firefox auch eine falsche Meldung. Das wäre dann wieder ein Bug. Man sollte mit dem Opera arbeiten, der stürzt wenigstens bei "window.stop()" standardmäßig und dokumentationsgerecht ab. Der IE macht es richtig: Der kennt den Befehl nicht und gibt eine entsprechende Fehlermeldung aus.

                              Struppi.

                              Gruß
                              RichClient

                              1. »» Bist Du der Anwalt von Firefox? ;)
                                »
                                » Wieso? Hast du eine andere Dokumentation, wo etwas anderes steht?

                                Ich werde meine Beobachtung an SelfHTML weitergeben. Dann hab ich in Kürze die richtige Dokumentation.

                                http://de.selfhtml.org/javascript/objekte/window.htm#stop

                                Entspricht einem Klick auf den "Stop"-Button im Browser. Der Ladevorgang einer Seite wird dadurch abgebrochen.

                                Da steht deutlich, der Ladevorgang.

                                »
                                » Oder du hast eine Endlosschleife.

                                "Angehalten" klingt nicht wirklich nach Endlosschleife. Aber vielleicht liefert der Firefox auch eine falsche Meldung. Das wäre dann wieder ein Bug. Man sollte mit dem Opera arbeiten, der stürzt wenigstens bei "window.stop()" standardmäßig und dokumentationsgerecht ab. Der IE macht es richtig: Der kennt den Befehl nicht und gibt eine entsprechende Fehlermeldung aus.

                                Jetzt weiß ich nicht wovon du sprichst, ich hab dein Skript nicht ausprobiert. Aber angehalten klingt für mich nach einer möglichen Endlosschleife, wieso nicht für dich? Wieso steht in der Doku, dass der Browser abstürzen soll?

                                Das der IE den Befehl nicht kennt, wußte ich bis Dato noch nicht, weil ich window.stop() noch nie verwendet habe und mir auch keinen Verwendungszweck vorstellen kann.

                                Struppi.

                              2. » Oder du hast eine Endlosschleife.

                                "Angehalten" klingt nicht wirklich nach Endlosschleife.

                                OK, ich hab's mal ausprobiert.

                                Das ist wohl ein Bug.

                                Da du window.stop() an einer falschen Stelle benutzt. Du rufst window.stop() auf, bevor eine Seite geladen wird. onunload feuert ja bevor die aktuelle Seite entfernt wird. Anscheinend kommt aber der Aufruf trotzdem während der Phase ziwschen dem entfernen der alten Seite und dem aufbauen der neuen Seite an. Ein Zeichen dafür ist, dass die alte Seite entfernt wurde und keine neue aufgebaut wird.

                                Du bewegst dich also in Räumen, wo noch nie ein Mensch vor dir war ;-). In einer Art Zwischenzeit. Das die Browser da unkontrolliert reagieren, mag nicht verwundern. Sollte aber nicht sein, ist es also ein Bug. Der Aufruf von window.stop() sollte an der stelle gar nichts machen.

                                Struppi.

                                1. »» » Oder du hast eine Endlosschleife.
                                  »»
                                  »» "Angehalten" klingt nicht wirklich nach Endlosschleife.

                                  OK, ich hab's mal ausprobiert.

                                  Das ist wohl ein Bug.

                                  Da du window.stop() an einer falschen Stelle benutzt. Du rufst window.stop() auf, bevor eine Seite geladen wird. onunload feuert ja bevor die aktuelle Seite entfernt wird. Anscheinend kommt aber der Aufruf trotzdem während der Phase ziwschen dem entfernen der alten Seite und dem aufbauen der neuen Seite an. Ein Zeichen dafür ist, dass die alte Seite entfernt wurde und keine neue aufgebaut wird.

                                  Sofort nach "onunload" sollte die neue Seite ja schon unterwegs sein, was dann mit "window.stop()" abzubrechen wäre. Zumindest war das meine Idee. Das die Idee so schlecht nicht war, sieht man daran, daß es beim IE funktioniert:

                                  <html>
                                  <head>
                                  <title>Test</title>
                                  <script type="text/javascript">

                                  seitenwechselOk=false;

                                  function seitenwechselPruefen() {
                                      if (!seitenwechselOk) {
                                        document.execCommand('Stop');
                                        history.forward();
                                      }
                                    }

                                  </script>
                                  </head>
                                  <body onunload="seitenwechselPruefen();">
                                    <a href="javascript:seitenwechselOk=true;history.back();">
                                      zur&uuml;ck
                                    </a><br>
                                  </body>
                                  </html>

                                  Du bewegst dich also in Räumen, wo noch nie ein Mensch vor dir war ;-). In einer Art Zwischenzeit. Das die Browser da unkontrolliert reagieren, mag nicht verwundern. Sollte aber nicht sein, ist es also ein Bug. Der Aufruf von window.stop() sollte an der stelle gar nichts machen.

                                  Doch, er sollte das machen, was ich gerne hätte. Dann wäre mein Problem gelöst :)

                                  Struppi.

                                  Gruß
                                  RichClient

      2. Hi,

        Vielen Dank für diese hilfreiche Antwort. Die Web-Anwendung, für die diese Möglichkeit geschaffen werden soll, kennt hingegen nur einen wohldefinierten Anwenderkreis (Intranet) und nicht die ganze Welt.

        In den Tipps fuer Fragende, die gelesen zu haben du bestaetigt hast, steht ausdruecklich drin, dass du auf solche Sonderbedingungen bitte gleich hinweisen solltest.

        MfG ChrisB

        --
        „This is the author's opinion, not necessarily that of Starbucks.“