【问题标题】:setTimeout with multiple itemssetTimeout 与多个项目
【发布时间】:2015-01-15 00:40:27
【问题描述】:

我尝试对多个具有 ul 和 li 的 li 项目设置一个 setTimeout 函数。幻灯片动画效果很好,但我想在再次关闭 slideUp 之前有一个延迟。但它不起作用。幻灯片下降但没有再次上升。我认为这是因为我必须为每个 li ul (索引)设置索引 setTimeout 函数。但我不知道如何让它工作。谁能指出我正确的方向?谢谢!

var menu = $('#menu').find('li').has('ul'); 
var timer;
menu.on('mouseenter', function(){
  clearTimeout(timer);
  $(this).find('>ul').stop().slideDown();                       
});

menu.on('mouseleave', function(){
  clearTimeout(timer);
  timer = setTimeout(function() {
    $(this).find('>ul').stop().slideUp();
  },1000);
});

【问题讨论】:

  • 为什么$('#menu').find('li').has('ul')要查找两次?将其存储在变量中或使用链接。
  • 这只是为了更好地概述。上面改了。

标签: javascript jquery timer


【解决方案1】:

问题是你有多个 lis,它们会取消打开的。您需要为每个 li 分配超时,或者您需要查看它们是否是另一个 li 打开以关闭它。

var lis = $('#menu').find('li').has('ul');

lis.on('mouseenter', function(){
    var li = $(this);
    var timer = li.data("timer");    
    clearTimeout(timer);
    $(this).find('>ul').stop().slideDown();                         
});

lis.on('mouseleave', function(){
    var li = $(this);
    var timer = setTimeout(function() {
            $(this).find('>ul').stop().slideUp();
        },1000);
    li.data("timer", timer);
});

【讨论】:

  • 谢谢!这绝对是合乎逻辑的。我尝试了将超时值分配给 lis 的解决方案。但它不起作用。出于任何原因,计时器值未存储在 li 元素中。
  • 好吧 :-) 必须将计时器定义为字符串,因为 jquery 的数据函数需要一个字符串。非常感谢 epascarello !!!
猜你喜欢
  • 2020-01-11
  • 1970-01-01
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
相关资源
最近更新 更多