# Curso JavaScript - RocketSeat :rocket: [toc] ## 1 Intro Treinamento Gratuíto RocketSeat JavaScript. ***[:books: > Site do treinamento](https://rocketseat.com.br/starter/curso-gratuito-javascript)*** ***[:computer: > Editor Online para testes de codigo](https://playcode.io/online-javascript-editor)*** ### Variáveis e dados ```javascript var nome = 'Ice'; // string var idade = 23; // int var peso = 83.5; // float var humano = true; // boolean var alunos = ['ice','bergs','brow']; var aluno = { nome: alunos[0], idade: 23, peso: 83.5, humano: true } console.log(alunos); console.log(alunos[1]); console.log(aluno); console.log(aluno.idade); ``` --- ### Operações matemáticas ```javascript var x = 10, y = 5; // (* / % + - ) var resultado = x + y; // Equivalentes... x = x + 3; x += 3; // funcionam demais funcões tambem! x *= 3; x /= 3; x -= 3; x *= y; console.log(x); ``` --- ### Funções ```javascript function soma(numero1, numero2) { var resultado = numero1 + numero2; return resultado; } var continha = soma(1,2); console.log(continha); ``` --- ### Condicionais ```javascript function retornaSexo(sexo) { // if ( a == b ) // valores iguais // if ( a === b ) //valores e tipos iguais if (sexo === 'M') { return 'Masculino'; } else if (sexo === 'F') { return 'Feminino'; } else { return 'Indefinido'; } } function retornaSexo2(sexo) { //com switch switch(sexo) { case 'M': return 'Masculino'; case 'F': return 'Feminino'; default: return 'Indefinido'; } } var resultado = retornaSexo('M'); console.log(continha); ``` --- ### Operadores Lógicos ```javascript // AND, OR, NOT var sexo = 'M', idade = 23; // AND if (sexo === 'M' && idate >= 20) { console.log('OK!'); } // OR if (sexo === 'M' || idate >= 20) { console.log('OK!'); } //NOT if (sexo != 'M' || idate >= 20) { //apenas nao valor console.log('OK!'); } if (sexo !== 'M' || idate >= 20) {//apenas nao valor e tipo console.log('OK!'); } // populando variaveis com respostas.. var masculino; if (sexo === 'M') { masculino = true; } else { masculino = false; } // enxugando estrutura com mesmo resultado... var masculino = (sexo === 'M'); console.log(masculino); ``` --- ### Condição ternária ```javascript //vamos reescrever if para um 'inline' (condicao ternaria)... var sexo = 'M'; if (sexo === 'M') { return 'Masculino'; } else { return 'Feminino'; } // Abaixo reescrita... var retorno = (sexo === 'M') ? 'Masculino' : 'Feminino'; console.log(retorno); ``` --- ### Estruturas de repetição ```javascript // for, while for (var i = 0; i <= 100; i++) { console.log(i); } var j = 0; while (j <= 100) { console.log(j); j++; } ``` --- ### Intervalo e timeout ```javascript function exibeAlgo() { console.log('Hello World!'); } // executa a função xxxx a cada yyy milisegundos.. setInterval(exibeAlgo,1000); // executa a função xxxx UMA VEZ depois yyy milisegundos.. setTimeout(exibeAlgo,5000); ``` --- ### Desafio 01 - Exercícios: Módulo 01 #### 1º exercício Crie uma função que dado o objeto a seguir: ```javascript var endereco = { rua: "Rua dos pinheiros", numero: 1293, bairro: "Centro", cidade: "São Paulo", uf: "SP" }; ``` Retorne o seguinte conteúdo: ``` O usuário mora em São Paulo / SP, no bairro Centro, na rua "Rua dos Pinheiros" comnº 1293. ``` ##### Solução: ```javascript var endereco = { rua: "Rua dos pinheiros", numero: 1293, bairro: "Centro", cidade: "São Paulo", uf: "SP" }; console.log(`O usuário mora em ${endereco.cidade} / ${endereco.uf}, no bairro ${endereco.bairro}, na rua ${endereco.rua}" com nº ${endereco.numero}.`); ``` #### 2º exercício Crie uma função que dado um intervalo (entre x e y) exiba todos número pares: ```javascript function pares(x, y) { // código aqui } pares(32, 321); ``` ##### Solução: ```javascript function pares(x, y) { // vamos correr nosso intervalo for ( var numero = x; numero <= y; numero++) { // vamos ver se a divisao do numero atual por 2 retorna 0(é Par) if ((numero % 2) === 0) { // vamos imprimir os pares... console.log(numero); } } } pares(32, 321); ``` #### 3º exercício Escreva uma função que verifique se o vetor de habilidades passado possui a habilidade =="Javascript"== e retorna um booleano `true/false` caso exista ou não. ```javascript function temHabilidade(skills) { // código aqui } var skills = ["Javascript", "ReactJS", "React Native"]; temHabilidade(skills); // true ou false ``` *Dica: para verificar se um vetor contém um valor, utilize o método ++indexOf++* ##### Solução: ```javascript //Solucao didática function temHabilidade(skills) { // funcao indexOf retorna posição do array caso encontre alvo. var posicaoArray = skills.indexOf('Javascript'); // vamos verificar se posição retornada >= 0 (-1 indica não encontrado!) if (posicaoArray >= 0) { return true; } else { return false; } } // Solução curta function temHabilidade2(skills) { return ( skills.indexOf('Javascript') >= 0 ); } function temHabilidade3(skills) { return skills.indexOf("Javascript") !== -1; } var skills = ["Javascript", "ReactJS", "React Native"]; // vamos ajustar para conseguir ver saída console.log(temHabilidade(skills)); console.log(temHabilidade2(skills)); console.log(temHabilidade3(skills)); ``` #### 4º exercício Escreva uma função que dado um total de anos de estudo retorna o quão experiente o usuário é: ```javascript function experiencia(anos) { // código aqui } var anosEstudo = 7; experiencia(anosEstudo); // De 0-1 ano: Iniciante // De 1-3 anos: Intermediário // De 3-6 anos: Avançado // De 7 acima: Jedi Master ``` ##### Solução: ```javascript function experiencia(anos) { switch(anos) { case 0: case 1: return 'Iniciante'; case 2: case 3: return 'Intermediário'; case 4: case 5: case 6: return 'Avançado'; default: return 'Jedi Master'; } } function experiencia2(anos) { if (anos <= 1) { return "Iniciante"; } else if (anos <= 3) { return "Intermediário"; } else if (anos <= 6) { return "Avançado"; } else { return "Jedi Master"; } } var anosEstudo = 7; console.log(experiencia(anosEstudo)); console.log(experiencia2(anosEstudo)); ``` #### 5º exercício Dado o seguinte vetor de objetos: ```javascript var usuarios = [ { nome: "Diego", habilidades: ["Javascript", "ReactJS", "Redux"] }, { nome: "Gabriel", habilidades: ["VueJS", "Ruby on Rails", "Elixir"] } ]; ``` Escreva uma função que produza o seguinte resultado: ``` O Diego possui as habilidades: Javascript, ReactJS, Redux O Gabriel possui as habilidades: VueJS, Ruby on Rails, Elixir ``` *Dica: Para percorrer um vetor você deve utilizar a sintaxe ++for...of++ e para unir valores de um array com um separador utilize o ++join++.* ##### Solução: ```javascript var usuarios = [ { nome: "Diego", habilidades: ["Javascript", "ReactJS", "Redux"] }, { nome: "Gabriel", habilidades: ["VueJS", "Ruby on Rails", "Elixir"] } ]; var usuario; for (usuario of usuarios) { console.log(`O ${usuario.nome} possui as habilidates: ${usuario.habilidades.join(', ')}`); } ``` --- ## Manipulando a DOM ### Eventos Inline ```htmlmixed= <html> <head> <title>Curso Javascript</title> </head> <body> <div id="app"> <button onclick="mostraAlerta()" onmouseover="mostraAlerta2()"> Me pressione </button> </div> <script> function mostraAlerta() { console.log("Botao Clicado!"); } function mostraAlerta2() { console.log("Mouse Over!"); } </script> </body> </html> ``` --- ### Trabalhando com a DOM ```htmlmixed <html> <head> <title>Curso Javascript</title> </head> <body> <div id="app"> <input type="text" name="nome" id="nome" /> <button class="botao">Adicionar</button> </div> <script> // Abordagens iniciais.. var inputElement = document.getElementById("nome"); var inputElement2 = document.getElementsByTagName("input"); var inputElement3 = document.getElementsByTagName("input")[0]; // para retornar posicao do array direto... var inputElement4 = document.getElementsByClassName("botao"); var inputElement5 = document.querySelector("body div#app input"); var inputElement6 = document.querySelector("div#app input"); var inputElement7 = document.querySelector("input[name=nome]"); // querySelector retorna apenas 1 item... var inputElement7 = document.querySelectorAll("input"); //para retornar mais de 1 item... console.log(inputElement); console.log(inputElement2); console.log(inputElement3); console.log(inputElement4); console.log(inputElement5); console.log(inputElement6); console.log(inputElement7); // FIM Abordagens iniciais.. var btnElement = document.querySelector("button.botao"); btnElement.onclick = function() { console.log("Botão clicado!"); }; btnElement.onmouseover = function() { console.log("Mouse Over!"); }; </script> </body> </html> ``` --- ### Lidando com Elementos ```htmlmixed= <html> <head> <title>Curso Javascript</title> </head> <body> <div id="app"> <input type="text" id="nome" /> </div> <script> // vamos criar um elemento 'a' var linkElement = document.createElement("a"); //linkElement.href = "http://www.google.com"; //OU isso linkElement.setAttribute("href", "http://www.google.com"); linkElement.setAttribute("title", "Site Google"); //vamos incluir um texto em nosso 'a' var textElement = document.createTextNode("Acessar Site"); linkElement.appendChild(textElement); // vamos incluir nosso link como filha da div app.. var containerElement = document.querySelector("#app"); containerElement.appendChild(linkElement); //vamos excluir um elemento existente na tela var inputElement = document.querySelector("#nome"); containerElement.removeChild(inputElement); </script> </body> </html> ``` --- ### Alterando Estilos ```htmlmixed= <html> <head> <title>Curso Javascript</title> </head> <body> <div id="app"> <div class="box"></div> </div> <script> var boxElement = document.querySelector(".box"); boxElement.style.width = 100; boxElement.style.height = 100; boxElement.style.backgroundColor = "#f00"; </script> </body> </html> ``` --- ### Desafio ### Exercícios: Módulo 02 #### 1º exercício Crie um botão que ao ser clicado cria um novo elemento em tela com a forma de um quadrado vermelho com 100px de altura e largura. Sempre que o botão for clicado um novo quadrado deve aparecer na tela. ##### Solução: ```htmlmixed= <html> <head> <title>Curso Javascript</title> </head> <body> <div id="app"> <button id="addBox">Adicionar Caixa</button> </div> <script> function adicionaBox() { // Vamos criar nossa caixa var boxElement = document.createElement("div"); boxElement.style.width = 100; boxElement.style.height = 100; boxElement.style.backgroundColor = "#f00"; // vamos encontrar instanciar nosso contanerElement var contanerElement = document.querySelector("#app"); // vamos incluir como filho do containerElement nossas boxes contanerElement.appendChild(boxElement); } // vamos gerar a ação do nosso botao var buttonElement = document.querySelector("#addBox"); buttonElement.onclick = adicionaBox; </script> </body> </html> ``` --- #### 2º exercício Utilizando o resultado do primeiro desafio, toda vez que o usuário passar o mouse por cima de algum quadrado troque sua cor para uma cor aleatória gerada pela função abaixo: ```htmlmixed= function getRandomColor() { var letters = "0123456789ABCDEF"; var color = "#"; for (var i = 0; i < 6; i++) { color += letters[Math.floor(Math.random() * 16)]; } return color; } var newColor = getRandomColor(); // #E943F0 ``` ##### Solução: ```htmlmixed= <html> <head> <title>Curso Javascript</title> </head> <body> <div id="app"> <button id="addBox">Adicionar Caixa</button> </div> <script> // funcao para criar nossa box function adicionaBox() { // Vamos criar nossa caixa e definir style var boxElement = document.createElement("div"); boxElement.style.width = 100; boxElement.style.height = 100; boxElement.style.backgroundColor = "#f00"; // vamos inserir acao de troca de background em caso de mouseOver boxElement.onmouseover = function() { boxElement.style.backgroundColor = getRandomColor(); }; // vamos encontrar instanciar nosso contanerElement var contanerElement = document.querySelector("#app"); // vamos incluir como filho do containerElement nossas boxes contanerElement.appendChild(boxElement); } // funcao para gerar cor aleatória function getRandomColor() { var letters = "0123456789ABCDEF"; var color = "#"; for (var i = 0; i < 6; i++) { color += letters[Math.floor(Math.random() * 16)]; } return color; } // vamos gerar a ação do nosso botao var buttonElement = document.querySelector("#addBox"); buttonElement.onclick = adicionaBox; </script> </body> </html> ``` --- #### 3º exercício A partir do seguinte vetor: ```htmlmixed= var nomes = ["Diego", "Gabriel", "Lucas"]; ```` Preencha uma lista (`<ul>`) no HTML com os itens da seguinte forma: ● Diego ● Gabriel ● Lucas ##### Solução: ```htmlmixed= <html> <head> <title>Curso Javascript</title> </head> <body> <div id="app"></div> <ul id="lista"></ul> <script> // lista de nomes var nomes = ["Diego", "Gabriel", "Lucas"]; var listElement = document.querySelector("#lista"); for (nome of nomes) { liElement = document.createElement("li"); textElement = document.createTextNode(nome); liElement.appendChild(textElement); listElement.appendChild(liElement); } </script> </body> </html> ``` --- #### 4º exercício Seguindo o resultado do exercício anterior adicione um input em tela e um botão como a seguir: ```htmlmixed= <input type="text" name="nome"> <button onClick="adicionar()">Adicionar</button> ``` Ao clicar no botão, a função `adicionar()` deve ser disparada adicionando um novo item a lista de nomes baseado no nome preenchido no input e renderizando o novo item em tela juntos aos demais itens anteriores. Além disso, o conteúdo do input deve ser apagado após o clique. ##### Solução: ```htmlmixed= <html> <head> <title>Curso Javascript</title> </head> <body> <div id="app"></div> <input type="text" name="nome" /> <button onClick="adicionar()">Adicionar</button> <ul id="lista"></ul> <script> // lista de nomes var nomes = ["Diego", "Gabriel", "Lucas"]; var listElement = document.querySelector("#lista"); for (nome of nomes) { liElement = document.createElement("li"); textElement = document.createTextNode(nome); liElement.appendChild(textElement); listElement.appendChild(liElement); } function adicionar() { // vamos pegar nosso encontrar nosso campo input var inputElement = document.querySelector("input[name=nome]"); // vamos criar nosso li liElement = document.createElement("li"); // vamos popular textnode com nosso value textElement = document.createTextNode(inputElement.value); // vamos jogar na tela liElement.appendChild(textElement); listElement.appendChild(liElement); // Vamos zerar campo input inputElement.value = null; } </script> </body> </html> ``` --- ## App ToDos --- ### Estrutura do app index.html ```htmlmixed= <html> <head> <title>Curso Javascript - App ToDo</title> </head> <body> <div id="app"> <ul> <li> Fazer café <a href="#">excluir</a> </li> <li> Estudar <a href="#">excluir</a> </li> <li> Acessar Comunidade <a href="#">excluir</a> </li> </ul> <input type="text" placeholder="Digite um ToDo" /> <button>Adicionar</button> </div> <script src="todo.js"></script> </body> </html> ``` todo.js ```javascript console.log('teste'); ``` --- ### iniciando aplicacao index.html ```htmlmixed= <html> <head> <title>Curso Javascript - App ToDo</title> </head> <body> <div id="app"> <ul></ul> <input type="text" placeholder="Digite um ToDo" /> <button>Adicionar</button> </div> <script src="todo.js"></script> </body> </html> ``` todo.js ```javascript var listElement = document.querySelector("#app ul"); var inputElement = document.querySelector("#app input"); var buttonElement = document.querySelector("#app button"); var todos = ["Fazer cafe", "Estudaar", "Acessar comunidade"]; ``` --- ### Renderizando ToDos index.html ```htmlmixed= <html> <head> <title>Curso Javascript - App ToDo</title> </head> <body> <div id="app"> <ul></ul> <input type="text" placeholder="Digite um ToDo" /> <button>Adicionar</button> </div> <script src="todo.js"></script> </body> </html> ``` todo.js ```javascript var listElement = document.querySelector("#app ul"); var inputElement = document.querySelector("#app input"); var buttonElement = document.querySelector("#app button"); var todos = ["Fazer cafe", "Estudar", "Acessar comunidade"]; function renderTodos() { for (todo of todos) { var todoElement = document.createElement("li"); var todoText = document.createTextNode(todo); todoElement.appendChild(todoText); listElement.appendChild(todoElement); } } renderTodos(); ``` --- ### Criando ToDos index.html ```htmlmixed= <html> <head> <title>Curso Javascript - App ToDo</title> </head> <body> <div id="app"> <ul></ul> <input type="text" placeholder="Digite um ToDo" /> <button>Adicionar</button> </div> <script src="todo.js"></script> </body> </html> ``` todo.js ```javascript var listElement = document.querySelector("#app ul"); var inputElement = document.querySelector("#app input"); var buttonElement = document.querySelector("#app button"); var todos = ["Fazer cafe", "Estudar", "Acessar comunidade"]; function renderTodos() { listElement.innerHTML = ""; for (todo of todos) { var todoElement = document.createElement("li"); var todoText = document.createTextNode(todo); todoElement.appendChild(todoText); listElement.appendChild(todoElement); } } renderTodos(); function addTodo() { var todoText = inputElement.value; todos.push(todoText); inputElement.value = ""; renderTodos(); } buttonElement.onclick = addTodo; ``` --- ### Excluindo ToDos index.html ```htmlmixed= <html> <head> <title>Curso Javascript - App ToDo</title> </head> <body> <div id="app"> <ul></ul> <input type="text" placeholder="Digite um ToDo" /> <button>Adicionar</button> </div> <script src="todo.js"></script> </body> </html> ``` todo.js ```javascript var listElement = document.querySelector("#app ul"); var inputElement = document.querySelector("#app input"); var buttonElement = document.querySelector("#app button"); var todos = ["Fazer cafe", "Estudar", "Acessar comunidade"]; function renderTodos() { listElement.innerHTML = ""; for (todo of todos) { var todoElement = document.createElement("li"); var todoText = document.createTextNode(todo); var linkElement = document.createElement("a"); linkElement.setAttribute("href", "#"); var pos = todos.indexOf(todo); linkElement.setAttribute("onclick", "deleteTodo(" + pos + ")"); var linkText = document.createTextNode("Excluir"); linkElement.appendChild(linkText); todoElement.appendChild(todoText); todoElement.appendChild(linkElement); listElement.appendChild(todoElement); } } renderTodos(); function addTodo() { var todoText = inputElement.value; todos.push(todoText); inputElement.value = ""; renderTodos(); } buttonElement.onclick = addTodo; function deleteTodo(pos) { todos.splice(pos, 1); renderTodos(); } ``` --- ### Salvando no Storage index.html ```htmlmixed= <html> <head> <title>Curso Javascript - App ToDo</title> </head> <body> <div id="app"> <ul></ul> <input type="text" placeholder="Digite um ToDo" /> <button>Adicionar</button> </div> <script src="todo.js"></script> </body> </html> ``` todo.js ```javascript var listElement = document.querySelector("#app ul"); var inputElement = document.querySelector("#app input"); var buttonElement = document.querySelector("#app button"); var todos = JSON.parse(localStorage.getItem("list_todos")) || []; function renderTodos() { listElement.innerHTML = ""; for (todo of todos) { var todoElement = document.createElement("li"); var todoText = document.createTextNode(todo); var linkElement = document.createElement("a"); linkElement.setAttribute("href", "#"); var pos = todos.indexOf(todo); linkElement.setAttribute("onclick", "deleteTodo(" + pos + ")"); var linkText = document.createTextNode("Excluir"); linkElement.appendChild(linkText); todoElement.appendChild(todoText); todoElement.appendChild(linkElement); listElement.appendChild(todoElement); } } renderTodos(); function addTodo() { var todoText = inputElement.value; todos.push(todoText); inputElement.value = ""; renderTodos(); saveToStorage(); } buttonElement.onclick = addTodo; function deleteTodo(pos) { todos.splice(pos, 1); renderTodos(); saveToStorage(); } function saveToStorage() { localStorage.setItem("list_todos", JSON.stringify(todos)); } ``` --- ## JS Assincrono ### Requisições AJAX index.html ```htmlmixed= <html> <head> <title>Curso Javascript</title> </head> <body> <div id="app"></div> <script src="main.js"></script> </body> </html> ``` main.js ```javascript var xhr = new XMLHttpRequest(); xhr.open("GET", "https://api.github.com/users/woneybranga"); xhr.send(null); xhr.onreadystatechange = function() { if (xhr.readyState === 4) { console.log(JSON.parse(xhr.responseText)); } } ``` --- ### Promisses index.html ```htmlmixed= <html> <head> <title>Curso Javascript</title> </head> <body> <div id="app"></div> <script src="main.js"></script> </body> </html> ``` main.js ```javascript var minhaPromisse = function() { return new Promise(function(resolve, reject) { var xhr = new XMLHttpRequest(); xhr.open("GET", "https://api.github.com/users/woneybranga"); xhr.send(null); xhr.onreadystatechange = function() { if (xhr.readyState === 4) { if (xhr.status === 200) { resolve(JSON.parse(xhr.responseText)); } else { reject("Erro na Reqisicao"); } } }; }); }; minhaPromisse() .then(function(response) { console.log(response); }) .catch(function(error) { console.warn(error); }); ``` --- ### Utilizando Axios ```htmlmixed= <html> <head> <title>Curso Javascript</title> </head> <body> <div id="app"></div> <script src="https://unpkg.com/axios/dist/axios.min.js"></script> <script src="main.js"></script> </body> </html> ``` ```javascript axios .get("https://api.github.com/users/woneybranga") .then(function(response) { console.log(response); }) .catch(function(error) { console.warn(error); }); ``` --- ### Desafio - Exercícios: Módulo 04 #### 1º exercício Crie uma função que recebe a idade de um usuário e retorna uma Promise que depois de 2 segundos retornará se usuário é maior ou não que 18 anos. Se o usuário ter mais que 18 anos de idade o resultado deve cair no ==.then==, caso contrário, no ==.catch== ```javascript function checaIdade(idade) { // Retornar uma promise } checaIdade(20) .then(function() { console.log("Maior que 18"); }) .catch(function() { console.log("Menor que 18"); }); ``` ##### Solução ```javascript var checaIdade = function(idade) { return new Promise(function(resolve, reject) { if (idade >= 18) { resolve(); } else { reject(); } }); }; checaIdade(18) .then(function() { console.log("Maior que 18"); }) .catch(function() { console.log("Menor que 18"); }); ``` #### 2º exercício Crie uma tela com um ==<input>== que deve receber o nome de um usuário no Github. Após digitar o nome do usuário e clicar no botão buscar a aplicação deve buscar pela API do Github (conforme URL abaixo) os dados de repositórios do usuário e mostrá-los em tela: URL de exemplo: *https://api.github.com/users/diego3g/repos* Basta alterar "diego3g" pelo nome do usuário. ```javascript <input type="text" name="user"> <button onclick="">Adicionar</button> ``` Depois de preencher o input e adicionar, a seguinte lista deve aparecer abaixo: ```htmlmixed= <ul> <li>repo1</li> <li>repo2</li> <li>repo3</li> <li>repo4</li> <li>repo5</li> </ul> ``` --- ##### Solução index.html ```htmlmixed= <html> <head> <title>Curso Javascript</title> </head> <body> <div id="app"> <input type="text" name="usuario" value="woneybranga" /> <button id="consultar">Consultar</button> <ul id="lista"></ul> <div id="erro"></div> </div> <script src="https://unpkg.com/axios/dist/axios.min.js"></script> <script src="main.js"></script> </body> </html> ``` main.js ```javascript var app = document.querySelector("#app"); var erroElement = document.querySelector("#erro"); var inputElement = document.querySelector("input[name=usuario]"); var btnElement = document.querySelector("#consultar"); var listElement = document.querySelector("#lista"); function pegaRepos(userGit) { axios .get("https://api.github.com/users/" + userGit + "/repos") .then(function(response) { listElement.innerHTML = ""; for (iten of response.data) { var liElement = document.createElement("li"); var liText = document.createTextNode(iten.name); liElement.appendChild(liText); listElement.appendChild(liElement); } }) .catch(function(error) { listElement.innerHTML = ""; var h3Element = document.createElement("h3"); var h3Text = document.createTextNode("Erro 404!"); h3Element.appendChild(h3Text); erroElement.appendChild(h3Element); }); } function processaBtn() { listElement.innerHTML = ""; erroElement.innerHTML = ""; pegaRepos(inputElement.value); } btnElement.onclick = processaBtn; ``` --- #### 3º exercício A partir do resultado do exemplo anterior adicione um indicador de carregamento em tela no lugar da lista apenas enquanto a requisição estiver acontecendo: ```htmlmixed= <li>Carregando...</li> ``` Além disso, adicione uma mensagem de erro em tela caso o usuário no Github não exista. Dica: Quando o usuário não existe, a requisição irá cair no ==.catch== com código de erro 404. --- ##### Solução index.html ```htmlmixed= <html> <head> <title>Curso Javascript</title> </head> <body> <div id="app"> <input type="text" name="usuario" value="woneybranga" /> <button id="consultar">Consultar</button> <ul id="lista"></ul> <div id="erro"></div> </div> <script src="https://unpkg.com/axios/dist/axios.min.js"></script> <script src="main.js"></script> </body> </html> ``` main.js ```javascript var app = document.querySelector("#app"); var erroElement = document.querySelector("#erro"); var inputElement = document.querySelector("input[name=usuario]"); var btnElement = document.querySelector("#consultar"); var listElement = document.querySelector("#lista"); function pegaRepos(userGit) { axios .get("https://api.github.com/users/" + userGit + "/repos") .then(function(response) { listElement.innerHTML = ""; for (iten of response.data) { var liElement = document.createElement("li"); var liText = document.createTextNode(iten.name); liElement.appendChild(liText); listElement.appendChild(liElement); } }) .catch(function(error) { listElement.innerHTML = ""; var h3Element = document.createElement("h3"); var h3Text = document.createTextNode("Erro 404!"); h3Element.appendChild(h3Text); erroElement.appendChild(h3Element); }); } function processaBtn() { listElement.innerHTML = ""; erroElement.innerHTML = ""; tagCarregando(); pegaRepos(inputElement.value); } function tagCarregando() { var liElement = document.createElement("li"); var liText = document.createTextNode("Carregando..."); liElement.appendChild(liText); listElement.appendChild(liElement); } btnElement.onclick = processaBtn; ``` ---