2010-08-04 68 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); 
}