2009-05-18 11 views
4

In ASP.NET-Webforms und ASP 3 (Classic ASP) stieß ich auf ein Problem, bei dem die Benennung des Formular-Senden-Buttons "submit" "Dinge kaputtmachen" würde. Unten ist das gerenderte HTML:Warum benennt das Benennen Ihres HTML-Formulars die Schaltfläche "Senden" um Dinge zu ändern?

Ich sage "Dinge zu brechen", weil ich nicht sicher bin, genau, warum oder was passiert ist. Aber die Symptome waren normalerweise, dass das Drücken der Submit-Taste manchmal nichts tat, d. H. Es funktionierte einfach nicht. Aber manchmal hat es funktioniert.

In der Tat, ich baute nur einen schnellen eine Seite Test mit dem folgenden Code, und einreichenden hat gut funktioniert:

<form id="form1" runat="server"> 
<div> 
    <asp:TextBox ID="txtTest" runat="server" /> 
    <asp:Button ID="Submit" runat="server" Text="Submit" /> 
</div> 
</form> 

Aber, in der Vergangenheit, dieses Problem aufgetreten ist, und die Umbenennung auf die Schaltfläche immer ließ das Symptom weggehen.

Also weiß jeder HTML/HTTP/Browser-Experte aus irgendeinem Grund, warum die Einstellung id = "submit" auf einer Submit-Schaltfläche Probleme verursachen würde?

EDIT

diese SO comment "Eintragen" ist ein reserviertes Schlüsselwort scheint darauf hinzudeuten. Aber warum interferieren die Attribute "id" oder "name"? Und wie wird dieses "reservierte" Keyword so umgesetzt, dass es zu Konflikten kommt?

Dank wieder

Antwort

15

Das Element form hat eine Methode namens submit, hat aber auch die Formularelemente in der Form als Mitglieder.

Wenn Sie eine Schaltfläche in der Form submit haben, können Sie darauf zugreifen, indem Sie document.form1.submit verwenden. Da es sich jedoch um den gleichen Namen wie die submit Methode handelt, gibt es keine Möglichkeit mehr, auf diese Methode zuzugreifen. Wenn Sie die Methode verwenden, um das Formular zu senden, wird das nicht mehr funktionieren.

Zum Beispiel, wenn Sie auf eine Schaltfläche, die das Formular mit Javascript vorträgt, das nicht funktioniert:

<input type="button" name="submit" onclick="this.form.submit();" value="try" /> 

Wenn die Taste, um die submit Methode zu verwenden versucht, es wird stattdessen eine Referenz auf sich selbst erhalten (und eine Fehlermeldung, wenn versucht wird, sie aufzurufen, da die Schaltfläche keine Funktion ist).

+0

hmm ... interessant. Prost! – andy

+0

Wow! Es scheint, als gäbe es alle Arten von Namens-Raum-Kollisionen zwischen dem DOM und Namen, die dann für Formularsteuerelemente deklariert werden. –

+0

Namensraum Kollision ist die eine Sache, für die Javascript am häufigsten kritisiert wird.Es gibt praktisch nichts, was vor versehentlicher (oder vorsätzlicher) Überlastung geschützt ist. Aus diesem Grund empfiehlt es sich, verschiedene Schemata zum Schutz vor Kollisionen zu verwenden, z. B. das Umhüllen aller Objekte in der eigenen Sperrschicht oder das Aufrufen aller Top-Level-Objekte als etwas Originellem. –

0

Der Code-behind, dass generiert, die Sie Ereignisse für das Objekt binden, können Sie sich auf die Werte benannt Basis angegeben.

2

Ich würde Sie dringend bitten, von allen reservierten Wörtern von Javascript DOM fern zu bleiben. verwende "mein" vor allem, was du definierst, oder $, oder etwas anderes, das eindeutig nicht in Konflikt mit den reservierten Wörtern steht, die du versehentlich überladen und Chaos verursachen kannst.

+0

Aber dann haben Sie schreckliche Namen auf der Serverseite, nein? Sind die DOM-Namen Groß-/Kleinschreibung? Könnte man Kollisionen einfach vermeiden, indem man den ersten Buchstaben groß schreibt? –

+0

Ich schätze, das hängt davon ab, was man als "schreckliche Namen" bezeichnet. HTML ist nicht die Groß-/Kleinschreibung und selbst wenn es offiziell wäre, würde der Browser diese Art von Fehlern mit Sicherheit verzeihen. Auf jeden Fall gibt es viele nicht-hässliche Wege, um sicherzustellen, dass die Namen deine eigenen sind, aber ja ... du musst ein wenig flexibel mit deinen ästhetischen Urteilen sein. :) –

+0

HTML ist nicht case-sensitive, aber JavaScript ist - ist das DOM kein JS-Objekt? –

0

Verwenden Sie einfach onsubmit wenn proble in Form Vorlage

<form id="form1" runat="server" onsubmit="this.submit()"> 
<div> 
    <asp:TextBox ID="txtTest" runat="server" /> 
    <asp:Button ID="Submit" runat="server" Text="Submit" Type="submit"/> 
</div> 
</form>