Ruby on Rails Fullstack

Javascript

Uma linguagem de programação similar a qualquer outra. Long story short, foi criada para ser uma linguagem que funcionasse em browsers. Hoje em dia é uma das mais utilizadas (se não A mais utilizada) linguagem de programação no mundo, servindo de aplicações Web a Mobile e até games.

JS - Estrutura Básica

// Declarando variáveis em JS
const PI = 3.14; // constante
let num1 = 1234; // variável
var num2 = 4321; // modo antigo
hello = 'World'  // var global

Variáveis

Fluxos Condicionais

// === indica que a variável deve ter o mesmo valor e ser do mesmo tipo
// no caso, age precisa ser o número 18, não apenas uma string '18'
if ( age >= 18 ){ 
  console.log('You can drink!!');
} else if ( age === 17 ){
  console.log('You almost can drink!!');
} else {
  console.log('You really should not drink...');
}

// ternário
console.log( x >= 18 ? 'Can drink!' : 'Cannot drink!');

JS - Estrutura Básica

Loops

// while
while( x < 3 ){
  console.log(x);
  x++;
}

// for clássico
for( x = 1; x < 3; x++ ){
  console.log(x);
}

// for parecido com each de ruby
arr = ["James", "Lars", "Robert", "Kirk"];
arr.forEach(function(name, index, array){
  console.log("Name is: " + name);
  console.log("It's index is: " + index);
  console.log("The array is: " + array)
});

JS - Estrutura Básica

Funções

// Jeito antigo
function square(x){
  return x**2;
}

// Jeito novo
const square = (x) => {
  return x**2;
}

// Jeito novo, com return implicito
const square = x => x**2;

JS - Estrutura Básica

JSON

// JSON (Javascript Object Notation)
// Nada mais é do que uma hash
const aluno = {
  name: 'Rafael',
  age:  22
}

// Conseguimos acessar as informações de um objeto
// de duas maneiras distintas
console.log(aluno['name']);
console.log(aluno.age);

Muito utilizado como formato de resposta de APIs!

JS - Estrutura Básica

Funções úteis

// retorna o tipo do parâmetro passado
typeof(2); // => 'number'
typeof(2.1); // => 'number'

// parse de string para número, em base decimal (10)
Number.parseInt('42', 10);

// parse de número para string
(42).toString();

// upcase
'João'.toUpperCase();

// downcase
'João'.toLowerCase();

// interpolação 
// => string entre ` (backticks), código entre '${}'
family = 'Starks'
console.log(`I am team ${family}`);

E como é que interagimos com nossa página web (HTML/CSS)?

DOM

Document Object Model

DOM

DOM trata a página como uma árvore, onde cada elemento é um nó

DOM

JS consegue interagir com o DOM, acessando seus elementos, lendo e/ou reescrevendo suas propriedades!

// Seleciona o elemento da página que possua
// o id="banner"
banner = document.querySelector('#banner');
// ou
banner = document.getElementById('banner');

// Seleciona todos os elementos da página que
// possuam a classe 'avatar'
banner = document.querySelector('.avatar');

// O que há de texto dentro do banner?
console.log(banner.innerText);

// O que há de código HTML dentro do banner?
console.log(banner.innerHTML);

Note que o parâmetro de 'querySelector' é igual a seletores que utilizamos em CSS!

DOM

JS também consegue adicionar e/ou manipular nós!

banner = document.getElementById('banner');

// cria um elemento do tipo <h1></h1>
h1 = document.createElement('h1');

// cria um elemento de texto
text = document.createElement("Hello world!");

// insere o elemento dentro de um 'pai'
h1.appendChild(text);

// insere o elemento no banner da página
banner.insertAdjacentHTML('beforeend', h1);
// Posição a declarar no primeiro parametro de 'insertAdjacentHTML'

// <!-- beforebegin -->
// <div id='banner'>
// <!-- afterbegin -->
// ..... conteúdo já existente .....
// <!-- beforeend -->
// </div>
// <!-- afterend -->

DOM

JS também consegue adicionar e/ou manipular nós!

banner = document.getElementById('banner');

// cria um elemento do tipo <h1></h1>
h1 = document.createElement('h1');

// cria um elemento de texto
text = document.createElement("Hello world!");

// insere o elemento dentro de um 'pai'
h1.appendChild(text);

// insere o elemento no banner da página
banner.insertAdjacentHTML('beforeend', h1);
// Posição a declarar no primeiro parametro de 'insertAdjacentHTML'

// <!-- beforebegin -->
// <div id='banner'>
// <!-- afterbegin -->
// ..... conteúdo já existente .....
// <!-- beforeend -->
// </div>
// <!-- afterend -->

DOM e CSS

Conseguimos acessar o estilo de cada nó de duas maneiras diferentes

banner = banner.querySelector('#banner');

