window
window
window
window.alert('mensagenzinha feia 🔥'); // retorna undefined
window.confirm('janela pedindo confirmacao'); // retorna true, false
window.prompt('escreva seu nome, champz', 'b. verde'); // retorna uma string
// url, título, opções
window.open('/popup.html', 'Enquete', 'resizable,scrollbars'); // #feioDemais!
window.setTimeout(f, 200); // chama daqui a 200ms, 1x. retorna um id do timer
window.setInterval(f, 1000); // chama a cada 1s, forever. retorna um id
window.clearTimeout(id);
window.clearInterval(id);
window.eval('window.alert("eval is evil!");'); // nao fazer em casa
window.eval(textoComCodigo)
executa o textoComCodigo
que é uma String que pode conter código JavaScriptwindow
também possui outros objetos muito
importantes
window.document
html
da páginawindow.navigator
window.console
window.history
window.Math
window.JSON
window.localStorage
window.sessionStorage
window.location
window
é o único objeto global, podemos acessar
suas propriedades sem usar `"window."` :scream:. Por exemplo:
window.console.log('JS >> Python');
É o mesmo que:
console.log('JS >> Python'); // sucesso!!
window
para que o código fique menorzinho<!DOCTYPE html>
<html>
<head>
<title>HTML</title>
</head>
<body>
<!-- Add your content here -->
</body>
</html>
document
dá acesso ao Document Object Model, ou DOM id
:
let botaoDeliciaEl = document.querySelector('#botao-delicia');
document.querySelector(seletor)
permite que, a partir de um código
JavaScript, recuperemos uma referência a um elemento do DOM
let logoEl = document.querySelector('#logomarca');
let tabelaEl = document.querySelector('#tesouros-pirata');
let principalEl = document.querySelector('main');
document.querySelectorAll(seletor)
(repare o all
),
que retorna mais de um elemento// recupera o elemento do botão no DOM
let botaoDeliciaEl = document.querySelector('#botao-delicia');
// atrela uma função ao evento de 'click' do botão
botaoDeliciaEl.addEventListener('click', function() { /* ... */ });
// recupera o elemento do botão no DOM
let botaoDeliciaEl = document.querySelector('#botao-delicia');
// atrela uma callback ao evento de 'click' do botão
botaoDeliciaEl.addEventListener('click', function() {
alert('O botão delícia foi clicado!!');
// pode fazer várias coisas aqui
});
document.querySelector
retorna apenas 1 elemento
document.querySelectorAll
retorna todos que forem selecionados:
let inputs = document.querySelectorAll('input'); // retornou um 'NodeList'
// com todos inputs da página
console.log('Quantidade de inputs na página: ' + inputs.length);
let primeiroInputEl = inputs[0];
let imagens = document.querySelectorAll('img'); // retornou um 'NodeList'
// INCORRETO: um NodeList não possui um método "addEventListener"
imagens.addEventListener('click', function() { });
// CORRETO: cada item do NodeList (array) é um elemento HTML, logo,
// possui a propriedade "addEventListener"
for (let imagemEl of imagens) {
imagemEl.addEventListener('click', function() { });
}
Um NodeList
é “praticamente um array“ - ele possui os métodos essenciais:
let inputs = document.querySelectorAll('input'); // inputs é um 'NodeList'
// propriedade .length (igual um array)
console.log('Quantidade de elementos: ' + inputs.length');
// método 'forEach' (igual um array)
inputs.forEach(function(el) {
// ...
});
// pegando um elemento como se fosse um array
let primeiroEl = inputs[0];
NodeList
vs VetorNodeList
é praticamente um array, mas não possui todos os métodos. Por exemplo:
umNodeList.length ✅
umNodeList[5] ✅
umNodeList.forEach(...) ✅
umNodeList.indexOf(...) ❌
umNodeList.sort() ❌
umNodeList.reverse() ❌
umNodeList.filter() ❌
umNodeList.find() ❌
umVetor.length ✅
umVetor[5] ✅
umVetor.forEach(...) ✅
umVetor.indexOf(...) ✅
umVetor.sort() ✅
umVetor.reverse() ✅
umVetor.filter() ✅
umVetor.find() ✅
NodeList
em um vetor, usevetor = Array.from(umNodeList)
:
let todosParagrafos = document.querySelectorAll('p'); // é um 'NodeList'
todosParagrafos = Array.from(todosParagrafos); // agora é um 'Array'
HTMLElement
id
console.log(calcularEl.id);
class
console.log(menuEl.className); // className equivale a class
// - não pode 'class' pq é reservado em js
el.classList
é melhor (mais adiante)console.log(logoEl.src);
no.firstChild; // primeiro filho
no.lastChild; // último filho
no.childNodes; // array de filhos
no.nextSibling; // próximo irmão
no.previousSibling; // irmão anterior
no.parentNode; // nó pai
no.firstElementChild; // primeiro filho
no.lastElementChild; // último filho
no.children; // array de filhos
no.nextElementSibling; // próximo irmão
no.previousElementSibling; // irmão anterior
no.parentElement; // nó pai
function caminhaNoDOM(no, visitaNo) {
visitaNo(no);
no = no.firstChild;
while (no) {
caminhaNoDOM(no, visitaNo);
no = no.nextSibling;
}
}
function imprimeNomeDaTag(no) {
// apenas imprime o nome da tag (e.g., BODY, H1, P)
console.log(no.tagName);
}
function substitui(no) {
// se for um nó de texto da árvore, substitui seu textContent
if (no.nodeType === Node.TEXT_NODE) {
no.textContent = no.textContent.replace(/antigo/g, 'novo');
}
}
// chama o algoritmo de caminhamento com a função de visita
// imprimindo o nome da tag corrente
caminhaNoDOM(document.body, imprimeNomeDaTag);
<img src="bob-esponja.png">
<img>
, o atributo src="..."
aponta para a URL do arquivo<img src = "...">
:thumbsdown:<img src="...">
:thumbsup:É possível alterar atributos dos nós:
<a href="/contato" id="link-contato">...</a>
let lingua = 'port';
const texto = {
'port': 'Página de Contato',
'ingl': 'Contact Us'
}
const linkContatoEl = document.querySelector('#link-contato');
linkContatoEl.innerHTML = texto[lingua];
É possível alterar o conteúdo de um elemento com elemento.innerHTML
:
let contador = 0;
let contadorEl = document.querySelector('#contador');
// quando clicado, (1) conta e (2) altera conteúdo
contadorEl.addEventListener('click', function() {
contador++; // (1) conta
contadorEl.innerHTML = contador; // (2) altera
});
<img src="imgs/pikachu.png" id="pokemon-lutando">
let pokemonEl = document.querySelector('#pokemon-lutando');
pokemonEl.src = 'imgs/bulbasaur.png'; // alteramos o 'src'
src
da img
, mas poderia ser qualquer um
input
costumamos pegar/alterar o value
inputEl.value = 'novo valor';
botaoEl.classList.add('selecionado'); // coloca .selecionado
imageEl.classList.remove('oculta'); // remove .oculta
pEl.classList.toggle('expandido'); // coloca ou tira .expandido
'click'
de cada um:
.selecionado
do elemento que foi “clicado”
el.classList.toggle('selecionado')
'click'
de cada um:
.selecionado
de todos<body>
<nav id="menu">...</nav>
<main>...</main>
</body>
.menu-visivel
no <body>
<body>
tem .menu-visivel
click
dblclick
mousedown
mouseup
mousemove
mouseover
mouseout
change
blur
focus
keydown
keyup
reset
submit
el.onclick = function(e) { /*...*/ };
el.addEventListener('click', funcao);
'click'
em TODOS os parágrafos
<p>Parágrafo 1</p>
<p>Parágrafo 2</p>
<p>Parágrafo 3</p>
Parágrafo 1
Parágrafo 2
Parágrafo 3
function colore() {
let el = ??; // <-- quem colocar aqui??
el.style.background = 'lightblue';
};
let ps = document.querySelectorAll('p');
for (let pEl of ps) {
pEl.addEventListener('click', colore);
}
e
, evt
ou event
:
let ps = document.querySelectorAll('p'); // igualzinho antes!
for (let pEl of ps) {
pEl.addEventListener('click', colore);
}
function colore(e) { // repare o argumento 'e' (evento)
let el = e.currentTarget; // <--- o elemento "alvo" do evento
el.style.background = 'lightblue'; // colore parágrafo alvo do evento
}
divs
, uma dentro da outra e cada uma tem um
click handlerevt.target
) para saber qual objeto arrastável foi clicadoe.stopPropagation()
:
function fechaPainelModal(e) {
// "fecha" (torna invisível) o painel modal
modal.style.display = 'none';
// evita que o clique no botão fechar seja processado pelos
// handlers de cliques dos elementos ancestrais
e.stopPropagation();
}
botaoFechar.addEventListener('click', fechaPainelModal);
input
) e alguns outros elementos possuem
ações padrão. Por exemplo:
submit
→ envia o formulárioreset
→ limpa os campos preenchidose.preventDefault()
:
function validaFormulario(e) {
if (nome === '' || senha === '') {
// Houve erros no formulário. Impedir o envio
e.preventDefault();
}
}
botaoEnviarEl.addEventListener('submit', validaFormulario);
elemento.parentNode
ou elemento.parentElement
)elemento.childNodes
ou elemento.children
)<img>
, mas quero a <div></div>
que é “pai” dela:
function clicouNaImagem(e) {
let clicadoEl = e.currentTarget; // a <img> que foi clicada
let divEl = clicadoEl.parentNode; // <--- <div> é o pai da <img>
console.log(divEl.id); // imprime id da div
}
let imgEl = document.querySelector('div > img');
imgEl.addEventListener('click', clicouNaImagem);
el.closest(seletor)
el
que atenda ao seletor
:
<article class="produto" id="produto-456"> ⬅️
<div>
<img src="..." alt="...">
</div>
</article>
function imagemProdutoClicado(e) {
const imgEl = e.currentTarget;
const produtoEl = imgEl.closest('.produto');
console.log(produtoEl.id); // produto-456 ⬅️
}
<article class="produto">
<h3 class="nome">Bolsa caríssima</h3> ⬅️
<div>
<img src="..." alt="...">
</div>
</article>
function imagemProdutoClicado(e) {
const imgEl = e.currentTarget;
const produtoEl = imgEl.closest('.produto');
const nomeEl = produtoEl.querySelector('.nome')
console.log(nomeEl.innerHTML); // Bolsa caríssima
}
elemento.classList.toggle('nome-da-classe')
true
se tiver colocado a classefalse
se tiver removido a classe
let colocou = booEl.classList.toggle('selecionado');
console.log(colocou); // imprime 'true', porque adicionou .selecionado
colocou = booEl.classList.toggle('selecionado');
console.log(colocou); // imprime 'false', porque tirou .selecionado