javascript - 使用 javascript 清除超时

标签 javascript jquery hover timeout

我遇到了某种变量超出范围的问题或其他问题。在下面的函数中,我根据鼠标是否进入或退出来创建或清除超时。看来,即使一旦创建了超时,它在重新进入时也会返回未定义。不确定我在这里做错了什么,感谢您的帮助!

jsFiddle example

JavaScript:(特定问题在第 35 行的 else 条件中

var navLinks = $('nav li.sub');

navLinks.mouseenter(function(){

  console.log('hovering on link');

  var thiis   = $(this),
      subList = thiis.find('ul'),
      autoClose;

  if (!thiis.hasClass('out')){

    console.log('isnt out');

    /* Link */

    thiis

    /* Show submenu when entering link */

    .addClass('out')

    /* Hide submenu when exiting link */

    .mouseleave(function(){

      autoClose = setTimeout(function(){

        thiis.removeClass('out');
      }, 1000);


      console.log('exiting link: timeout active', autoClose);
    });
  } else {

    console.log ('is out', autoClose);

    if (autoClose){

      console.log('is out: clear timeout');

      clearTimeout(autoClose);
    }
  }
});

最佳答案

技术,

简单的答案是将 var autoClose 移至外部作用域,但我认为您可以(并且应该)做更多的事情。

更具体地说,

  • 我认为您不想将 mouseleave 处理程序附加到 mouseenter 处理程序中。它可以从一开始就永久附着。
  • mouseenter 处理程序中,clearTimeout(autoClose)thiis.addClass('out') 可以无条件执行。测试 .hasclass('out') 并没有真正的经济性。

试试这个:

var navLinks = $('nav li.sub');
var autoClose;
navLinks.hover(function(){
    var thiis = $(this);
    clearTimeout(autoClose);
    thiis.addClass('out');
}, function(){
    var thiis = $(this);
    autoClose = setTimeout(function(){
        thiis.removeClass('out');
    }, 1000);
});

关于javascript - 使用 javascript 清除超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14330265/

相关文章:

javascript - 使用 future 日期的小时、分钟和秒创建计时器倒计时

javascript - 将 "username"值从一个组件传递到 Angular 2 中的另一个组件

javascript - Jquery 计算元素中的字符并给太短的字符填充

javascript - 使用 Angular 生成动态可点击的 Bootstrap 选项卡

javascript - 通过 JSON 在 Node 服务器和 Web 客户端上使用对象方法?

jquery - 页面加载后的文字效果展示

javascript - Bootstrap 工具提示未出现

javascript - 格式化 HighCharts 散点图中悬停系列的所有标记

html - 特定尺寸的 CSS Hover

html - 在将鼠标悬停在另一个 div 上时更改一个 div 的不透明度