RobRobson: POST und Javascript

Hallo,

Gibts eine Möglichkeit dem Konstrukt:

  
<form action='foo.php$id=5' method=post>  
<input type=button name=do9 value='tue Aktion 9'>  
</form>  

das beim klick auf den Button die Anweisung an den Server übergibt mit der ID5 die Aktion 9 durchzuführen noch einen Wert aus Javascript mitgeben?

Hintergrund ist, ich hab dieses Konstrukt oben in einer langen Liste und diese muss gescrollt werden. Ich will nun nach dem wieder aufrufen der Seite (nach dem der Server Aktion 9 an ID5 durchgeführt hat) wieder zu dem Punkt wo zum Klickzeitpunkt war hinscrollen.

Mit Javascript onClick='url+aktion+scroll' alles kein Problem. Aber wie kann ich das in das Konstrukt von oben einbinden?

Danke und viele Grüße,
Rob

  1. Wenn ich dich richtig Verstanden habe, möchtest du nach Entgegennahme deines POST-Requests wieder auf diese Seite weiterleiten, und dort wieder zu dieser Position hinscrollen.

    Ich würde einen Textanker vor dem input-Button hinlegen, und dem Formular ein hidden-Input-Field dazugeben, in dem als Value der Name des Textankers gespeichert ist. Danach muss der Server in den Redirect URL den Anker hinten mit "#namedesankers" dranhängen.

    Grüße,
    Gerhard

    1. Hallo

      Ich würde einen Textanker vor dem input-Button hinlegen

      Leider hatte es mit Ankern nicht funktioniert. Hatte alles schon mit Ankern verbombt und die dann an die URL angehangen. Aber irgendwas hatte da nicht funktioniert. da ich sowohl an den get-string als auch im Post verschiedenste parameter anhänge. wollte einer der Browser den Anker nicht mehr schlucken. Oder so, ich weiß es nicht mehr genau. Ging auf jeden Fall nicht.

      Danke und Grüße,
      Rob

      1. Hi,

        Ich würde einen Textanker vor dem input-Button hinlegen

        Leider hatte es mit Ankern nicht funktioniert. Hatte alles schon mit Ankern verbombt und die dann an die URL angehangen. Aber irgendwas hatte da nicht funktioniert. da ich sowohl an den get-string als auch im Post verschiedenste parameter anhänge. wollte einer der Browser den Anker nicht mehr schlucken. Oder so, ich weiß es nicht mehr genau. Ging auf jeden Fall nicht.

        Dann hast du es wohl falsch gemacht.

        MfG ChrisB

        --
        RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
        1. Hi,

          Dann hast du es wohl falsch gemacht.

          Der Anker an sicht hatte funktioniert. Anker haben aber das Problem von Browsern am obersten Rand angezeigt zu werden. Das ist Mist wenn man in Listen herum editiert. Darum will ich immer nur den momentanen Wert des Scrollbalkens nehmen und beim reload wieder einstellen.

          Viele Grüße,
          Rob

          1. Hello,

            Der Anker an sicht hatte funktioniert. Anker haben aber das Problem von Browsern am obersten Rand angezeigt zu werden. Das ist Mist wenn man in Listen herum editiert.

            Es kommt doch ganz darauf an, wo Du das Sprungziel einbaust in die Seite.

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
            1. Hello,

              Der Anker an sicht hatte funktioniert. Anker haben aber das Problem von Browsern am obersten Rand angezeigt zu werden. Das ist Mist wenn man in Listen herum editiert.

              Es kommt doch ganz darauf an, wo Du das Sprungziel einbaust in die Seite.

              Was hat die Positionierung des Ankers damit zutun das Browser ihn am obersten Rand anzeigen?

              Wenn die erste Zeile (wegen Seitenkopf) bei etwa 300px anfängt wird sie nach dem Sprung nicht wieder bei 300px angezeigt sondern bei 0px am oberen Rand weil der Browser Anker so anspringt das sie ganz oben sind. Was sollte ich dagegen tun. Und was spricht gegen meine Scrollbalken-copy-paste Variante?

              Danek und viele Grüße,
              Rob

              1. Hello,

                Der Anker an sicht hatte funktioniert. Anker haben aber das Problem von Browsern am obersten Rand angezeigt zu werden. Das ist Mist wenn man in Listen herum editiert.

                Es kommt doch ganz darauf an, wo Du das Sprungziel einbaust in die Seite.

                Was hat die Positionierung des Ankers damit zutun das Browser ihn am obersten Rand anzeigen?

                Wenn die erste Zeile (wegen Seitenkopf) bei etwa 300px anfängt wird sie nach dem Sprung nicht wieder bei 300px angezeigt sondern bei 0px am oberen Rand weil der Browser Anker so anspringt das sie ganz oben sind. Was sollte ich dagegen tun. Und was spricht gegen meine Scrollbalken-copy-paste Variante?

                Ich sehe schon, Du hast noch keine Experimente gemacht mit Fragment und Sprungziel.

                Mach dich frei von der Vorstellung, dass das Sprungziel in der Seite dort gesetzt werden muss, wo die Änderung stattgefunden hat. Das kann auch drei Zeilen darüber eingebaut werden (oder auch darunter), je nachdem, wo die geänderte Zeile steht in der Gesamtseite.

                Und das Fragment kann immer gleich heißen.

                Z.B. bei Verwendung von PHP auf dem Server...

                example.org/list.php?delete=33#go

                Und das Gegenstück dazu (das Sprungziel) baust Du dann nach Abarbeitung des Requests z.B. in Zeile 30 in die Response ein.

                Liebe Grüße aus dem schönen Oberharz

                Tom vom Berg

                --
                 ☻_
                /▌
                / \ Nur selber lernen macht schlau
                http://bergpost.annerschbarrich.de
                1. Hi und guten Morgen :)

                  Mach dich frei von der Vorstellung, dass das Sprungziel in der Seite dort gesetzt werden muss, wo die Änderung stattgefunden hat. Das kann auch drei Zeilen darüber eingebaut werden (oder auch darunter), je nachdem, wo die geänderte Zeile steht in der Gesamtseite.

                  Warum sollte man so ein unstringentes Verhalten einführen?
                  Und zu dem hast Du entweder mein Beispiel nicht gelesen oder es gibt eine so simple Lösung die ich einfach nicht erkennen kann (Wald->lauter Bäume und so).

                  Wenn ich anfange das Sprunziel auf diese Weise zu modifizieren hole ich mir verschiedenste Probleme an board, da seien nur mal Zeilenhöhe und Abarbeitungslogik zu nennen aber um mal bei meinem Beispiel zu bleiben ich müsste auch anfangen in Dateien rumzuwerkeln die absolut mit dem Dateninhalt und rumgespringe nichts zu tun haben. Zb. die Datei die das Seitengerüst baut (den angesprochenen Seitenkopf von 300px) da die erste Zeile bei 300px anfängt müsste der Anker ergo darüber eingebaut werden, darüber ist aber nur der Seitenkopf und der wird über völlig andere Dateien erzeugt.

                  Naja, ich habs jetzt über ajax gemacht.

                  Schönen Freitag noch und Viele Grüße,
                  Rob

                  (Wetter soll super werden 16-18 Grad :D)

    2. Hello,

      Wenn ich dich richtig Verstanden habe, möchtest du nach Entgegennahme deines POST-Requests wieder auf diese Seite weiterleiten, und dort wieder zu dieser Position hinscrollen.

      Ich würde einen Textanker vor dem input-Button hinlegen, und dem Formular ein hidden-Input-Field dazugeben, in dem als Value der Name des Textankers gespeichert ist. Danach muss der Server in den Redirect URL den Anker hinten mit "#namedesankers" dranhängen.

      Das braucht der Server nicht. Der Server muss nicht redirecten. Es muss nur generell bei der Start-URL bereits ein Anker vorhanden sein. Und wenn der Server in die Response dann ein passendes Sprungziel dazu einbaut, wird der Client auch dieses in den Viewport rollen. Wenn kein Ziel vorhanden ist, wird der Client den Anker ignorieren.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Das braucht der Server nicht. Der Server muss nicht redirecten. Es muss nur generell bei der Start-URL bereits ein Anker vorhanden sein. Und wenn der Server in die Response dann ein passendes Sprungziel dazu einbaut, wird der Client auch dieses in den Viewport rollen. Wenn kein Ziel vorhanden ist, wird der Client den Anker ignorieren.

        Ich hatte das imho dynamischer konzipiert, beim Eingang wusste der Server ja auf welcher Zeile eine Änderung stattgefunden hat. (als Anker verwendet ich die ID der Zeile). Also konnte er ganz gezielt nur auf der Zeile den Anker zeichnen auf die der Client dann auch springen sollte. Fand ich besser als jedesmal einige 1000 Anker zu zeichnen ob sie gebraucht würden oder nicht.

        Viele Grüße,
        Rob

        1. Hello,

          Ich hatte das imho dynamischer konzipiert, beim Eingang wusste der Server ja auf welcher Zeile eine Änderung stattgefunden hat. (als Anker verwendet ich die ID der Zeile). Also konnte er ganz gezielt nur auf der Zeile den Anker zeichnen auf die der Client dann auch springen sollte. Fand ich besser als jedesmal einige 1000 Anker zu zeichnen ob sie gebraucht würden oder nicht.

          Das hast Du falsch verstanden.

          Es gibt immer nur maximal einen Anker in der Seite, der für den Request von Interesse ist. Und das Script auf dem Server, das doch augenscheinlich benötigt wird, baut das Sprungziel bei der Response dann immer in die passende Zeile der Tabelle oder Liste ein.

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
  2. Hallihallo!

    Ich sehe für das, was Du vorhast, generell zwei verschiedene Möglichkeiten:

    1. Reagiere auf das submit- Ergeignis des Formulars (onsubmit), und frage in der entsprechenden Funktion die aktuelle Scrollposition ab. Diese kannst Du als zusätzlichen Parameter an das action- Attribut anhängen. In der erzeugten Antwort- Seite müsstest Du dann onload wieder eine Javascript- Funktion aufrufen, die diesen Extra- Parameter ausliest und zu der gefundenen Position scrollt.

    Das ist aber meiner Meinung nach ziemlich von hinten durch die Brust ins Auge und würde im alltäglichen Gebrauch der Seite eher verwirren als nützen.

    Einfacher wäre da

    1. Sende das Formular per Xmlhttp- Request. Das hat zur Folge, dass erst gar keine neue Seite "aufgerufen" wird, die Antwort vom Server kannst Du dann per Javascript weiterverarbeiten, wie es Dir beliebt (beispielsweise aktualisierte Daten darstellen, oder ein simples window.alert('erledigt!'); )
      Die aktuelle Scrollposition bleibt dabei unberührt.

    Genau dafür wurde das Xmlhttp- Objekt mMn "erfunden".

    Ich greife für sowas gerne auf JQuery zurück, weil es mir dabei extrem viel Arbeit abnimmt und man seine Scripte mit relativ wenig Aufwand sehr variabel halten kann.
    Das ist allerdings Geschmackssache, und man kann das Alles auch selber bauen, ohne riesiges Framework (wozu Dir auch Viele raten würden).
    Der Vollständigkeit halber sei auch erwähnt, dass es natürlich auch andere Javascript- Frameworks gibt.

    Wichtig ist eigentlich nur das Stichwort "xmlhttp", oder umgangssprachlich "AJAX".

    Beste Grüsse,
        Tobias Hahner