Versão curta
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
Versão longa
Depois que TJ Crowder conseguiu apontar as propriedades refletidas , aprendi que a seguinte sintaxe está errada :
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
Você deve passar element.getAttribute
e element.setAttribute
:
element.getAttribute("foo"); //correct
element.setAttribute("foo", "test"); //correct
Isso ocorre porque o atributo realmente contém um objeto HtmlAttribute especial :
element.attributes["foo"]; //returns HtmlAttribute object, not the value of the attribute
element.attributes.foo; //returns HtmlAttribute object, not the value of the attribute
Ao definir um valor de atributo como "true", você o está definindo por engano como um objeto String , em vez do objeto HtmlAttribute que ele requer:
element.attributes["foo"] = "true"; //error because "true" is not a HtmlAttribute object
element.setAttribute("foo", "true"); //error because "true" is not an HtmlAttribute object
Conceitualmente, a ideia correta (expressa em uma linguagem digitada) é:
HtmlAttribute attribute = new HtmlAttribute();
attribute.value = "";
element.attributes["required"] = attribute;
Isso é por que:
getAttribute(name)
setAttribute(name, value)
existir. Eles fazem o trabalho de atribuir o valor ao objeto HtmlAttribute interno.
Além disso, alguns atributos são refletidos . Isso significa que você pode acessá-los mais facilmente em 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;
O que você não quer fazer é usar a .attributes
coleção por engano :
element.attributes.required = true; //WRONG!
if (element.attributes.required) {...} //WRONG!
element.attributes.required = false; //WRONG!
Casos de Teste
Isso levou a testes em torno do uso de um required
atributo, comparando os valores retornados por meio do atributo e a propriedade refletida
document.getElementById("name").required;
document.getElementById("name").getAttribute("required");
com resultados:
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)
Tentar acessar a .attributes
coleção diretamente é errado. Ele retorna o objeto que representa o atributo DOM:
edName.attributes["required"] => [object Attr]
edName.attributes.required => [object Attr]
Isso explica por que você nunca deve falar .attributes
diretamente com a cobrança. Você não está manipulando os valores dos atributos, mas os objetos que representam os próprios atributos.
Como configurar necessário?
Qual é a maneira correta de definir required
em um atributo? Você tem duas opções, a propriedade refletida ou por meio da configuração correta do atributo:
element.setAttribute("required", ""); //Correct
edName.required = true; //Correct
A rigor, qualquer outro valor "definirá" o atributo. Mas a definição de Boolean
atributos dita que só deve ser definido como a string vazia ""
para indicar true . Todos os métodos a seguir funcionam para definir o atributo required
booleano ,
mas não os use :
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
Já aprendemos que tentar definir o atributo diretamente é errado:
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
Como limpar necessário?
O truque ao tentar remover o required
atributo é que é fácil ativá-lo acidentalmente:
edName.removeAttribute("required"); //Correct
edName.required = false; //Correct
Com as formas inválidas:
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!
Ao usar a .required
propriedade refletida , você também pode usar quaisquer valores "falsey" para desativá-la e valores verdadeiros para ativá-la. Mas apenas se atenha a verdadeiro e falso para maior clareza.
Como verificar para required
?
Verifique a presença do atributo por meio do .hasAttribute("required")
método:
if (edName.hasAttribute("required"))
{
}
Você também pode verificar por meio da propriedade booleana refletida .required
:
if (edName.required)
{
}
required="false"
. Eles escreveram um modelo antes de escrever o padrão? Atributos condicionais geralmente são uma dor, é muito mais fácil simplesmente colocar esse booleano no valor do atributo ...