Ich versuche, ein text
Eingabefeld als in Javascript erforderlich zu markieren .
<input id="edName" type="text" id="name">
Wenn das Feld zunächst markiert als required
:
<form>
<input id="edName" type="text" id="name" required><br>
<input type="submit" value="Search">
</form>
Wenn der Benutzer versucht zu senden, wird ihm ein Validierungsfehler angezeigt:
Aber jetzt möchte ich das required
Attribut über Javascript auf "Laufzeit" setzen :
<form>
<input id="edName" type="text" id="name"><br>
<input type="submit" value="Search">
</form>
mit dem entsprechenden Skript:
//recommended W3C HTML5 syntax for boolean attributes
document.getElementById("edName").attributes["required"] = "";
Außer wenn ich jetzt abschicke, gibt es keine Validierungsprüfung, keine Blockierung.
Was ist der richtige Weg, um ein boolesches HTML5-Validierungsattribut festzulegen ?
Was ist der Wert des Attributs, fragen Sie?
Das HTML5-Validierungsattribut required
ist wie folgt dokumentiertBoolean
:
4.10.7.3.4 Das
required
AttributDas
required
Attribut ist ein boolesches Attribut . Wenn angegeben, ist das Element erforderlich.
Es gibt viel Handarbeit darüber, wie man ein boolean
Attribut definiert . Die HTML5-Spezifikation stellt fest:
Das Vorhandensein eines booleschen Attributs für ein Element repräsentiert den wahren Wert, und das Fehlen des Attributs repräsentiert den falschen Wert.
Wenn das Attribut vorhanden ist, muss sein Wert entweder die leere Zeichenfolge oder ein Wert sein, bei dem der kanonische Name des Attributs nicht zwischen Groß- und Kleinschreibung unterschieden wird, ohne führende oder nachfolgende Leerzeichen.
Dies bedeutet, dass Sie ein required
boolesches Attribut auf zwei verschiedene Arten angeben können:
edName.attributes.required = ""; //the empty string
edName.attributes.required = "required"; //the attribute's canonical name
Aber was ist der Wert des Attributs wirklich ?
Wenn Sie sich meine jsFiddle dieses Problems ansehen , werden Sie feststellen, dass, wenn das required
Attribut im Markup definiert ist:
<input id="edName" type="text" id="name" required>
Dann ist der Wert des Attributs weder die leere Zeichenfolge noch der kanonische Name des Attributs:
edName.attributes.required = [object Attr]
Das könnte zu einer Lösung führen.
quelle
required="false"
, haben sie jemals eine Vorlage geschrieben, bevor sie den Standard geschrieben haben? Bedingte Attribute sind normalerweise ein Schmerz, es ist viel einfacher, diesen Booleschen Wert einfach in den Attributwert zu setzen ...Antworten:
required
ist eine reflektiertes Eigenschaft (wieid
,name
,type
, und so weiter ), so:... wo
element
ist das eigentlicheinput
DOM-Element, zB:(Nur der Vollständigkeit halber.)
Re:
Das liegt daran,
required
dass dieser Code ein Attributobjekt ist , keine Zeichenfolge.attributes
ist ein,NamedNodeMap
dessen WerteAttr
Objekte sind . Um den Wert eines von ihnen zu ermitteln, müssen Sie sich dessenvalue
Eigenschaft ansehen . Für ein boolesches Attribut ist der Wert jedoch nicht relevant. Das Attribut ist entweder in der Karte vorhanden (wahr) oder nicht vorhanden (falsch).Wenn dies
required
nicht berücksichtigt würde, würden Sie es durch Hinzufügen des Attributs festlegen:... was das Äquivalent von ist
element.required = true
. Sie würden es löschen, indem Sie es vollständig entfernen:... was das Äquivalent von ist
element.required = false
.Aber wir müssen das nicht tun
required
, da es sich widerspiegelt.quelle
Kurzfassung
Lange Version
Nachdem es TJ Crowder gelungen war, auf reflektierte Eigenschaften hinzuweisen, stellte ich fest, dass die folgende Syntax falsch ist :
Sie müssen durchgehen
element.getAttribute
undelement.setAttribute
:Dies liegt daran, dass das Attribut tatsächlich ein spezielles HtmlAttribute- Objekt enthält:
Wenn Sie einen Attributwert auf "true" setzen, setzen Sie ihn fälschlicherweise auf ein String- Objekt und nicht auf das erforderliche HtmlAttribute- Objekt:
Konzeptionell ist die richtige Idee (ausgedrückt in einer getippten Sprache):
Deshalb:
getAttribute(name)
setAttribute(name, value)
existieren. Sie arbeiten daran, den Wert dem darin enthaltenen HtmlAttribute-Objekt zuzuweisen.
Hinzu kommt, sind einige Attribute reflektiert . Dies bedeutet, dass Sie über Javascript besser auf sie zugreifen können:
Was Sie nicht tun möchten, ist fälschlicherweise die
.attributes
Sammlung zu verwenden:Fälle testen
Dies führte zu Tests zur Verwendung eines
required
Attributs, zum Vergleich der über das Attribut zurückgegebenen Werte und der reflektierten Eigenschaftmit Ergebnissen:
Der Versuch,
.attributes
direkt auf die Sammlung zuzugreifen, ist falsch. Es gibt das Objekt zurück, das das DOM-Attribut darstellt:Dies erklärt, warum Sie niemals
.attributes
direkt mit der Sammlung sprechen sollten . Sie bearbeiten nicht die Werte der Attribute, sondern die Objekte, die die Attribute selbst darstellen.Wie wird eingestellt?
Wie kann
required
ein Attribut richtig festgelegt werden? Sie haben zwei Möglichkeiten, entweder die reflektierte Eigenschaft oder die korrekte Einstellung des Attributs:Streng genommen "setzt" jeder andere Wert das Attribut. Die Definition von
Boolean
Attributen schreibt jedoch vor, dass nur die leere Zeichenfolge festgelegt werden muss""
, um true anzuzeigen . Die folgenden Methoden dienen alle zum Festlegen desrequired
Booleschen Attributs:aber benutze sie nicht:
Wir haben bereits gelernt, dass der Versuch, das Attribut direkt festzulegen, falsch ist:
Wie zu löschen erforderlich?
Der Trick beim Entfernen des
required
Attributs besteht darin, dass es leicht versehentlich aktiviert werden kann:Mit den ungültigen Wegen:
Wenn Sie die reflektierte
.required
Eigenschaft verwenden, können Sie auch beliebige "Falsey" -Werte verwenden, um sie auszuschalten, und wahrheitsgemäße Werte, um sie einzuschalten. Aber bleiben Sie zur Klarheit einfach bei wahr und falsch.Wie überprüfe ich
required
?Überprüfen Sie das Vorhandensein des Attributs mithilfe der folgenden
.hasAttribute("required")
Methode:Sie können dies auch über die boolesche reflektierte
.required
Eigenschaft überprüfen :quelle
element
undedName
?edName
(dh Name Input Box) in den generischen zu konvertierenelement
.Was zählt, ist nicht das Attribut, sondern die Eigenschaft , und ihr Wert ist ein Boolescher Wert.
Sie können es mit einstellen
quelle
Und die jquery-Version:
Ich weiß, es steht außer Frage, aber vielleicht findet das jemand hilfreich :)
quelle
prop()
anstelle vonattr()
:)Wenn Sie alle erforderlichen Eingaben, Textbereiche und ausgewählten Elemente vornehmen möchten.
quelle
probier das aus ..
quelle