Doppelposts mit Safari vermeiden

Dieses Thema im Forum "Web-Programmierung" wurde erstellt von meocrisis, 03.04.2008.

  1. meocrisis

    meocrisis Thread Starter Mitglied

    Beiträge:
    83
    Zustimmungen:
    1
    Mitglied seit:
    01.08.2007
    Hallo,

    ich habe in meinem Forum Probleme die Doppelposts einiger User zu vermeiden. ich würde gerne nach dem submit den submit-button deaktivieren.
    das geht an sich ja ganz einfach mit

    onClick="return SubmitForm(); this.disabled=true;"

    leider geht das aber bei safari nicht. dort wird der button deaktiviert OHNE das Formular abzusenden! ich habe bereits mehrere weg versucht (befehl in die submitform() eingebettet, andere eventhandler probiert) aber nichts bringt wirklich hilfe...

    habt ihr noch einen rat?

    firefox geht prima, IE konnte ich grad nicht testen...verhält sich aber laut Userbeschwerden genauso....

    danke und grüße!

    .meo
     
  2. somunium

    somunium Mitglied

    Beiträge:
    324
    Zustimmungen:
    35
    Mitglied seit:
    16.01.2008
    wie sieht denn die 'SubmitForm()' aus?
    Zumal ich das icht über den Clienten, sondern Serverseitig klären würde.
    Zum Beispiel, indem nur alle 5 Sekunden ein Post möglich ist.
    (Auf die Art und Weise hätte man dann auch eine Art (Grundlage für einen) Spamschutz)
     
  3. wegus

    wegus Mitglied

    Beiträge:
    15.821
    Zustimmungen:
    2.421
    Mitglied seit:
    13.09.2004
    ich würde auch somuniums Vorschlag präferieren, zumal bei dieser Zeile:

    ja nicht ganz klar ist was passieren wird. Wird der Submit ausgeführt ( und somit ein neuer HTTP-Request gestartet oder wird dieser beibehalten und dort der Button disabled? Es mag sein das sowas geht, das das aber nicht sehr robust ist will ich glauben.
     
  4. dms

    dms

    Theoretisch kann das nicht funktionieren und ich glaube nicht dass das in IE, Firefox, Safari oder einem anderen Browser funktionieren kann. Die zweite Anweisung wird niemals ausgeführt, da die erste Anweisung ein return enthält.

    Wenn, dann anders herum.
    Code:
    onClick="this.disabled=true;return SubmitForm();"
    Was jedoch auch nicht 100%ig schön wäre, da im Falle eines Fehlers (wenn SubmitForm() false zurückliefert) der Nutzer das Formular nicht nochmals absenden kann. Der richtige Ort für diese Anweisung wäre durchaus die Funktion SubmitForm(). Dort kannst Du natürlich nicht die Zeile "this.disabled=true" verwenden, da in der Funktion this keine Referenz auf den Button ist.

    Das wäre aber dann nur die halbe Miete. Man kann das Formular i.d.R. ja auch per Enter-Taste absenden und benötigt den Button garnicht. Es sollte also in der Funktion SubmitForm() auch direkt geprüft werden ob das Formular schon abgesendet wurde und bei Zutreffen false zurückgeliefert werden. Das kann man ja leicht umsetzen indem man eine globale Variable setzt/prüft.

    Eine Sicherung im Foren-Code sollte aber mindestens noch dazukommen. Die meisten Foren-Systeme bieten auch eine Flood-Control, so dass man nur alle X Sekunden einen Beitrag einstellen kann. Schau mal in den Einstellungen nach.
     
  5. meocrisis

    meocrisis Thread Starter Mitglied

    Beiträge:
    83
    Zustimmungen:
    1
    Mitglied seit:
    01.08.2007
    Hallo und vielen Dank erstmal für eure Ratschläge!

    bei onClick="this.disabled=true;return SubmitForm();" wird bei einem klick zuerst der button deaktiviert und dann kann das formular nicht mehr abgeschickt werden. hatte das schon so probiert.

    die submitforum() in der bb.js.php sieht so aus:
    HTML:
    function submitForm() {
    
    submitme=1;
    
    formname=document.postform.sb_authorname.value;
    if ((formname.length<1)) {
    alert("You forgot to enter your name");
    submitme=0;
    }
    
    formmail=document.postform.email.value;
    if ((formmail.length<1)) {
    alert("You forgot to enter your email");
    submitme=0;
    }
    formsubject=document.postform.subject.value;
    if ((formsubject.length<1)) {
    alert("You forgot to enter a subject");
    submitme=0;
    }
    
    if (submitme>0) {
    // var message = document.postform.message.value;
    // message = message.replace(/</g,"&lt;");
    // message = message.replace(/>/g,"&gt;");
    // document.postform.message.value = message;
    
    //change the following line to true to submit form
    
    return true;
    
    }else{
    return false;
    }
    }
    
    

    das board ist ein joomlaboard welches leider nicht mehr weiterentwickelt wird. es gibt zwar bereits nachfolger, allerdings ist es ein imenser aufwand das ganze wieder ans design anzupassen. daher wollte ich da selber mal hand anlegen....

    die floodkontrolle ist aktiviert und steht bei 20. das heisst es darf nur alle 20 sekunden gepostet werden...

    grüße!
    meo
     
  6. dms

    dms

    Versuche mal folgendes:
    Code:
    [COLOR="Green"]var submitme=1;[/COLOR]
    function submitForm([COLOR="Green"]button[/COLOR]) {
    
    [COLOR="Green"]var submitButton=button;[/COLOR]
    
    [COLOR="Red"]//submitme=1; <- löschen[/COLOR]
    
    formname=document.postform.sb_authorname.value;
    if ((formname.length<1)) {
    alert("You forgot to enter your name");
    submitme=0;
    }
    
    formmail=document.postform.email.value;
    if ((formmail.length<1)) {
    alert("You forgot to enter your email");
    submitme=0;
    }
    formsubject=document.postform.subject.value;
    if ((formsubject.length<1)) {
    alert("You forgot to enter a subject");
    submitme=0;
    }
    
    if (submitme>0) {
    // var message = document.postform.message.value;
    // message = message.replace(/</g,"&lt;");
    // message = message.replace(/>/g,"&gt;");
    // document.postform.message.value = message;
    
    [COLOR="Green"]window.setTimeout(function(){
       submitButton.disabled=true;
    },50);
    submitme=0;
    [/COLOR]
    
    //change the following line to true to submit form
    return true;
    
    }else{
    return false;
    }
    }
    Und dann so aufrufen:
    Code:
    onClick="return SubmitForm([COLOR="Green"]this[/COLOR]);"
    Was ich geändert habe:
    -Die Variable submitme ist nun global und wird beim Absenden auf 0 gesetzt.
    -Der Funktion wird eine Referenz auf den Button übergeben.
    -Das "Disable" wird per Timeout 50 Millisekunden nach dem Absenden des Formulars ausgeführt. Da Du ja schreibst dass das Formular sonst im Safari nicht abgesendet wird.
     
  7. meocrisis

    meocrisis Thread Starter Mitglied

    Beiträge:
    83
    Zustimmungen:
    1
    Mitglied seit:
    01.08.2007
    ein wahrer Held! Es geht!
    Vielen Dank! Du glaubst gar nicht wieviel Arbeit du mir dadurch erspart hast!

    grüße!
    .meo
     
  8. Darii

    Darii Mitglied

    Beiträge:
    2.065
    Zustimmungen:
    110
    Mitglied seit:
    24.02.2004
    Wäre es nicht wesentlich sinnvoller das ganze auf Serverseite abzufangen?
     
  9. meocrisis

    meocrisis Thread Starter Mitglied

    Beiträge:
    83
    Zustimmungen:
    1
    Mitglied seit:
    01.08.2007
    sag mir wie/ansatz und du bist mein freund! ;o)
    es hat irgndwie schon wieder einer ein doppelpost hinbekommen. obwohl ich doppelposts provozieren wie sau und bekomme keinen mehr hin....

    grüße!
    meo
     
  10. somunium

    somunium Mitglied

    Beiträge:
    324
    Zustimmungen:
    35
    Mitglied seit:
    16.01.2008
    Hm. Kannst Du Posten, wenn JavaScript ausgeschaltet ist?
    Wenn ja, schalte JavaScript aus, und du kannst Doppelposten, wie Du Lustig bist.

    Ums Serverseitig mit PHP zu lösen würde ich bei der Datei und Routine, welche das Posten Regeln am Anfang einfach die aktuelle Zeit in die Session schreiben und prüfen, ob der letzte Aufruf dieser Routine schon n Sekunden her ist. Wenn nicht, bricht das Script einfach ab/gibt ne Meldung raus.
     

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.