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?

Était-ce utile?

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 &hellip;</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); 
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top