Como qualquer desenvolvedor experiente de JavaScript sabe, existem muitas maneiras (demais) de fazer a mesma coisa. Por exemplo, digamos que você tenha um campo de texto da seguinte maneira:
<form name="myForm">
<input type="text" name="foo" id="foo" />
Há muitas maneiras de acessar isso em JavaScript:
[1] document.forms[0].elements[0];
[2] document.myForm.foo;
[3] document.getElementById('foo');
[4] document.getElementById('myForm').foo;
... and so on ...
Os métodos [1] e [3] estão bem documentados na documentação do Mozilla Gecko, mas nenhum deles é o ideal. [1] é geral demais para ser útil e [3] requer um ID e um nome (supondo que você esteja postando os dados em um idioma no servidor). Idealmente, seria melhor ter apenas um atributo id ou um nome (ter ambos é um pouco redundante, especialmente se o id não for necessário para qualquer css e aumenta a probabilidade de erros de digitação, etc.).
[2] parece ser o mais intuitivo e amplamente utilizado, mas não o vi mencionado na documentação do Gecko e estou preocupado com a compatibilidade avançada e a compatibilidade entre navegadores (e, é claro, quero ser conforme os padrões possíveis).
Então, qual é a melhor prática aqui? Alguém pode apontar para algo na documentação do DOM ou na especificação do W3C que possa resolver isso?
Observe que estou especificamente interessado em uma solução que não é de biblioteca (jQuery / Prototype).
fonte
Respostas:
Dê ao seu formulário apenas um ID e sua entrada apenas um nome :
Em seguida, a maneira mais compatível com os padrões e menos problemática de acessar seu elemento de entrada é através de:
usar em
.elements["foo"]
vez de just.foo
é preferível, pois o último pode retornar uma propriedade do formulário chamado "foo" em vez de um elemento HTML!fonte
myform.onsubmit = validateForm;
(onde myform é uma variável que faz referência ao elemento do formulário, e validateForm é o nome da sua função de validação ... mas você pode nomeá-lo myFunc se você realmente , realmente querem ) O ponto importante é que elevalidateForm()
retorne false sempre que o formulário não for válido, além de indicar o (s) campo (s) do problema para o usuário. Ele deve retornar true quando os dados do formulário forem validados corretamente, o que permitirá que a ação de envio prossiga.name
atributo, por exemplo, você pode ter<select name="a+b">
ou<input type="text" name="...2">
, que não pode ser referenciado usando a notação javascript .propertyName). A notação explícita [] também permite nomes criados a partir de expressões, por exemplomyCheckBox = document.getElementById("myform").elements["CHK"+i]
. Além disso, estilisticamente, acho [] melhor - deixa claro que essas não são apenas propriedades de um objeto javascript. YMMV.elements
não é um objeto JS normal eelements.foo
ouelements["foo"]
está realmente sendo convertido em elements.namedItem ("foo"). ou seja, você está chamando uma função definida pelo DOM , não referenciando uma propriedade JS!" No-omg-never! " Me vem à mente quando vejo esse método de acesso ao elemento. O problema é que assume que o DOM é uma estrutura de dados normal (por exemplo, uma matriz) em que a ordem dos elementos é estática, consistente ou confiável de qualquer maneira. Sabemos que 99,9999% do tempo, que esse não é o caso. Reordenar ou
input
elementos no formulário, adicionar outroform
à página antes do formulário em questão ou mover o formulário em questão são todos os casos em que esse código é quebrado. História curta: isso é muito frágil. Assim que você adicionar ou mover algo, ele quebrará.Estou com Sergey ILinsky sobre isso:
id
atributo:document.getElementById("myform");
document.getElementById("myform").foo;
Meu principal problema com este método é que o
name
atributo é inútil quando aplicado a um formulário. O nome não é passado para o servidor como parte do POST / GET e não funciona para indicadores de estilo de hash.Na minha opinião, este é o método mais preferível. O acesso direto é o método mais conciso e claro.
Na minha opinião, isso é aceitável, mas mais detalhado do que o necessário. O método nº 3 é preferível.
Por acaso, assisti a um vídeo de Douglas Crockford e ele comentou sobre esse assunto. O ponto de interesse é às -12: 00. Para resumir:
name
atributo é usado para nomear coisas, não para acessá-las. É para nomear coisas como janelas, campos de entrada e tags de âncora.Então aí está. Semanticamente, isso faz mais sentido.
fonte
document.aForm.foo
funciona, mas a especificação HTML5 parece definir claramente a interface de umaHTMLFormElement
que possuicaller getter any namedItem(in DOMString name);
. Mais em whatwg.org/specs/web-apps/current-work/multipage/…input
ouselect
, estou falando sobre o atributo name de aform
. O atributo name de aform
não é passado para o servidor.Para acessar os elementos nomeados colocados em um formulário, é uma boa prática usar o
form
próprio objeto.Para acessar um elemento arbitrário na árvore do DOM que pode ser encontrado ocasionalmente em um formulário, use
getElementById
e os do elementoid
.fonte
Eu prefiro muito o quinto método. Isso é
[5] Use o identificador JavaScript especial this para passar o formulário ou o objeto de campo para a função do manipulador de eventos.
Especificamente, para formulários:
e
Usando essa técnica, a função nunca precisa saber
- a ordem na qual os formulários são definidos na página
- o ID do formulário nem
- o nome do formulário
Da mesma forma, para os campos:
e
Nesse caso, a função nunca precisa saber o nome ou o ID de um campo de peso específico, embora precise saber o nome do campo de limite de peso.
fonte
Não está realmente respondendo à sua pergunta, mas apenas nesta parte:
Você provavelmente precisará ter um
id
atributo em cada campo do formulário de qualquer maneira, para poder associar seu<label>
elemento a ele, assim:Isso é necessário para a acessibilidade (ou seja, se você não associa rótulos e controles de formulário, por que você odeia tanto os cegos?).
É um pouco redundante, embora menos quando você tem caixas de seleção / botões de opção, onde vários deles podem compartilhar a
name
. Por fim,id
ename
são para propósitos diferentes, mesmo que ambos sejam configurados com o mesmo valor.fonte
Isso é um pouco antigo, mas quero acrescentar algo que acho relevante.
(Pretendia comentar um ou dois tópicos acima, mas parece que preciso da reputação 50 e tenho apenas 21 no momento em que escrevo isso. :))
Quero apenas dizer que há momentos em que é muito melhor acessar o elementos de um formulário por nome e não por id. Eu não estou falando sobre o próprio formulário. O formulário, OK, você pode atribuir um ID e depois acessá-lo. Mas se você tiver um botão de opção em um formulário, é muito mais fácil usá-lo como um único objeto (obtendo e definindo seu valor) e você só poderá fazer isso pelo nome, tanto quanto eu saiba.
Exemplo:
Você pode obter / definir o valor verificado do botão de opção R1 como um todo usando
document.mainForm.R1.value
ou
document.getElementById ("mainForm"). R1.value
Portanto, se você quiser ter um estilo unitário, poderá deseja sempre usar esse método, independentemente do tipo de elemento do formulário. Eu, estou perfeitamente confortável em acessar botões de opção por nome e caixas de texto por identificação.
fonte
document.forms.mainForm.R1.value
que é realmente uma boa maneira de evitar o uso do feio e tedioso do tipodocument.getElementById()
Sendo antiquado, sempre usei a sintaxe 'document.myform.myvar', mas recentemente descobri que ela falhou no Chrome (OK no Firefox e IE). Era uma página Ajax (isto é, carregada na propriedade innerHTML de uma div). Talvez o Chrome não tenha reconhecido o formulário como um elemento do documento principal. Eu usei getElementById (sem referenciar o formulário) e funcionou OK.
fonte
.forms
, entãodocument.forms.myform.myvar
Apenas para adicionar a tudo o que foi dito, você pode acessar os
input
s comname
ouid
usando preferencialmente aelements
propriedade do formulário Objeto, porque sem ele você pode obter uma propriedade do formulário chamado "foo" em vez de um elemento HTML. E de acordo com @Paul D. Waite, é perfeitamente aceitável ter nome e identificação.De acordo com o MDN na página HTMLFormElement.elements
fonte
name
campo funciona bem. Ele fornece uma referência aoelements
.parent.children
- Irá listar todos os elementos com um campo de nome do pai.parent.elements
- Listará apenasform elements
comoinput-text, text-area, etc
Nota: Para
.elements
trabalhar, asparent
necessidades precisam ser a<form> tag
. Visto.children
que funcionará em qualquer umHTML-element
- como<div>, <span>, etc
.Boa sorte...
fonte
O formulário 2 está ok e o formulário 3 também é recomendado.
A redundância entre nome e id é causada pela necessidade de manter a compatibilidade. No html 5, alguns elementos (como img, form, iframe e outros) perdem o atributo "name" e é recomendável usar apenas o id para referenciá-los a partir de agora em :)
fonte
Para complementar as outras respostas, document.myForm.foo é o chamado DOM nível 0, que é o caminho implementado pelo Netscape e, portanto, não é realmente um padrão aberto, embora seja suportado pela maioria dos navegadores.
fonte
Confira esta página: https://developer.mozilla.org/En/DOM/Document.getElementsByName
Ele deve ser 'elementos' e deve retornar uma matriz, pois mais de um elemento pode ter o mesmo nome.
fonte
Minha resposta será diferente na pergunta exata. Se eu quiser acessar um determinado elemento especificamente, usarei document.getElementById (). Um exemplo é computar o nome completo de uma pessoa, porque é baseado em vários campos, mas é uma fórmula repetível.
Se eu quiser acessar o elemento como parte de uma estrutura funcional (um formulário), usarei:
É assim que também funciona da perspectiva dos negócios. As alterações no loop acompanham as alterações funcionais no aplicativo e, portanto, são significativas. Eu o aplico principalmente para validação amigável e para evitar chamadas de rede para verificação de dados incorretos. Repito o lado do servidor de validação (e acrescento um pouco mais a ele), mas se eu puder ajudar o lado do cliente do usuário, isso será benéfico para todos.
Para agregação de dados (como a construção de um gráfico de pizza com base nos dados do formulário), uso documentos de configuração e objetos Javascript personalizados. Então, o significado exato do campo é importante em relação ao seu contexto e eu uso document.getElementById ().
fonte
Porque o caso [2]
document.myForm.foo
é um dialeto do Internet Exploere. Então, em vez disso, eu prefirodocument.forms.myForm.elements.foo
oudocument.forms["myForm"].elements["foo"]
.fonte
Eu prefiro Este
fonte