# Formular senden - auch mit Input name=submit



## DataFox (27. Dezember 2007)

Hi Leute

ich habe stundenlang probiert und getestet, und bin dabei auf folgendes Problem gekommen:

Angenommen man hat ein HTML-Formular, etwa so:


```
<form action="irgendwo.php" method="post" id="myForm">
<input type="text" name="irgendwas">
<input type="submit" name="submit" value="abschicken">
</form>
```

oder ein anderes Formular, etwa so:


```
<form action="irgendwo.php" method="post" id="myForm">
<input type="text" name="irgendwas">
<input type="hidden" name="submit" value="abschicken">
<input type="submit" name="einbutton" value="abschicken">
</form>
```

dann kann man es mit diesem Code hier *nicht* abschicken:



> var formular = document.getElementById('myForm');
> formular.submit();



Man erhält eine nette Fehlermeldung: "Das Objekt unterstützt diese Eigenschaft oder Methode nicht".

Und jetzt der Hammer: Man darf in einem Formular nirgends ein _*name="submit"*_ benutzen. 

Also ich finde etwas ungünstig, weil ich das schon seit Ewigkeiten so mache und ich immer auf Serverseite den "submit"-Wert auslese um zu wissen ob was abgeschickt wurde. Alle meine Skrippte bauen darauf auf :/

na ja, die Frage ist jetzt - ist JS echt so "schlau" und denkt, ich will beim Formular das Element mit dem namen "submit" ansprechen, wenn ich formular.submit(); mache? schon klar das dieser Button selbst oder das Input-Feld nicht die submit-Methode implementiert hat... hmm...daher wohl die Meldung.

klar ich könnt nu einfach alle meine Skripte anpassen, aber ich will lieber das Problem auf Javascript-Ebene lösen. Ist hier jemand damit vertraut? Kann mir vorstellen das es nichts neues ist.

freue mich über jeden guten Tipp  danke!

Gruß
Laura

-------------------
Edit: Oh, mir fällt da was ein. Was haltet Ihr davon?
Ich durchsuche das Formular nach Elementen die das attribut name=submit haben, und ersetze den name durch irgend etwas sinnloses. z.b. "abcdefg". Dann verpasse ich dem Formular einen Event-Listener für onSubmit. Und der ruft eine Funktion auf, die - wenn der Submit schon gestartet wurde, schnell noch das manipulierte Element in name=submit umbenennt. würde das funktionieren? unabhängig davon ob das jetzt umständlich ist? wie kann ich denn stück-für-stück alle formularelemente durchgehen?


----------



## Matthias Reitinger (27. Dezember 2007)

Hallo,

wenn alle deine Formulare so aufgebaut sind, könntest du einfach die click-Methode des Submit-Buttons aufrufen: form.submit.click(). Wenn auch noch andere Formulare auftreten, könnte man eine Fallunterscheidung verwenden:

```
function submit_form(form) {
  if (form.submit.click) {
    form.submit.click();
  } else {
    form.submit();
  }
}
```

Mit Firefox & Co. klappt auch HTMLFormElement.prototype.submit.call(form);, aber damit wissen andere Browser nicht viel anzufangen.

Grüße,
Matthias


----------



## DataFox (27. Dezember 2007)

Hi,

das mit klick klingt gut. Aber ich kann mich noch dunkel dran erinnern das die click() Methode nicht im FireFox bekannt ist (?)

Theoretisch:
Es gibt manchmal Formulare, bei denen es keinen Submit-Button gibt. Das Formular wird durch irgend eine Javascript-Aktion submittet, z.b. wenn man ein Dropdown ändert (onchange).

Wie könnte man denn alle Input-Elemente zu einem Formular ermitteln?

Gruß
Laura


----------



## Matthias Reitinger (27. Dezember 2007)

Hallo Laura,



DataFox hat gesagt.:


> das mit klick klingt gut. Aber ich kann mich noch dunkel dran erinnern das die click() Methode nicht im FireFox bekannt ist (?)


Probier's doch einfach aus  Mein Firefox kommt damit jedenfalls ganz gut zurecht.



DataFox hat gesagt.:


> Theoretisch:
> Es gibt manchmal Formulare, bei denen es keinen Submit-Button gibt. Das Formular wird durch irgend eine Javascript-Aktion submittet, z.b. wenn man ein Dropdown ändert (onchange).


Und wo liegt jetzt das Problem?



DataFox hat gesagt.:


> Wie könnte man denn alle Input-Elemente zu einem Formular ermitteln?


Z.B. mit form.getElementsByTagName('input')

Grüße,
Matthias


----------



## DataFox (27. Dezember 2007)

Hi

das Problem liegt daran:



> ```
> function submit_form(form) {
> if (form.submit.click) {
> form.submit.click();
> ...



Manchmal gibts auch mehr als einen Submit-Button. Die Frage ist dann auf welchen soll man klicken?
hmm...man könnte ja "loggen" worauf der User zuvor geklickt hat... oder irre ich mich das es manchmal mehrere submit-buttons geben kann? Selbst habe ich das noch nie benutzt, muss ich zugeben. Aber hier im Forum haben wir doch auch "Antworten" und "Vorschau". Also schätze mal das sind 2 Submit-Buttons mit unterschiedlichem value...

Mein Trick hat leider nicht geklappt 


```
for(var i=0; i < document.forms[0].elements.length; i++) {
		if(document.forms[0].elements[i].name == "submit") {
			document.forms[0].elements[i].name = "xyzsubmit";
		}
	}
```

damit wollte ich im Falle eines onSubmit-Events schnell das Formular nach "bösen" Feldern mit name=submit abgrasen und die Felder umbenennen. Aber es scheint als wäre es im Falle eines onSubmit bereits zu spät, bzw. wenn ich das mache und danach mit submit() das Formular abschicken will, kommt der alt-bekannte Fehler, aber der Name des Elements ist trotzdem in xyzsubmit umbenannt.

Nochmal dazu:



> ```
> function submit_form(form) {
> if (form.submit.click) {
> form.submit.click();
> ...



Vielleicht ist es eine Lösung, wenn man hier noch abfragt ob nur ein submit-Element existiert, und wenn ja, dann wird auf dieses ge-"click()"t. Und falls nicht, dann nicht.  in dem Fall dann ein submit(), der aber böse enden kann wenn ein böser böser Strolch ein name=submit verbaut hat. Hab gerade noch einen vielleicht schlauen Einfall:
Wie wär's, wenn man da dynamisch einen submit-button generiert, und diesen dann an-"click()"t? Den könnte man ja absolut positionieren und 100% transparent machen, mit z-index -999 (oder visibility:hidden falls das Ding dann noch "sichtbar" ist).

Was haltet Ihr davon?


----------

