2009-04-15 4 views
0

Bei Verwendung eines Formulars mit vielen Texteingaben sendet WebKit/Safari/Google Chrome das Formular, wenn "Enter" in einem Eingabeelement gedrückt wird . Auch wenn es kein Submit-Eingabeelement gibt und kein onclick Handler registriert ist.Wie kann ich verhindern, dass der WebKit Browser ein Formular abschickt, wenn in einer Eingabe die Eingabetaste gedrückt wird

Siehe zum Beispiel dieses Beispielcode:

<html> 
    <body> 
     <form method="POST" action="."> 
      <ul> 
       <li><input type="text" name="foo" value="<?=rand()?>"/></li> 
       <li><input type="text" name="bar" value="<?=$_POST['foo']?>"/></li> 
      </ul> 
     </form> 
    </body> 
</html> 

Wenn Eingabe in eines der beiden Texteingabeelemente gedrückt wird, wird das Formular abgeschickt.

Da ich mein Formular in JavaScript mit asynchronen HTTP-Anforderungen handle, muss ich dieses Verhalten verhindern. Ich könnte einen benutzerdefinierten Handler für die keypressed Ereignis zu preventDefault und stopPropagation registrieren. Aber es scheint hässlich und ist nicht wirklich praktisch, wenn neue Texteingabeelemente dynamisch hinzugefügt werden.

Antwort

5

Achten Sie auf das Ereignis onsubmit auf dem Formular und geben Sie false zurück.

+0

Verdammt, war ich ein Minute zu langsam –

4

Wenn Sie nicht möchten, dass das Formular gesendet wird, fügen Sie kein < form> -Element ein. Es ist zulässig, freistehende Formularfeldelemente einzubeziehen.

value="<?=$_POST['foo']?>" 

XSS-Schwachstelle. Sie müssen htmlspecialchars() alle Text-zu-HTML-Ausgabe.

+0

+1 Für XSS Hinweis. – Christian

+0

Eine Sache, die Sie beachten sollten, wenn Sie diesen Weg gehen, ist, dass einige Browser nicht versuchen, sich an die Formulardaten zu erinnern> Keine automatische Vervollständigung. – Chris

1

Daniel A. Weiß Recht ist, aber da ich durch die Antwort ein wenig verwirrt bekam, vielleicht sollte klargestellt werden, dass die Rückkehr falsch auf der Veranstaltung sein sollte:

function goWithSubmit(e) 
{ 
    if (e) e.returnValue=false; 
} 
+0

Danke! Ich habe mich gefragt, warum 'onsubmit =" false zurückgeben. "' Hat nicht funktioniert. – Sam