【问题标题】:jQuery/Javascript: setInterval check if DOM element exists?jQuery/Javascript:setInterval 检查 DOM 元素是否存在?
【发布时间】:2011-03-25 02:12:42
【问题描述】:

变量检查; 函数显示加载器(){ $('#mc_signup_form').prepend('正在加载...'); 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() 放在 check_init() 上面吗?
  • @mathiregister,代码的范围是什么?因为 setInterval() 将在“window”/全局对象下运行,它可能找不到 check_trigger()。

标签: javascript jquery setinterval


【解决方案1】:

应该是check_trigger只去掉单引号或双引号外...

【讨论】:

    【解决方案2】:

    也可以使用 setTimeout 代替 setInterval,这样你就可以摆脱全局变量

    【讨论】:

      【解决方案3】:

      避免重复评估

      通过将该函数放入quotes,ECMA-/Javascript 将eval 该代码,这简直是难以置信的慢。所以总是使用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);
      };
      

      请记住,您正在处理钩子中的jQuery object。所以实际上this 也可以是元素的wrapped set。因此调用

      this.each(function(){
      });
      

      在钩子内应该更节省检查。这样,您就可以在没有 intervall timer 的情况下删除对象的 exact 知识。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          试试:

          setInterval(check_trigger, 300);
          

          【讨论】:

          • 是的,直接传函数就好了:)
          猜你喜欢
          • 1970-01-01
          • 2014-11-14
          • 1970-01-01
          • 2011-10-23
          • 2014-02-17
          • 2011-06-26
          • 2011-07-14
          • 2012-12-05
          相关资源
          最近更新 更多