Versione breve
element.setAttribute("required", ""); //turns required on
element.required = true; //turns required on through reflected attribute
jQuery(element).attr('required', ''); //turns required on
$("#elementId").attr('required', ''); //turns required on
element.removeAttribute("required"); //turns required off
element.required = false; //turns required off through reflected attribute
jQuery(element).removeAttr('required'); //turns required off
$("#elementId").removeAttr('required'); //turns required off
if (edName.hasAttribute("required")) { } //check if required
if (edName.required) { } //check if required using reflected attribute
Versione lunga
Una volta che TJ Crowder è riuscito a evidenziare le proprietà riflesse , ho imparato che la seguente sintassi è sbagliata :
element.attributes["name"] = value; //bad! Overwrites the HtmlAttribute object
element.attributes.name = value; //bad! Overwrites the HtmlAttribute object
value = element.attributes.name; //bad! Returns the HtmlAttribute object, not its value
value = element.attributes["name"]; //bad! Returns the HtmlAttribute object, not its value
È necessario passare attraverso element.getAttribute
e element.setAttribute
:
element.getAttribute("foo"); //correct
element.setAttribute("foo", "test"); //correct
Questo perché l'attributo contiene effettivamente uno speciale oggetto HtmlAttribute :
element.attributes["foo"]; //returns HtmlAttribute object, not the value of the attribute
element.attributes.foo; //returns HtmlAttribute object, not the value of the attribute
Impostando un valore di attributo su "true", lo stai erroneamente impostando su un oggetto String , piuttosto che sull'oggetto HtmlAttribute che richiede:
element.attributes["foo"] = "true"; //error because "true" is not a HtmlAttribute object
element.setAttribute("foo", "true"); //error because "true" is not an HtmlAttribute object
Concettualmente l'idea corretta (espressa in un linguaggio digitato), è:
HtmlAttribute attribute = new HtmlAttribute();
attribute.value = "";
element.attributes["required"] = attribute;
Ecco perché:
getAttribute(name)
setAttribute(name, value)
esistere. Fanno il lavoro sull'assegnazione del valore all'oggetto HtmlAttribute all'interno.
Inoltre, vengono riflessi alcuni attributi . Ciò significa che puoi accedervi più facilmente da Javascript:
//Set the required attribute
//element.setAttribute("required", "");
element.required = true;
//Check the attribute
//if (element.getAttribute("required")) {...}
if (element.required) {...}
//Remove the required attribute
//element.removeAttribute("required");
element.required = false;
Quello che non vuoi fare è utilizzare erroneamente la .attributes
raccolta:
element.attributes.required = true; //WRONG!
if (element.attributes.required) {...} //WRONG!
element.attributes.required = false; //WRONG!
Casi di test
Ciò ha portato a testare l'uso di un required
attributo, confrontando i valori restituiti tramite l'attributo e la proprietà riflessa
document.getElementById("name").required;
document.getElementById("name").getAttribute("required");
con risultati:
HTML .required .getAttribute("required")
========================== =============== =========================
<input> false (Boolean) null (Object)
<input required> true (Boolean) "" (String)
<input required=""> true (Boolean) "" (String)
<input required="required"> true (Boolean) "required" (String)
<input required="true"> true (Boolean) "true" (String)
<input required="false"> true (Boolean) "false" (String)
<input required="0"> true (Boolean) "0" (String)
Tentare di accedere .attributes
direttamente alla raccolta è sbagliato. Restituisce l'oggetto che rappresenta l'attributo DOM:
edName.attributes["required"] => [object Attr]
edName.attributes.required => [object Attr]
Questo spiega perché non dovresti mai parlare .attributes
direttamente con la raccolta. Non stai manipolando i valori degli attributi, ma gli oggetti che rappresentano gli attributi stessi.
Come impostare richiesto?
Qual è il modo corretto per impostare required
un attributo? Hai due scelte, la proprietà riflessa o l'impostazione corretta dell'attributo:
element.setAttribute("required", ""); //Correct
edName.required = true; //Correct
A rigor di termini, qualsiasi altro valore "imposterà" l'attributo. Ma la definizione degli Boolean
attributi impone che dovrebbe essere impostato solo su una stringa vuota ""
per indicare vero . I seguenti metodi funzionano tutti per impostare il valore required
booleano attributo ,
ma non usarli:
element.setAttribute("required", "required"); //valid, but not preferred
element.setAttribute("required", "foo"); //works, but silly
element.setAttribute("required", "true"); //Works, but don't do it, because:
element.setAttribute("required", "false"); //also sets required boolean to true
element.setAttribute("required", false); //also sets required boolean to true
element.setAttribute("required", 0); //also sets required boolean to true
Abbiamo già imparato che provare a impostare l'attributo direttamente è sbagliato:
edName.attributes["required"] = true; //wrong
edName.attributes["required"] = ""; //wrong
edName.attributes["required"] = "required"; //wrong
edName.attributes.required = true; //wrong
edName.attributes.required = ""; //wrong
edName.attributes.required = "required"; //wrong
Come cancellare richiesto?
Il trucco quando si tenta di rimuovere l' required
attributo è che è facile attivarlo accidentalmente:
edName.removeAttribute("required"); //Correct
edName.required = false; //Correct
Con i modi non validi:
edName.setAttribute("required", null); //WRONG! Actually turns required on!
edName.setAttribute("required", ""); //WRONG! Actually turns required on!
edName.setAttribute("required", "false"); //WRONG! Actually turns required on!
edName.setAttribute("required", false); //WRONG! Actually turns required on!
edName.setAttribute("required", 0); //WRONG! Actually turns required on!
Quando usi la .required
proprietà riflessa , puoi anche usare qualsiasi "falso" per disattivarla e valori true per attivarla. Ma attenersi a vero e falso per chiarezza.
Come controllare la per required
?
Verificare la presenza dell'attributo tramite il .hasAttribute("required")
metodo:
if (edName.hasAttribute("required"))
{
}
Puoi anche verificarlo tramite la proprietà booleana riflessa .required
:
if (edName.required)
{
}
required="false"
, hanno mai scritto un modello prima di scrivere lo standard? Gli attributi condizionali di solito sono un dolore, è molto più facile mettere quel booleano nel valore dell'attributo ...