Parte 2 - JavaScript no front-end
Henrique Rotava
A linguagem da Web
Uma interface de programação para documentos HTML, XML e SVG criada pela W3C
Representa o documento no formato de árvore, em grupos de nós, e objetos com propriedades métodos e eventos
O DOM é utilizado pelo navegador para representar a página
É acessível pelo JS através do objeto document, mas não é JS
Criar efeitos ou alterar o conteúdo da página sem recarregar o conteúdo
Método | Descrição |
---|---|
documentElement | Captura o elemento raiz <html> de um documento HTML. |
getElementById | Busca um elemento da página Web com o uso do atributo id do elemento |
createElement | Cria um nodo elemento na página |
createAttribute | Cria um nodo atributo na página. |
createTextNode | Cria um nodo texto na página. |
getElementsByTagName | Retorna um array dos elementos com o mesmo nome. |
appendChild | Insere um novo elemento filho. |
removeChild | Remove um elemento filho. |
parentNode | Retorna o nodo pai de um nodo. |
querySelector | Primeiro elemento que corresponde ao seletor. |
querySelectorAll | Lista de elementos que correspondem ao seletor. |
Os eventos do DOM podem representar desde interações do usuário até notificações automáticas que ocorrem no background
Todos os eventos derivam do objeto Event
Alguns dos principais eventos são: click, change, blur, focus, keydown, keyup, keypress, mouseover, mouseleave, mouseenter, resize, submit. Lista completa
<!-- Eventos no HTML -->
<input type="text" onChange="inputChanged()" />
<button onClick="buttonClicked()">Clique</button>
<form onSubmit="formSubmitted()">...</form>
// Adicionando eventos no JavaScript
document.getElementById('click-button').addEventListener('click', function(e){
// Fazer algo
}
document.getElementById('register-form').addEventListener('submit', function(e){
// Fazer validações, etc.
e.preventDefault();
}
São eventos criados pelo próprio desenvolvedor
// Criando o evento
var event = new Event('build');
// Ouvindo o evento
elem.addEventListener('build', function (e) { ... }, false);
// Disparando o evento
elem.dispatchEvent(event);
1. Criar uma página com:
a. Um formulário com um campo e um botão
b. O formulário deve criar uma mensagem no chat caso o campo estiver preenchido
c. Alterar o título da página com a contagem de mensagens
d. Deve haver uma mensagem no topo da página exibindo a contagem de mensagens "recebidas"
e. Um botão que marca todas notificações como lidas, este botão só pode estar habilitado caso existam notificações
Uma biblioteca JavaScript muito famosa que torna manipulação de DOM , tratamento de eventos, animações e AJAX muito mais simples do que o uso de puro JavaScript
Possui uma alta compatibilidade com navegadores
Possui uma grande quantidade de plugins
Utilizado pela maioria dos sites atuais
Acesse https://jquery.com/download/
Clique no link de download Download the compressed, production jQuery...
Porque o arquivo comprimido?
Copie o arquivo para a pasta do exercício
Adicione a referência em seu HTML:
<script type=”text/javascript” src=”nome do arquivo.js”></script>
<script src="https://code.jquery.com/jquery-1.12.0.min.js"></script>
Ou através de uma CDN:
A sintaxe básica do jQuery:
$(document).ready(function(){
// Código jQuery aqui...
});
Aguardando o documento carregar (evitando problemas):
// $(selector).action()
$("p").hide()
$("button").click(function(){
$("p").hide();
});
Eventos:
Outras seleções:
$("#id-name") // Seleciona elemento que tenha o id id-name
$(".class-name") // Seleciona todos os elementos que tenham a class class-name
$("*") // Seleciona todos os elementos
$(this) // Seleciona o elemento atual
$("p.intro") // Seleciona todos elementos <p> que tenham a classe intro
$("p:first") // Seleciona o primeiro <p>
$("ul li:first") // Seleciona a primeira <li> da primeira <ul>
$("ul li:first-child") // Seleciona a primeira <li> de toda <ul>
$("[href]") // Seleciona todos os elementos que tenham o atributo href
$("a[target='_blank']") // Seleciona todos os <a> que tenham um atributo target com o valor '_blank'
$("a[target!='_blank']") // Seleciona todos os <a> que tenham um atributo target com o valor diferente de '_blank'
$(":button") // Seleciona todos <button> e todos <input> do tipo button
$("tr:even") // Seleciona todos <tr> pares
$("tr:odd") // Seleciona todos <tr> ímpares
Alguns dos eventos mais utilizados:
click: ao clicar em um elemento
dblclick: ao clicar duplamente,
mouseenter: quando o mouse entra na área de algum elemento,
mouseleave: quando o mouse sai da área de um elemento,
keypress: ao inserir um caractere
keydown: quando a tecla é pressionada,
keyup: quando a tecla é liberada,
submit: ao submeter formulário
change: quando o input sofreu alterações,
blur: quando um campo perde o foco
focus: quando um campo recebe foco,
load: ao carregar recurso (ex.: arquivo js terminou de carregar),
resize: ao redimensionar,
scroll: quando ocorre rolagem,
// Esconder um elemento
$('.element').hide();
// Mostrar um elemento escondido
$('.element').show();
// Alternar visibilidade de um elemento
$('.element').toggle();
// Alternar com animação
$('.element').toggle('fast', function(){
// Executar depois da animação
});
// Mostrar elemento com animação
$('.element').fadeIn('slow');
// Esconder elemento com animação
$('.element').fadeOut(1000);
// Alterna visibilidade com animação por opacidade
$('.element').fadeToggle();
// Animações customizadas
var div = $("div");
div.animate({left: '100px'}, "slow");
div.animate({fontSize: '3em'}, "slow");
// Animações encadeadas
$('.element').fadeIn('slow').hide()
// Retorna o elemento pai de todos <span>
$("span").parent();
// Retorna todos os elementos acima de todos os <span>
$("span").parents();
// Retorna os <ul> de acima de todos <span>
$("span").parents("ul");
// Retorna todos os elementos entre um <span> e uma <div>
$("span").parentsUntil("div");
//Retorna todos os filhos de elementos <div>
$("div").children();
// Retorna todos os <p> filhos de elementos <div> com a classe first
$("div").children("p.first");
// Retorna todos os <span> filhos de elementos <div>
$("div").find("span");
// Retorna os irmãos do elemento selecionado
$("h2").siblings();
// Retorna os irmãos <p> do elemento selecionado
$("h2").siblings("p");
// Retorna o próximo irmão do elemento selecionado
$("h2").next();
// Retorna os próximos irmãos do elemento selecionado
$("h2").nextAll();
// Retorna os próximos irmãos do elemento selecionado até encontrar um h6
$("h2").nextUntil("h6");
// Primeiro <p> da primeira <div>
$("div p").first();
// Última <p> da última <div>
$("div p").last();
// Seleciona o segundo <p>
$("p").eq(1);
// Seleciona os elementos <p> com a classe intro
$("p").filter(".intro");
// Seleciona os elementos <p> que não possuem a classe intro
$("p").not(".intro");
2. Criar uma nova versão do exercício anterior e:
a. Trocar o código de JS puro para jQuery
b. Adicionar animação ao criar mensagem para que ela seja exibida suavemente
c. Adicionar uma animação no scroll do chat também
d. Adicionar evento de clique em cada mensagem que marca ela como lida
JavaScript Object Notation
Um modelo para armazenamento e transmissão de informações no formato texto
Fácil para humanos ler e escrever, e para máquinas gerar e analisar
Totalmente independente de linguagem
Pode representar qualquer tipo de informação
Representação de informações de uma forma mais compacta, rápida e simples do que utilizando XML
Um par nome/valor, sendo que o nome deve estar entre aspas duplas, o valor vem depois de ':' e pode ser numérico, literal, booleano, array ou objeto
{
"string": "valor literal",
"int": 2,
"float": 3.6,
"boolean": true,
"array": ["RS", "SC", "SP", "RJ"],
"object": {
"whatever": null,
}
}
{
"string": "valor literal",
"int": 2,
"float": 3.6,
"boolean": true,
"array": ["RS", "SC", "SP", "RJ"],
"object": {
"whatever": null,
}
}
<string>valor literal</string>
<int>2</int>
<float>3.6</float>
<boolean>true</boolean>
<array>RS</array>
<array>SC</array>
<array>SP</array>
<array>RJ</array>
<object>
<whatever />
</object>
119 caracteres
180 caracteres
JSON.stringify(): transforma um objeto JSON em string
JSON.parse(): transforma uma string em um objeto JSON
var obj = {
test: 'test prop',
name: 'a name',
bool: true,
num: 123
};
var stringObj = JSON.stringify(obj);
var jsonObj = JSON.parse(stringObj);
Asynchronous JavaScript and XML
Se comunica com o servidor no background sem recarregar a página
Envia e recebe informações no formato JSON, XML, HTML e texto
Alterar a interface baseado em dados vindos do servidor de forma assíncrona
Importante:
GET - Requisita conteúdo de um recurso
POST - Submita dados para um recurso
function makeRequest(url) {
if (window.XMLHttpRequest) { // Mozilla, Safari, ...
httpRequest = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE
try {
httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
if (!httpRequest) {
alert('Giving up :( Cannot create an XMLHTTP instance');
return false;
}
httpRequest.onreadystatechange = alertContents;
httpRequest.open('GET', url);
httpRequest.send();
}
function alertContents() {
if (httpRequest.readyState === 4) {
if (httpRequest.status === 200) {
alert(httpRequest.responseText);
} else {
alert('There was a problem');
}
}
}
Verificar o estado da requisição:
0 (não inicializado)
1 (carregando)
2 (carregado)
3 (interativo)
4 (completo)
Verificar estado da resposta
function makeRequest(url, userName) {
// ... criar o objeto httpRequest aqui
httpRequest.onreadystatechange = alertContents;
httpRequest.open('POST', url);
httpRequest.setRequestHeader(
'Content-Type',
'application/x-www-form-urlencoded');
httpRequest.send('userName=' + encodeURIComponent(userName));
}
Keep it simple, stupid!
// Carrega o conteúdo do arquivo teste.txt dentro da div com id #div1
$("#div1").load("http://domain.com.br/teste.txt");
// As informações em /example/get estarão na var data
$.get("http://domain.com.br/example/get", function(data, status){
alert("Data: " + data + "\nStatus: " + status);
});
// Passando dados em um POST
$.post("http://domain.com.br/example/post",
{
name: "Nome Sobrenome",
city: "Erechim"
},
function(data, status){
alert("Data: " + data + "\nStatus: " + status);
}
);
$.ajax( "example.php" )
.done(function() {
alert( "success" );
})
.fail(function() {
alert( "error" );
})
.always(function() {
alert( "complete" );
}
);
$.ajax({
method: "POST",
url: "some.php",
data: { name: "John", location: "Boston" }
})
.done(function( msg ) {
alert( "Data Saved: " + msg );
});
3. Submeter um formulário de inscrição por AJAX
b. Enviar os dados para o servidor via POST
c. A resposta do servidor será no formato JSON: {"error": false, "messages": ["Mensagem"], "user": "nome do usuário"}
d. Se a resposta não possuir erro, limpar os campos do form
e. Exibir a mensagem retornada do servidor para o usuário
f. URL do POST: http://host:port/subscription
g. Parâmetros esperados: name, email, job