2010-08-04 58 views
1

var check; function showLoader(){ $('#mc_signup_form')。prepend('loading…'); 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()不存在? 我在我的showLoader()函數內啓動了一個setInterval。它應該觸發check_trigger。當兩個div(.mc_error_msg或.mc_success_msg)中的一個存在時,我想清除Interval。

我在做什麼錯?

+0

你有嘗試把check_trigger()放在check_init()之上嗎? – airmanx86 2010-08-04 05:41:47

+0

沒有什麼區別! – matt 2010-08-04 05:43:46

+0

@mathiregister,代碼的範圍是什麼?因爲setInterval()會在「window」/ global對象下運行,所以它可能找不到check_trigger()。 – airmanx86 2010-08-04 05:50:15

回答

0

我找到字符串傳遞到setTimeoutsetInterval只是導致問題:)

嘗試:

setInterval(check_trigger, 300); 
+0

是的,只需直接傳遞函數:) – airmanx86 2010-08-04 05:51:30

1

應該check_trigger只刪除單個或雙引號外面...

1

避免雙重評估

通過將該函數放入quotes,ECMA-/Javascript會代碼eval,這只是令人難以置信的slow'ish。因此請務必使用一個function reference withing 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); 
}; 

記住your're處理鉤內的jQuery object。所以實際上this也可能是一個wrapped set元素。因此致電

this.each(function(){ 
}); 

內鉤子應該更省下來檢查。這樣你就有了一個exact的知識,當沒有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); 
}