Escolar Documentos
Profissional Documentos
Cultura Documentos
Capítulo 18 ◀◆▶
Formulários e campos de formulários
Mas os seus elementos são parte do DOM como o resto da página, e os elementos
DOM representam campos de formulários suportados um número de propriedades e
eventos que não são presente em outros elementos. Esses tornam possíveis para
inspecionar e controlar os campos inputs com programas JavaScript e fazem coisas
como adicionar funcionalidades para um formulário tradicional ou usam formulários e
campos como blocos de construção em aplicações JavaScript.
Camp os
Muitos tipos de campos usam a tag <input> . Essa tag é um tipo de atributo usado para
estilos do campo. Estes são alguns tipos de <input> comumente usados:
braziljs.github.io/eloquente-javascript/chapters/formularios-e-campos-de-formularios/ 1/18
25/06/2020 Formulários e campos de formulários :: Eloquent Javascript
A interface JavaScript de tais elementos se diferem com o tipo dos elementos. Nós
vamos passar por cima de cada um deles no final do capítulo.
Campos de texto de várias linhas têm a sua própria tag <textarea> , principalmente
porque quando é usando um atributo para especificar um valor de várias linhas poderia
ser inicialmente estranho. A tag <textarea> requer um texto que é usado entre as duas
tags </textarea> , ao invés de utilizar o texto no atributo value.
<textarea>
um
dois
três
</textarea>
Focus
<input type="text">
braziljs.github.io/eloquente-javascript/chapters/formularios-e-campos-de-formularios/ 2/18
25/06/2020 Formulários e campos de formulários :: Eloquent Javascript
document.querySelector("input").focus();
console.log(document.activeElement.tagName);
// → INPUT
document.querySelector("input").blur();
console.log(document.activeElement.tagName);
// → BODY
Para algumas páginas, espera-se que o usuário interaja com um campo de formulário
imediatamente. JavaScript pode ser usado para ser dá um focus nesse campo quando o
documento é carregado, mas o HTML também fornece o atributo autofocus , que faz o
mesmo efeito, mas permite que o navegador saiba o que estamos tentando realizar. Isso
faz com que seja possível o navegador desativar o comportamento quando não é o
caso, por exemplo, quando o usuário tem focado em outra coisa.
Por padrão, a maioria dos tipos de elementos HTML não podem ser focado. Mas você
pode adicionar um atributo tabindex a qualquer elemento, o que tornará focalizável.
Camp os desativados
Todos o campos dos formulários podem ser desabilitadods por meio do seu atributo
disabled , que também existe como uma propriedade no elemento do objeto DOM.
Quando um programa está sendo processado quando uma ação causada por algum
botão ou outro controle, que poderia requerer comunicação com o servidor e assim
braziljs.github.io/eloquente-javascript/chapters/formularios-e-campos-de-formularios/ 3/18
25/06/2020 Formulários e campos de formulários :: Eloquent Javascript
levar um tempo, pode ser uma boa ideia para desabilitar o controle até que a ação
termine. Dessa forma, quando o usuário fica impaciente e clica novamente, eles não
vão acidentalmente repetir a sua ação.
<form action="example/submit.html">
Name: <input type="text" name="name"><br>
Password: <input type="password" name="password"><br>
<button type="submit">Log in</button>
</form>
Um botão com um atributo type do submit, quando pressionado, faz com que o
formulário seja enviado. Pressionando Enter quando um campo de formulário é focado
tem alguns efeitos.
braziljs.github.io/eloquente-javascript/chapters/formularios-e-campos-de-formularios/ 4/18
25/06/2020 Formulários e campos de formulários :: Eloquent Javascript
<form action="example/submit.html">
Value: <input type="text" name="value">
<button type="submit">Save</button>
</form>
Interceptar eventos submit em JavaScript tem vários usos. Podemos escrever código
para verificar se o valores que o usuário digitou faz sentido imediatamente mostrar
uma mensagem de erro, em vez de enviar o formulário. Ou nós podemos desabilitar o
modo regular de enviar o formulário por completo, como no exemplo anterior, temos o
nosso programa que manipula o input , possivelmente usando XMLHttRequest para
enviá-lo para um servidor sem recarregar a página.
Camp os de Texto
Campos criados pela tag <input> com um tipo de text ou password, bem como uma tag
textarea , compartilha uma interface comum. Seus elementos DOM tem uma
propriedade de valor que mantém o seu conteúdo atual como um valor de string. A
definição dessa propriedade para outra seqüência altera o conteúdo dos campos.
Como exemplo, imagine que você está escrevendo um artigo sobre Khasekhemwy,
mas tem alguns problemas para soletrar o seu nome. As seguintes linhas de código até
a tag <textarea> com um manipulador de eventos que, quando você pressionar F2, a
string “Khasekhemwy” é inserida para você.
<textarea></textarea>
<script>
braziljs.github.io/eloquente-javascript/chapters/formularios-e-campos-de-formularios/ 5/18
25/06/2020 Formulários e campos de formulários :: Eloquent Javascript
O evento altera um campo de texto e não dispara cada vez que algo é digitado. Em vez
disso, ele é acionado quando o campo perde o foco após o seu conteúdo foi alterado.
Para responder imediatamente a mudanças em um campo de texto você deve registrar
um manipulador para o evento “input” em vez disso, que é acionado para cada vez que
o usuário digitar um caractere, exclui do texto, ou de outra forma manipula o conteúdo
do campo.
<script>
var text = document.querySelector("input");
var output = document.querySelector("#length");
text.addEventListener("input", function() {
output.textContent = text.value.length;
});
</script>
braziljs.github.io/eloquente-javascript/chapters/formularios-e-campos-de-formularios/ 6/18
25/06/2020 Formulários e campos de formulários :: Eloquent Javascript
Um Checkbox é uma alternância binária simples. Seu valor pode ser extraído ou
alterado por meio de sua propriedade checked, que tem um valor booleano.
<script>
var checkbox = document.querySelector("#purple");
checkbox.addEventListener("change", function() {
document.body.style.background =
checkbox.checked ? "mediumpurple" : "";
});
</script>
A tag <label> é usada para associar uma parte de texto com um campo de entrada. Seu
atributo deverá acessar o id do campo. Clicando no label irá ativar o campo, que se
concentra nele e alterna o seu valor quando é um checkbox ou button radio.
Color:
<script>
var buttons = document.getElementsByName("color");
function setColor(event) {
document.body.style.background = event.target.value;
}
for (var i = 0; i < buttons.length; i++)
buttons[i].addEventListener("change", setColor);
</script>
braziljs.github.io/eloquente-javascript/chapters/formularios-e-campos-de-formularios/ 7/18
25/06/2020 Formulários e campos de formulários :: Eloquent Javascript
útil para manipuladores de eventos como este, que será chamado em diferentes
elementos e precisa de alguma forma de acessar o target atual.
Camp os Select
Os campos select são conceitualmente similares aos radio buttons, eles também
permitem que o usuário escolha a partir de um conjunto de opções. Mas onde um botão
de opção coloca a disposição das opções sob o nosso controle, a aparência de uma tag
<select> é determinada pelo browser.
Campos select também têm uma variante que é mais parecido com uma lista de
checkboxes, em vez de radio boxes. Quando dado o atributo múltiplo, um <select> tag
vai permitir que o usuário selecione qualquer número de opções, em vez de apenas
uma única opção.
<select multiple>
<option>Pancakes</option>
<option>Pudding</option>
<option>Ice cream</option>
</select>
Isto, na maioria dos navegadores, mostra-se diferente do que um campo select não-
múltiplo, que é comumente desenhado como um controle drop-down que mostra as
opções somente quando você abrir.
O atributo size da tag <select> é usada para definir o número de opções que são
visíveis ao mesmo tempo, o que lhe dá o controle sobre a aparência do drop-down. Por
exemplo, definir o atributo size para “3” fará com que o campo mostre três linhas, se
ele tem a opção de multiple habilitado ou não.
Cada tag <option> tem um valor. Este valor pode ser definido com um atributo de
value, mas quando isso não for dado, o texto dentro do option irá contar como o valor
do option . O valor da propriedade de um elemento <select> reflete a opção
selecionada no momento. Para um campo multiple , porém, esta propriedade não
significa muito, uma vez que vai possuir o valor apenas uma das opções escolhidas no
momento.
As tags <option> de um campo <select> pode ser acessada como um objeto de array-
like através de opções propriedade do campo. Cada opção tem uma propriedade
braziljs.github.io/eloquente-javascript/chapters/formularios-e-campos-de-formularios/ 8/18
25/06/2020 Formulários e campos de formulários :: Eloquent Javascript
chamada selected, o que indica se essa opção for selecionada. A propriedade também
pode ser escrita para marcar ou desmarcar uma opção.
<select multiple>
<option value="1">0001</option>
<option value="2">0010</option>
<option value="4">0100</option>
<option value="8">1000</option>
</select> = <span id="output">0</span>
<script>
var select = document.querySelector("select");
var output = document.querySelector("#output");
select.addEventListener("change", function() {
var number = 0;
for (var i = 0; i < select.options.length; i++) {
var option = select.options[i];
if (option.selected)
number += Number(option.value);
}
output.textContent = number;
});
</script>
Um campo file geralmente parece um botão rotulado com algo como “escolha o
arquivo” ou “procurar”, com informações sobre o arquivo escolhido ao lado dele.
<input type="file">
<script>
braziljs.github.io/eloquente-javascript/chapters/formularios-e-campos-de-formularios/ 9/18
25/06/2020 Formulários e campos de formulários :: Eloquent Javascript
Objetos na propriedade files têm propriedades como name (o nome do arquivo), size (o
tamanho do arquivo em bytes), e type (o tipo de mídia do arquivo, como text/plain ou
image/jpeg).
O que ele não tem é uma propriedade que contém o conteúdo do arquivo. Como é um
pouco mais complicado. Desde a leitura de um arquivo do disco pode levar tempo, a
interface terá de ser assíncrona para evitar o congelamento do documento. Você pode
pensar o construtor FileReader como sendo semelhante a XMLHttpRequest, mas para
arquivos.
<script>
var input = document.querySelector("input");
input.addEventListener("change", function() {
Array.prototype.forEach.call(input.files, function(file) {
var reader = new FileReader();
reader.addEventListener("load", function() {
console.log("File", file.name, "starts with",
reader.result.slice(0, 20));
});
reader.readAsText(file);
});
});
</script>
braziljs.github.io/eloquente-javascript/chapters/formularios-e-campos-de-formularios/ 10/18
25/06/2020 Formulários e campos de formulários :: Eloquent Javascript
FileReaders também aciona um evento “error” ao ver o arquivo falhar por algum
motivo. O próprio objeto de erro vai acabar na propriedade de “error” de leitura. Se
você não quer lembrar dos detalhes de mais uma interface assíncrona inconsistente,
você pode envolvê-lo em uma Promise (ver Capítulo 17) como este:
function readFile(file) {
return new Promise(function(succeed, fail) {
var reader = new FileReader();
reader.addEventListener("load", function() {
succeed(reader.result);
});
reader.addEventListener("error", function() {
fail(reader.error);
});
reader.readAsText(file);
});
}
É possível ler apenas parte de um arquivo chamando slice sobre ele e passando o
resultado (uma chamada de um objeto blob) para o leitor de arquivos.
Páginas simples em HTML com um pouco de JavaScript pode ser um ótimo meio para
“mini aplicativos” programas auxiliares -Pequenos ajudantes que automatizam coisas
cotidianas. Ao ligar alguns campos de formulário com os manipuladores de eventos,
você pode fazer qualquer coisa, desde a conversão entre graus Celsius e Fahrenheit às
senhas de computação de uma senha mestra e um nome de site.
Quando tal aplicativo precisa lembrar-se de algo entre as sessões, você não pode usar
variáveis JavaScript uma vez que aqueles são jogados fora a cada vez que uma página
é fechada. Você pode configurar um servidor, conectar-se à Internet, e ter o seu
aplicativo de armazenamento de alguma coisa lá. Vamos ver como fazer isso no
braziljs.github.io/eloquente-javascript/chapters/formularios-e-campos-de-formularios/ 11/18
25/06/2020 Formulários e campos de formulários :: Eloquent Javascript
capítulo 20. Mas isso adiciona um monte de trabalho extra e complexidade. Às vezes é
suficiente apenas para manter os dados no navegador. Mas como?
Você pode armazenar dados de string data de uma forma que ainda continue ao
recarregar a página, colocando-o no objeto localStorage. Este objeto permite-lhe
apresentar valores de strings sob nomes (também strings), como neste exemplo:
localStorage.setItem("username", "marijn");
console.log(localStorage.getItem("username"));
// → marijn
localStorage.removeItem("username");
Um valor em localStorage continua na paǵina até que seja substituído, ele é removido
com removeItem, ou o usuário apaga seus dados locais.
Os navegadores também impor um limite para o tamanho dos dados de um site pode
armazenar em localStorage, tipicamente na ordem de poucos megabytes. Esta
restrição, juntamente com o fato de encher os discos rígidos das pessoas com lixo não é
realmente viável, impede esse recurso de ocupar muito espaço.
O código a seguir implementa uma simples aplicação de anotações. Ele mantém notas
do usuário como um objeto, associando títulos de notas com strings de conteúdo. Este
objeto é codificado como JSON e armazenados em localStorage. O usuário pode
selecionar uma nota de um campo <select> e mudar o texto da nota em um
<textarea> . A nota pode ser adicionado clicando em um botão.
Notes:
<select id="list"></select>
<button onclick="addNote()">new</button><br>
<textarea id="currentnote" style="width: 100%; height: 10em">
</textarea>
<script>
var list = document.querySelector("#list");
function addToList(name) {
var option = document.createElement("option");
option.textContent = name;
braziljs.github.io/eloquente-javascript/chapters/formularios-e-campos-de-formularios/ 12/18
25/06/2020 Formulários e campos de formulários :: Eloquent Javascript
list.appendChild(option);
}
function saveToStorage() {
localStorage.setItem("notes", JSON.stringify(notes));
}
list.addEventListener("change", function() {
current.value = notes[list.value];
});
current.addEventListener("change", function() {
notes[list.value] = current.value;
saveToStorage();
});
function addNote() {
var name = prompt("Note name", "");
if (!name) return;
if (!notes.hasOwnProperty(name)) {
notes[name] = "";
addToList(name);
saveToStorage();
}
list.value = name;
current.value = notes[name];
}
</script>
Sempre que as alterações de dados de notas (quando uma nova nota é adicionado ou
uma nota existente é modificada), a função saveToStorage é chamado para atualizar o
braziljs.github.io/eloquente-javascript/chapters/formularios-e-campos-de-formularios/ 13/18
25/06/2020 Formulários e campos de formulários :: Eloquent Javascript
Quando o usuário adiciona uma nova nota, o código deve atualizar o campo de texto
explicitamente, mesmo que o campo <select> tenha um manipulador de “change” que
faz a mesma coisa. Isso é necessário porque o eventos “change” disparam apenas
quando o usuário altera o valor do campo, e não quando um script executa.
Sumário
HTML pode expressar vários tipos de campos de formulário, tais como text fields,
checkboxes, campos multiple-choice, e file pickers.
Esses campos podem ser inspecionados e manipulados com JavaScript. Eles acionam o
evento “change” quando alterado, o evento “input” quando o texto é digitado, e vários
eventos de teclado. Estes eventos permitem-nos a perceber quando o usuário está
interagindo com os campos. Propriedades como value (para texto e seleção campos) ou
checked (para checkboxes e radio buttons)são usados para ler ou definir o conteúdo do
campo.
braziljs.github.io/eloquente-javascript/chapters/formularios-e-campos-de-formularios/ 14/18
25/06/2020 Formulários e campos de formulários :: Eloquent Javascript
Exercícios
A JavaScript workbench
Construa uma interface que permite que as pessoas a digitem e executem partes do
código JavaScript.
<script>
// Your code here.
</script>
Certifique-se de envolver tanto a chamada para a new function e a chamada para o seu
resultado em um bloco try para que você possa capturar exceções que ela produz.
Neste caso, nós realmente não sabemos que tipo de exceção que estamos procurando,
então pegar tudo.
A propriedade textContent do elemento de saída pode ser usada para preenchê-lo com
uma mensagem de string. Ou, se você quiser manter o conteúdo antigo ao redor, criar
um novo nó de texto usando document.createTextNode e anexá-lo ao elemento.
Lembre-se de adicionar um caractere de nova linha até o fim, de modo que nem todas
as saídas apareçam em uma única linha.
Autoc ompletion
Estender um campo de texto para quando o usuário digitar uma lista de valores
sugeridos é mostrado abaixo do campo. Você tem um conjunto de possíveis valores
braziljs.github.io/eloquente-javascript/chapters/formularios-e-campos-de-formularios/ 15/18
25/06/2020 Formulários e campos de formulários :: Eloquent Javascript
disponíveis e deve mostrar aqueles que começam com o texto que foi digitado. Quando
uma sugestão é clicada, substitua o valor atual do campo de texto com ele.
<script>
// Builds up an array with global variable names, like
// 'alert', 'document', and 'scrollTo'
var terms = [];
for (var name in window)
terms.push(name);
O melhor evento para a atualização da lista de sugestões é “ input ”, uma vez que será
acionado imediatamente quando o conteúdo do campo é alterado.
Em seguida, um loop por meio do array de termos e ver se eles começam com a string
dada. Por exemplo, você poderia chamar indexOf e ver se o resultado é zero. Para cada
seqüência correspondente, adicionar um elemento para as sugestões <div> . Você deve,
provavelmente, cada vez que você inicia começar vazio e atualizar as sugestões, por
exemplo, definindo sua textContent para a string vazia.
Para obter o texto sugestão de um nó DOM, você pode olhar para a sua textContent ou
definir um atributo para armazenar explicitamente o texto quando você cria o
elemento.
Jogo da Vida de Conway é uma simulação simples que cria a “vida” artificial em uma
grade, cada célula, que é ao vivo ou não. Cada geração (virar), as seguintes regras são
aplicadas:
Qualquer célula viva com menos de dois ou mais de três vizinhos vivos morre.
braziljs.github.io/eloquente-javascript/chapters/formularios-e-campos-de-formularios/ 16/18
25/06/2020 Formulários e campos de formulários :: Eloquent Javascript
Qualquer célula viva com dois ou três vizinhos vivos vive para a próxima
geração.
Qualquer célula morta com exatamente três vizinhos vivos se torna um ce ao vivo
Nota-se que estas regras são aplicadas a toda a rede de uma só vez, e não um quadrado
de cada vez. Isso significa que a contagem de vizinhos baseia-se na situação no início
da produção, e mudanças acontecendo com as células vizinhas durante esta geração
não deve influenciar o novo estado de uma dada célula.
Implementar este jogo usando qualquer estrutura de dados que você ache mais
apropriado. Use Math.random para preencher a grade com um padrão aleatório
inicialmente. Exibi-lo como uma grade de campos de checkboxes, com um botão ao
lado dele para avançar para a próxima geração. Quando os controlos de utilizador ou
desmarca as checkboxes , as alterações devem ser incluídos no cálculo a próxima
geração.
<div id="grid"></div>
<button id="next">Next generation</button>
<script>
// Your code here.
</script>
Representando a grade pode ser feito em qualquer das formas mostradas nos capítulos
7 e 15. Contando vizinhos vivos podem ser feitas com dois loops aninhados, percorrer
coordenadas adjacentes. Tome cuidado para não contar as células fora do campo e
ignorar o celular no centro, cujos vizinhos estamos contando.
Fazer alterações em check-boxes em vigor na próxima geração pode ser feito de duas
maneiras. Um manipulador de eventos pode perceber essas alterações e atualizar a
grade atual para refleti-los, ou você poderia gerar uma nova grade a partir dos valores
nas caixas de seleção antes de calcular o próximo turno.
braziljs.github.io/eloquente-javascript/chapters/formularios-e-campos-de-formularios/ 17/18
25/06/2020 Formulários e campos de formulários :: Eloquent Javascript
Se você optar utilizar manipuladores de eventos, você pode querer anexar atributos que
identificam a posição que cada caixa corresponde ao modo que é fácil descobrir qual
célula de mudar.
Para desenhar a rede de caixas de seleção, você ou pode usar um elemento <table>
(olhe o Capítulo 13 ou simplesmente colocá-los todos no mesmo elemento e colocar
<br> (quebra de linha) elementos entre as linhas.
◀◆▶
braziljs.github.io/eloquente-javascript/chapters/formularios-e-campos-de-formularios/ 18/18