Puro Javascript - Evento "click" em elementos criados dinamicamente após carregamento do DOM

watch_later domingo, julho 30, 2017

Versão com puro Javascript:


Primeiro criamos esta pequena função que vai separar as classes do elemento individualmente caso este tenha multiplas classes utilizando o .split(), logo em seguida utilizando o .indexOf() indicamos-lhe para começar a procura do nome da classe com o index de -1, que basicamente é verificar por algo que ainda não está neste grupo.

Tem Classe?

function temClasse(elem, className) {
    return elem.className.split(' ').indexOf(className) > -1;
}

Em seguida então vamos controlar o que se passa no evento clique.

No primeiro exemplo que postei, tinha apontado o clique para o documento mas corrigi agora apontando-o para o elemento parent que é uma melhor prática pois assim não estamos a verificar cliques no documento mas sim no elemento alvo que é o que nos interessa.

Quando ocorre um click no elemento parent, que neste caso será a classe .container, vamos verificar com o if se este clique foi no elemento alvo (target) com a classe el-alvo ou não, juntamente nesta mesma verificação do if iremos correr a função temClass para procurar por novos elementos indexOf() > -1.

Clicou no elemento alvo?

var container = document.querySelector('.container');
container.addEventListener('click', function (e) {
    if (temClasse(e.target, 'el-alvo')) {
        alert(e.target.id);
    }
});

Recapitulando esta parte, sempre que ocorrer um clique no .container, => if/se este clique foi num elemento child com a classe .el-alvo juntamente verifica também se existem novos elementos => faz alguma coisa.

Exemplo:


var container = document.querySelector('.container');

// Código abaixo não interessa. Apenas para criar novos elementos
document.getElementById('add-el').addEventListener('click', function() {
    var el = document.createElement('li');
    var id = Math.floor(Math.random() * 2000);
    el.id = id;
    el.className = 'el-alvo';
    el.innerHTML = id;
    container.appendChild(el);
});

function temClasse(elem, className) {
    return elem.className.split(' ').indexOf(className) > -1;
}
container.addEventListener('click', function (e) {
    if (temClasse(e.target, 'el-alvo')) {
        alert(e.target.id);
    }
});

.container li {
    padding: 5px;
    background-color: #fff;
    color: #000;
}

.container li:nth-child(odd) {
    background-color: #eee;
}

<ul class="container">
    <li id="primeiro" class="el-alvo">primeiro</li>
    <li id="segundo" class="el-alvo">segundo</li>
    <li id="terceiro" class="el-alvo">terceiro</li>
</ul>
<button id="add-el" type="button">Add li</button>

Exemplo online no jsFiddle: https://jsfiddle.net/shuffledPixels/Lqvw7ehL/

> Mais sobre o split() aqui: w3schools - split() Method
> Mais sobre o indexOf() aqui: w3schools - indexOf() Method


Versão jQuery seria algo como:


Com jQuery seria algo mais curto como neste exemplo abaixo:

// Código abaixo não interessa. Apenas para criar novos elementos
document.getElementById('add-el').addEventListener('click', function() {
    var el = document.createElement('li');
    el.className = "el-alvo";
    var id = Math.floor(Math.random() * 2000);
    el.id = id;
    el.innerHTML = id;
    document.querySelector('.container').appendChild(el);
});

// com jQuery
$('.container').on('click', '.el-alvo', function(e) {
    alert(e.target.id);
});

.container li {
    padding: 5px;
    background-color: #fff;
    color: #000;
}

.container li:nth-child(odd) {
    background-color: #eee;
}

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<ul class="container">
    <li id="primeiro" class="el-alvo">primeiro</li>
    <li id="segundo" class="el-alvo">segundo</li>
    <li id="terceiro" class="el-alvo">terceiro</li>
</ul>
<button id="add-el" type="button">Add li</button>

Exemplo online no jsFiddle: https://jsfiddle.net/shuffledPixels/Lgys7Lbn/
click, clique, event, pure, vanilla, js, get, obter,

Related Posts