繁体   English   中英

jQuery / Javascript:setInterval检查DOM元素是否存在?

[英]jQuery/Javascript: setInterval check if DOM element exists?

var check; 函数showLoader(){$('#mc_signup_form')。prepend('loading ...'); 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()不存在吗? 我正在showLoader()函数内部启动setInterval。 它应该触发check_trigger。 当两个div(.mc_error_msg或.mc_success_msg)之一存在时,我想清除时间间隔。

我究竟做错了什么?

应该只在单引号或双引号之外删除check_trigger ...

避免双重评估

通过将该函数加quotes ,ECMA- / Javascript将eval该代码,这简直令人难以置信。 因此,请始终通过setTimeout / setInterval使用function reference

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就可以删除对象。

还可以使用setTimeout而不是setInterval,以便摆脱全局变量

我发现将字符串传递给setTimeoutsetInterval只会导致问题:)

尝试:

setInterval(check_trigger, 300);

此处将各种建议合并为简化版本,无论定义范围如何,它都应起作用。

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 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM