2010-08-04 5 views
1

var check; Функция showLoader() { $ ('# mc_signup_form'). Prepend ('loading & hellip;'); check_init(); }jQuery/Javascript: setInterval проверить, существует ли элемент DOM?

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), я хочу очистить интервал.

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

+0

Вы пытаетесь установить check_trigger() над check_init()? – airmanx86

+0

не имеет значения! – matt

+0

@mathiregister, в чем смысл кода? потому что setInterval() будет работать под «window»/global object, он может не найти check_trigger(). – airmanx86

ответ

0

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

Try:

setInterval(check_trigger, 300); 
+0

Да, просто передайте функцию напрямую :) – airmanx86

1

следует check_trigger удалить только снаружи одинарной или двойной кавычки ...

1

Не стоит ожидать двойной оценки

Положив эту функцию в 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(){ 
}); 

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

1

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

0

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

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); 
}