<form></form>
<form>...</form>
<form action="cadastrar-usuario.php"> <!-- que "página" receberá os dados -->
<label>Nome: <input name="nome" type="text"></label>
<label>E-mail: <input name="email" type="email"></label>
<label>Senha: <input name="senha" type="password"></label>
<button type="submit">Enviar</button> <!-- veja no próximo -->
<button type="reset">Limpar</button> <!-- slide -->
</form>
type="submit"
envia os dados para
o servidor:
<button type="submit">
<img src="icone.png">Cadastrar <!-- podemos colocar ícones nos botões =) -->
</button>
type="reset"
volta os valores digitados para
seus value
padrão
<button type="reset">Limpar</button> <!-- muito pouco usado -->
<button type="button">Ver detalhes</button>
<!-- type="button" é o padrão se fora de <form> -->
required
para marcar um campo como
de preenchimento obrigatório:
<form action="verifica-login.php">
<label>Digite seu login:
<input type="email" id="email" required>
<input type="password" id="senha" minlength="5" required>
</label>
<button type="submit">Entrar</button>
</form>
::: result
:::
Tipo | Código HTML | Exemplo |
---|---|---|
Campo obrigatório | <input required> |
<form></form> |
Quantidade de caracteres | <input maxlength="2"> |
|
Número mínimo | <input type="number" min="5"> |
<form></form> |
Número máximo | <input type="number" max="10"> |
<form></form> |
Padrão | <input pattern="[0-9]{4}"> |
<form></form> |
Desabilitar | <input disabled> |
createElement
insertBefore
, replaceChild
, appendChild
insertAdjacentElement
innerHTML
createRange
+ createContextualFragment
removeChild
, remove
innerHTML
de um elemento da árvore
para uma string descrevendo uma estrutura HTML (já vimos):
let listaEl = document.querySelector('#lista-de-dados');
listaEl.innerHTML = '<li><img src="images/d12.png"></li>';
// 1. Solicitamos ao document a criação de um elemento
// 2. Configuramo-lo (atributos, id, classes etc.)
// 3. Inserimo-lo na árvore
// 1. Solicitamos ao document a criação de um elemento
let ovelhaEl = document.createElement('img'); // cria uma <img>
// 2. Configuramos (atributos, id, classes etc.)
ovelhaEl.src = 'images/ovelho-pixel.png'; // <img src="...">
ovelhaEl.classList.add('raca'); // <img src="..." class="...">
Resultado:
<img src="images/ovelho-pixel.png" class="raca">
appendChild
: será o filho mais à direitainsertBefore
: será o filho que vem logo antes de outroreplaceChild
: substituirá um filho existenteinsertAdjacentElement
: insere em posição especificadapai.appendChild
:
let containerEl = document.querySelector('#ovelhas');
let novaOvelhaEl = document.createElement('img');
novaOvelhaEl.src = 'img/ovelho-pixel.png';
containerEl.appendChild(novaOvelhaEl);
appendChild
::: figure .figure-slides.clean.flex-align-center.medium-width.invert-colors-dark-mode
:::
insertBefore
::: figure .figure-slides.clean.flex-align-center.medium-width.invert-colors-dark-mode
:::
replaceChild
::: figure .figure-slides.clean.flex-align-center.medium-width.invert-colors-dark-mode
:::
appendChild
, insertBefore
e replaceChild
insertAdjacentElement
insertAdjacentElement(posicao, elemento)
posicao
permite especificar a relação do novo elemento:
const posicao = 'beforebegin'
const pai = document.querySelector('p')
pai.insertAdjacentElement(posicao, elemento)
<!-- beforebegin -->
<p>
<!-- afterbegin -->
conteúdo do parágrafo
<!-- beforeend -->
</p>
<!-- afterend -->
document.createTextNode('texto aqui')
:
let bodyEl = document.querySelector('body');
let pEl = document.createElement('p');
let txtEl = document.createTextNode('Olá parágrafo!'); // <--
bodyEl.appendChild(pEl); // põe o parágrafo em <body>
pEl.appendChild(txtEl); // põe o texto no <p>
elemento.innerHTML
:
let bodyEl = document.querySelector('body');
let pEl = document.createElement('p');
bodyEl.appendChild(pEl); // põe o parágrafo em <body>
pEl.innerHTML = 'Olá parágrafo!'; // define o innerHTML do <p>
containerEl.removeChild(el)
ou, para remover todos, innerHTML
:
<main>
<img id="urso" src="img/urso.png">
</main>
let mainEl = document.querySelector('main')
let imgEl = document.querySelector('#urso')
mainEl.removeChild(imgEl) // remove a <img id="urso">
// ou...
imgEl.remove() // idem, porém não funciona on IE
// ou...
mainEl.innerHTML = '' // remove tudo o que estiver em <main></main>
innerHTML
de um elemento
const listaEl = document.querySelector('ul')
const pessoa = {
nome: 'Coutinho'
}
const template = `
<div class="usuario">
<li>${pessoa.nome}</li>
</div>
`
listaEl.innerHTML += template
document.createRange().createContextualFragment(template)
:
const listaEl = document.querySelector('ul')
const pessoa = {
nome: 'Coutinho'
}
const template = `
<div class="usuario">
<li>${pessoa.nome}</li>
</div>
`
// em vez disto, vamos criar um 'fragmento' antes
//listaEl.innerHTML += template
const usuarioEl = document.createRange()
.createContextualFragment(template)
// onclick no <li> que foi criado:
usuarioEl.querySelector('li')
.addEventListener('click', funcao)
// em vez de innerHTML, appendChild:
listaEl.appendChild(usuarioEl)
README.md
tarefas
(contendo 2 inicialmente)tarefas.js
você deve representar um vetor de tarefas
insereTarefaNaPagina
que
cria elementos referentes a 1 tarefa (repare o singular)
e os coloca na páginatarefas
insereTarefaNaPagina
, passando o objeto
da nova tarefa como argumentovalue
do campo de texto para que o usuário possa
inserir a próxima tarefacampoDeTextoEl.focus()
#filtro-de-categoria
,
tornar as tarefas visualmente esmaecidas (alterne a classe retida-no-filtro
)Esta é uma oportunidade de exercitar métodos de programação funcional de vetores