【问题标题】:javascript: stop setInterval after element removaljavascript:删除元素后停止 setInterval
【发布时间】:2012-05-20 06:23:21
【问题描述】:

我想在删除包含setInterval函数的div后自动执行clearInterval函数,这个div是ajax响应的结果,因为它在删除div后不会自行停止。

$('#element').mouseover(function(){
     $.post('ajax/ajax.php', function(data) {
         $('<div id="tooltip'></div>").appendTo("div#main");
         $('#tooltip').html(data);
         $('#tooltip').show();
     });
}).mouseout(function(){
     clearInterval(intervalId);
     $('#tooltip').empty();
     $('#tooltip').remove();
});

ajax 响应 data 包含带有间隔 Id 处理程序的 javascript setInterval 函数:

var intervalId = window.setInterval(pics_load, 3000);

我尝试使用Jquery unload,但同样的问题:

$('#tooltip').unload(function(){
     clearInterval(intervalId);
}

我也尝试在 ajax 响应中使用它:

$(window).unload(function(){
     clearInterval(intervalId);
}

【问题讨论】:

  • 如果我们看不到它是如何声明的,就很难知道如何清除间隔。
  • intervalId 是否在块范围内声明?如果是,您将失去它。在 clearInterval 之前检查 intervalId 是否未定义
  • 我在ajax响应中声明,在ajax调用后执行
  • 我建议不要在 ajax 响应中声明这样的东西......他们只会混淆事情
  • 我能看到 AJAX 代码吗?您可能想尝试在全局范围内设置 intervalId - 即 window.intervalId = setInterval(blah);然后 clearInterval(window.intervalId)

标签: javascript jquery setinterval clearinterval


【解决方案1】:

您是否尝试过使用$.data 将intervalId 存储在#element 本身上?

$('#element').mouseover(function() {
     var $this = $(this);
     $.post('ajax/ajax.php', function(data) {
         $('<div id="tooltip'></div>").appendTo("div#main");
         $('#tooltip').html(data);
         $('#tooltip').show();
         // save interval id here
         var intervalId = setInterval('pics_load', 3000);
         $this.data('intervalId', intervalId);
     });
}).mouseout(function(){
     // retrieve intervalId here
     var intervalId = $(this).data('intervalId');
     clearInterval(intervalId);
     $('#tooltip').empty();
     $('#tooltip').remove();
});

【讨论】:

    【解决方案2】:

    我仍然对你想要做的事情感到困惑......所以我会假设:

    • 每当用户超过您的#element 时,您想从服务器获取帮助描述并且用户很快就会移除对该元素的关注,您想隐藏帮助描述

    Witch 听起来很合理……但是setInterval() 是在哪里出现的?为什么需要使用这些方法?您只想在第一次操作时显示它?

    作为一名优秀的开发人员,我会这样做:

    • 仅在第一次向服务器询问该帮助说明,因此一旦您有多个用户,我可以在服务器上节省一些负载。
    • 使用data- 属性保存描述并在可用时重新使用它们
    • 请注意,您可以预先填充它们。

    我假设的 HTML

    <div class="container">
        <h1>Stackoverflow</h1>
        <ul>
          <li>Element 1</li>
          <li>Element 2</li>
          <li>Element 3</li>
          <li>Element 4</li>
          <li>Element 5</li>
        </ul>
    </div>
    

    作为 jQuery,我会做这样的事情

    $(function() {
    
      $("ul li").hover(
        function() {
          // on mouse over
    
          if($(this).prop("data-tooltip") === undefined) {
            // use $.post() and retrieve the tooltip description,
            //   then place it on data-tooltip property
    
            $.post('ajax/ajax.php', function(data) {               
              // save for next time
              $(this).prop("data-tooltip", data);
              // show
              tooltip($(this), $(this).prop("data-tooltip")); 
            });
          }
          else { 
            // show saved description
            tooltip($(this), $(this).prop("data-tooltip"));
          }
    
        },
        function() {
          // on mouse out          
          tooltip();          
        }
      );  
    
    });
    
    function tooltip(elm, msg) {
      if(msg)
        $("<span class='tooltip' />").stop().html(msg).appendTo(elm).show();
      else 
        $(".tooltip").hide();
    }
    

    作为一个简单的例子,这里是一个Live Demo on JsBin


    如果您想进一步缩小代码,可以使用 CSS 框架来帮助您。

    This is the same example,但现在使用Bootstrap Tooltip

    【讨论】:

    • 我正在尝试在工具提示内制作图片轮播,并且每个工具提示元素中的图片都不同。所以我必须在每个 ajax 请求中设置间隔并在删除工具提示后清除它。这是 ajax 响应:
    • 但是为什么你一直在为工具提示汇集服务器呢?如果您已经知道图像,为什么不填充工具提示,例如,data-tooltip 并使用 jQuery 只是在图像上显示...
    • 因为我有超过 50,000 个结果,并且每个结果都有从数据库中提取的不同图像,所以我使用 setinterval 在每个工具提示中制作图片滑块。
    • 我怀疑用户会看到所有 50.000 张图像......如果您正在合并图像位置,那么获取工具提示也一定更容易......有很多滑块为你做这个。结帐Nivo Slider 例如
    【解决方案3】:

    在块外声明intervalId,分配时不要使用var。 在设置间隔之前检查 intervalId 是否仍然未使用也是一个好主意。

    var intervalId=null;
    $('#element').mouseover(f    unction(){
         $.post('ajax/ajax.php', function(data) {
             $('<div id="tooltip'></div>").appendTo("div#main");
             $('#tooltip').html(data);
             $('#tooltip').show();
         //somewhere inside this should be:
         if (!intervalId) ... //then set the interval
     });
    }).mouseout(function(){
         clearInterval(intervalId);
         intervalId=null;
         $('#tooltip').empty();
         $('#tooltip').remove();
    });
    

    【讨论】:

    • 不幸的是,它不起作用,因为 intervalId 处理程序位于 ajax 响应本身内部(我的意思是 javascript 代码在 ajax 响应内部执行,然后将其附加到#main div。
    • 我尝试在 $('#tooltip').show(); 之后设置间隔然后使用“jquery filter function”将结果附加到ajax响应中,但我做不到。
    • 好吧,如果你使用 var intervalId 它仍然是一个局部变量,碰巧与另一个同名但值仍然会丢失,你的响应代码可能不会使用 var
    • 仍然没有工作,因为您必须在这个 intervalId 和 ajax 响应中的远程 intervalId 之间建立关系。
    • 是的,它被定义为对象,但是定义它有什么用处,它与 ajax 响应中的远程 intervalId 之间没有关系? .. 当我输入 clearInterval(intervalId) 我的意思是远程 intervalId 不是这个本地 intervalId
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 2014-09-05
    • 2010-09-11
    相关资源
    最近更新 更多