jQuery / JavaScript: setinterval Проверьте, существует ли элемент DOM?

StackOverflow https://stackoverflow.com/questions/3402893

  •  25-09-2019
  •  | 
  •  

Вопрос

чек var; Функция Showloader () {$ ('# mc_signup_form'). Prepend («Загрузка ...»); 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();
        }
    }

Интересно, почему мой браузер продолжает говорить мне, что check_trigger () не существует? Я инициирую Setinterval внутри моей функции ShowLoyer (). Он должен вызвать check_trigger. Когда одна из двух Divs (.mc_error_msg или .mc_success_msg) существует, я хочу очистить интервал.

Что я делаю неправильно?

Это было полезно?

Решение

Я нахожу проходящие строки к setTimeout а также setInterval Просто приводит к проблемам :)

Пытаться:

setInterval(check_trigger, 300);

Другие советы

Это должно быть Check_trigger только удаление за пределами одного или двойной цитаты ...

Также используйте Settimeout вместо SetInterval, чтобы вы могли избавиться от глобальной переменной

Избегайте двойной оценки

Поместив эту функцию в quotes, Ecma- / JavaScript будет eval Этот код, который просто невероятно медленный. Так что всегда используйте function reference сочетание setTimeout / setInterval:

setInterval(function(){
    check_trigger();
}, 300);

или напрямую

setInterval(check_trigger, 300);

Если вы извлекаете элементы, рассматриваемые вами где-нибудь, это может быть интересный подход к крюк то jQuery .remove() или .detach() Способ (если вы называете их, чтобы удалить элемент).

Это может выглядеть как:

var hookRemove = $.fn.remove;

$.fn.remove    = function(){
    if(this.id === 'something'){
       // hoorray! we found it
    }

    hookRemove.apply(this, arguments);
};

Помните, что вы имеете дело с jQuery object внутри крючка. Так на самом деле this также может быть wrapped set элементов. Поэтому звонок

this.each(function(){
});

Внутри крючка должно быть больше сохранения для проверки. Таким образом у вас есть exact Знание, когда объект удален без intervall timer.

Объединение различных предложений вот как упрощенная версия, которая должна работать независимо от объема, в которой она определяется.

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); 
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top