I suggest you use one of these 3 ways to check:
Setting a property on the
First of all I recommend you read this:
So if the structure is really simple the way it did, and the elements are always LIs then a setTimeout
that would check the ones that already have the property or not:
// Função a ser executada
function fazAlgoNaLI() {
if (this.alterado) return; //Ignora se já tiver a propriedade
this.alterado = true;
$(this).addClass('alterada');
}
// Agora vamos adicionando elementos após e preciso executar a funcion quando esse elemento for adicionado
setInterval(function() {
$('.foo').append('<li>Nova linha</li>');
}, 1000);
/* verifica alterações*/
var quantidade = 0;
(function mutacao() {
var lis = $('.foo > li');
//verifica se a quantidade aumentou
if (quantidade !== lis.length) {
lis.each(fazAlgoNaLI);
quantidade = lis.length; //Atualiza a ultima quantidade
}
setTimeout(mutacao, 100);
})();
.alterada {
color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><ulclass="foo">
<li>Linha 1</li>
<li>Linha 2</li>
<li>Linha 3</li>
</ul>
Using the :not(...)
Or you can just pick the ones that do not have the class="alterada"
class, so use the :not(...)
selector, do so:
// Função a ser executada
function fazAlgoNaLI() {
$(this).addClass('alterada');
}
// Agora vamos adicionando elementos após e preciso executar a funcion quando esse elemento for adicionado
setInterval(function() {
$('.foo').append('<li>Nova linha</li>');
}, 1000);
(function mutacao() {
var lis = $('.foo > li:not(.alterada)'); //Pega somente elementos que não tiverem a classe alterada
lis.each(fazAlgoNaLI);
setTimeout(mutacao, 100);
})();
.alterada {
color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><ulclass="foo">
<li>Linha 1</li>
<li>Linha 2</li>
<li>Linha 3</li>
</ul>
Using MutationObserver
You can use MutationObserver
checking with combined addedNodes
, only new elements added, and then you can combine with .filter
, from jQuery to check if it's a valid tag, or check if was an added LI:
// Função a ser executada
function fazAlgoNaLI() {
$(this).addClass('alterada');
}
// Agora vamos adicionando elementos após e preciso executar a funcion quando esse elemento for adicionado
setInterval(function() {
$('.foo').append('<li>Nova linha</li>');
}, 1000);
/* verifica alterações*/
var isReady = 0;
var observer = new MutationObserver(function( mutations ) {
mutations.forEach(function( mutation ) {
var nn = mutation.addedNodes;
if (nn !== null) {
console.log("Foi adicionado " + nn.length + " novo elemento");
$(nn).filter('li').each(fazAlgoNaLI);
}
});
});
var config = {
childList: true
};
//Inicia o observador
observer.observe($(".foo").get(0), config);
.alterada {
color: red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><ulclass="foo">
<li>Linha 1</li>
<li>Linha 2</li>
<li>Linha 3</li>
</ul>