jQuery / Javascript: SetInterval vérifier si l'élément DOM existe?
-
25-09-2019 - |
Question
cocher var; showLoader fonction () { . $ ( '# Mc_signup_form') précédez ( 'loading ...'); check_init (); }
function check_init() {
check = setInterval('check_trigger()', 300);
}
function check_clear() {
clearInterval(check);
}
function check_trigger() {
if ( $('.mc_error_msg').length == 0 || $('.mc_success_msg').length == 0 ) {
$('#mc_signup_form .loading').remove();
check_clear();
}
}
Je me demande pourquoi mon navigateur ne cesse de me dire que check_trigger () n'existe pas? J'initiant une setInterval à l'intérieur de ma fonction showLoader (). Il devrait déclencher check_trigger. Lorsque l'un des deux divs (.mc_error_msg ou .mc_success_msg) existe, je veux effacer l'intervalle.
Qu'est-ce que je fais mal?
La solution
Je trouve la transmission de chaînes setTimeout
et setInterval
mène juste à des problèmes:)
Essayez:
setInterval(check_trigger, 300);
Autres conseils
il doit être check_trigger seulement enlever en dehors du guillemet simple ou double ...
utiliser aussi setTimeout au lieu de setInterval de sorte que vous pouvez vous débarrasser de la variable globale
éviter une double évaluation
En mettant cette fonction dans quotes
, ECMA / Javascript sera eval
ce code, qui est juste slow'ish incroyable. Il faut donc toujours utiliser un function reference
setTimeout
de acceptés dans / setInterval
:
setInterval(function(){
check_trigger();
}, 300);
ou directement
setInterval(check_trigger, 300);
Si vous supprimez les éléments en question par vous-même quelque part, il pourrait être une approche intéressante à crochet la méthode jQuery .remove()
ou .detach()
(Si vous appelez ceux pour enlever l'élément).
Cela pourrait ressembler à:
var hookRemove = $.fn.remove;
$.fn.remove = function(){
if(this.id === 'something'){
// hoorray! we found it
}
hookRemove.apply(this, arguments);
};
Rappelez-vous face à un Vous êtes en train jQuery object
dans le crochet. Donc en fait this
pourrait aussi être un wrapped set
d'éléments. Par conséquent, un appel à
this.each(function(){
});
dans le crochet devrait être plus enregistrer pour vérifier. De cette façon, vous avez une connaissance de exact
quand un objet est retiré sans intervall timer
.
La combinaison des différentes suggestions ici est la version simplifiée qui devrait fonctionner quelle que soit la portée dans laquelle il est défini.
function showLoader () {
$('#mc_signup_form').prepend('<span class="loading"> loading …</span>');
setTimeout (function check_trigger () {
if ( $('.mc_error_msg').length == 0 || $('.mc_success_msg').length == 0 ) {
$('#mc_signup_form .loading').remove();
} else {
setTimeout (check_trigger, 300);
}
}, 300);
}