Estou tentando marcar uma text
caixa de entrada como necessária em Javascript.
<input id="edName" type="text" id="name">
Se o campo for inicialmente marcado como required
:
<form>
<input id="edName" type="text" id="name" required><br>
<input type="submit" value="Search">
</form>
quando o usuário tenta enviar, recebe um erro de validação:
Mas agora quero definir o required
atributo em "tempo de execução" , por meio de Javascript:
<form>
<input id="edName" type="text" id="name"><br>
<input type="submit" value="Search">
</form>
com o script correspondente:
//recommended W3C HTML5 syntax for boolean attributes
document.getElementById("edName").attributes["required"] = "";
Exceto quando eu enviar agora, não há verificação de validação, nem bloqueio.
Qual é a maneira correta de definir um atributo booleano de validação HTML5 ?
Qual é o valor do atributo, você pergunta?
O required
atributo de validação HTML5 é documentado como Boolean
:
4.10.7.3.4 O
required
atributoO
required
atributo é um atributo booleano . Quando especificado, o elemento é obrigatório.
Há muitas dúvidas sobre como definir um boolean
atributo. As notas de especificação do HTML5:
A presença de um atributo booleano em um elemento representa o valor verdadeiro e a ausência do atributo representa o valor falso.
Se o atributo estiver presente, seu valor deve ser a string vazia ou um valor que não faz distinção entre maiúsculas e minúsculas ASCII para o nome canônico do atributo, sem nenhum espaço em branco à esquerda ou à direita.
Isso significa que você pode especificar um atributo required
booleano de duas maneiras diferentes:
edName.attributes.required = ""; //the empty string
edName.attributes.required = "required"; //the attribute's canonical name
Mas qual é realmente o valor do atributo ?
Ao examinar meu jsFiddle sobre esse problema , você notará que, se o required
atributo estiver definido na marcação:
<input id="edName" type="text" id="name" required>
Então, o valor do atributo não é a string vazia, nem o nome canônico do atributo:
edName.attributes.required = [object Attr]
Isso pode levar a uma solução.
fonte
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 ...Respostas:
required
é uma propriedade reflectiu (comoid
,name
,type
, e tal), da seguinte forma:... onde
element
está oinput
elemento DOM real , por exemplo:(Apenas para completar.)
Ré:
Isso porque
required
nesse código há um objeto de atributo , não uma string;attributes
é umNamedNodeMap
cujos valores sãoAttr
objetos . Para obter o valor de um deles, você deve olhar suavalue
propriedade. Mas para um atributo booleano, o valor não é relevante; o atributo está presente no mapa (verdadeiro) ou ausente (falso).Portanto, se
required
não fosse refletido, você o configuraria adicionando o atributo:... que é equivalente a
element.required = true
. Você o limparia removendo-o inteiramente:... que é equivalente a
element.required = false
.Mas não temos que fazer isso
required
, pois é refletido.fonte
Versão curta
Versão longa
Depois que TJ Crowder conseguiu apontar as propriedades refletidas , aprendi que a seguinte sintaxe está errada :
Você deve passar
element.getAttribute
eelement.setAttribute
:Isso ocorre porque o atributo realmente contém um objeto HtmlAttribute especial :
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:
Conceitualmente, a ideia correta (expressa em uma linguagem digitada) é:
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:
O que você não quer fazer é usar a
.attributes
coleção por engano :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 refletidacom resultados:
Tentar acessar a
.attributes
coleção diretamente é errado. Ele retorna o objeto que representa o atributo DOM: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: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 atributorequired
booleano ,mas não os use :
Já aprendemos que tentar definir o atributo diretamente é errado:
Como limpar necessário?
O truque ao tentar remover o
required
atributo é que é fácil ativá-lo acidentalmente:Com as formas inválidas:
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:Você também pode verificar por meio da propriedade booleana refletida
.required
:fonte
element
eedName
?edName
(ou seja, caixa de entrada de nome) em genéricoelement
.O que importa não é o atributo, mas a propriedade , e seu valor é um booleano.
Você pode configurá-lo usando
fonte
E a versão do jquery:
Eu sei que está além de qualquer dúvida, mas talvez alguém ache isso útil :)
fonte
prop()
vez deattr()
:)Se você deseja fazer todas as entradas, textarea e selecionar os elementos necessários.
fonte
experimente isso ..
fonte