jQuery / Javascript: setInterval проверить, существует ли элемент DOM? - PullRequest
1 голос
/ 04 августа 2010

проверка вар; function showLoader () { $ ('# mc_signup_form'). prepend ('loading & hellip;'); 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 внутри моей функции showLoader (). Это должно вызвать check_trigger. Когда существует один из двух div (.mc_error_msg или .mc_success_msg), я хочу очистить интервал.

Что я делаю не так?

Ответы [ 5 ]

1 голос
/ 04 августа 2010

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

1 голос
/ 04 августа 2010

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

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

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

или напрямую

setInterval(check_trigger, 300);

Если вы удаляете эти элементы где-то самостоятельно, это может быть интересным подходом к hook методу 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.

1 голос
/ 04 августа 2010

check_trigger следует удалять только за пределами одинарных или двойных кавычек ...

0 голосов
/ 04 августа 2010

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

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); 
}
0 голосов
/ 04 августа 2010

Я считаю, что передаваемые строки в setTimeout и setInterval просто приводят к проблемам:)

Попытка:

setInterval(check_trigger, 300);
...