2

变量检查;function 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)存在时,我想清除间隔。

我究竟做错了什么?

4

5 回答 5

1

它应该是 check_trigger 仅在单引号或双引号之外删除...

于 2010-08-04T05:42:08.017 回答
1

避免双重评估

通过将该函数放入quotes,ECMA-/Javascript 将eval生成该代码,这简直是令人难以置信的缓慢。所以总是使用function referencewithing setTimeout/ setInterval

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

或直接

setInterval(check_trigger, 300);

如果您自己在某处删除有问题的元素,则挂钩jQuery .remove()or方法可能是一种有趣的.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.

于 2010-08-04T05:52:38.940 回答
1

也使用 setTimeout 而不是 setInterval 这样你就可以摆脱全局变量

于 2010-08-04T05:53:44.047 回答
1

结合此处的各种建议作为简化版本,无论其定义范围如何,它都应该有效。

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); 
}
于 2010-08-04T06:17:53.730 回答
0

我发现将字符串传递给setTimeout并且setInterval只会导致问题:)

尝试:

setInterval(check_trigger, 300);
于 2010-08-04T05:42:42.757 回答