// recupera uma 'array' de classes do elemento;
banner.classList;

// adiciona uma classe ao elemento
banner.classList.add('red');
// remove uma classe do elemento, se houver
banner.classList.remove('red');
// Se há uma classe, remova-a. Se não há, adicione
banner.classList.toggle('red');

// recupera todo o estilo do elemento;
banner.style;

// esconda-o da página
banner.style.display = 'none';
// mostre-o na página
banner.style.display = 'block'; // ou qualquer outro

Guardando informações

Se possuirmos informações importantes a serem utilizadas posteriormente em JS, podemos guardá-las em datasets (HTML)...

<div id='banner' dataset-id='123' dataset-name='joao'>
    <h1> Hello World! </h1>
    <!-- ... -->
</div>

E acessá-las posteriormente!

banner = banner.querySelector('#banner');

console.log(banner.dataset.id); // => '123'
console.log(banner.dataset.name); // => 'Joao'

Mas o melhor ainda está por vir...

Event Listeners

Para nos adaptarmos às interações do usuário

Event Listeners

Event Listeners são funções ativadas somente quando um tipo de interação especificado ocorre em um certo elemento, também especificado. São tipos de interação:

  • click
  • keydown
  • keyup
  • keypress
  • change
  • focus
  • blur
  • submit
  • scroll
  • mouseOver

Event Listeners

Estrutura Básica

// element: o elemento que sofrerá a interação
// change: o tipo de interação que será feita
// func: a função a ser executada quando a interação for feita no elemento
element.addEventListener(change, func);

Event Listeners

Exemplo

// quando o botão for pressionado, todas as imagens
// terão a classe 'avatar' ativada ou desativada

button = document.querySelector("#avatamize");
change = 'click';

const avatamize = () => {
  // pegue todas as imagens
  imgs = document.querySelectorAll('img');

  // para cada uma delas
  imgs.forEach((img) => {
    // ative ou desative a classe 'avatar'
    img.classList.toggle('avatar');
  });
}

// adicione o event listener ao botão
button.addEventListener(change, avatamize);

Event Listeners

E se quisermos mudar apenas o elemento interagido?

// quando um botão for pressionado, somente ele terá
// sua cor transformada para verde

buttons = document.querySelector("button");

// o event listener é adicionado a um elemento apenas
// não podemos fazer 'buttons.addEventListener...'
buttons.forEach((button) => {
  // o event listener passa como parâmetro para nossa
  // função o evento ocorrido (event)
  button.addEventListener('click', (event) => {
    console.log(event);

    // event.currentTarget nos retorna o elemento interagido
    console.log(event.currentTarget);
    event.currentTarget.style.backgroundColor = 'green';
  });
});

Plot twist: o melhor só vem agora

AJAX

Asyncronoux Javascript And XML

AJAX

AJAX é uma das maiores ferramentas para o desenvolvimento moderno de aplicações Web. É com ele que conseguimos fazer requisições HTTP sem termos que recarregar a página, realizando as modificações necessárias na mesma de acordo com o que recebermos de resposta e manipulando o DOM

HTTP request?

https://www.google.com/search?q=danoninho

  • schema: https (HTTP 1.1)
  • host: www.google.com
  • path: /search
  • query: ?q=danoninho

Tipos de requisições (Verbos):

  • GET
  • POST
  • PUT
  • PATCH
  • DELETE

HTTP request?

Exemplo de header (como mandamos nossa requisição)

HTTP request?

Exemplo de body (o que mandamos em nossa requisição)

// Oh meu deus, é um JSON!
{
    nome: 'João',
    familia: 'Starks'
}

Executa o request (GET, por padrão) passado, sem body

link = "http://localhost:8000/"
// faça a requisição e mostre a resposta dela
fetch(link).then((response) => console.log(response))

Entenda mais sobre Promises, essencial para AJAX

Executa o request passado, com body

link = "http://localhost:8000/"

// Para mandar informações em Body, precisamos seguir alguns
// passos minimos:
// 1. Mudar o método (Verbo)
let method = 'POST';
// 2. Montar nosso Body em JSON
let body = {nome: 'João', familia: 'Starks'};
// 3. Transformar nosso JSON para String usando JSON.stringify
body = JSON.stringify(body)
// 4. Montar um JSON com o method e o Body criados
let info = {method: method, info: info}

// faça a requisição, passando estas informações
fetch(link, info).then((response) => console.log(response))

Responses são difíceis de trabalhar. Melhor transformá-las em JSON antes

link = "http://localhost:8000/"

// A estrutura mais comum de um fetch é transformar
// a resposta em JSON primeiro, e então utilizá-la
fetch(link)
  .then(response => response.json())
  .then((data) => {
    // O que quisermos fazer com o que for retornado
  });

Quer brincar com requests?

Postman é uma boa ferramenta para isso!

Made with Slides.com