javascript - 在 setTimeout 中使用时添加和删除类会产生竞争条件

标签 javascript jquery

一个对象上有 2 个对象,需要让它们都获取类:

<script>
$(document).ready(function(){
    var delayMillis = 200; 
    $('#overtop').hover(function(){ $('#honemove').addClass('hover');}, function () { setTimeout(function() { $('#honemove').removeClass('hover'); }, delayMillis); });
    $('#overtop').hover(function(){ setTimeout(function() { $('#htwomove').addClass('hover'); }, delayMillis); }, function () { $('#htwomove').removeClass('hover'); });
});
</script>

<div id="overtop" class="overlay"></div>
<h1 id="honemove" class="h1a"><span>TITLE OF THE TITLE</span></h1>
<h2 id="htwomove"><span>INFO BELLOW TITLE</span></h2>

它目前可以工作,但如果你进行大量鼠标悬停,它会出现故障,CSS 部分很好,我想它不喜欢在一个操作上有两个单独的脚本。

最佳答案

使用clearTimeout防止发生任何类型的竞争条件:

$(document).ready(function() {
  var $overtop = $('#overtop')
  var $honemove = $('#honemove')
  var $htwomove = $('#htwomove')
  
  var delay = 200
  var token
  
  $overtop.hover(function() {
    clearTimeout(token)
    $honemove.addClass('hover')
    token = setTimeout(function() {
      $htwomove.addClass('hover')
    }, delay)
  }, function() {
    clearTimeout(token)
    $htwomove.removeClass('hover')
    token = setTimeout(function() {
      $honemove.removeClass('hover')
    }, delay)
  })
});
.hover {
  color: #f00;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="overtop" class="overlay">Overlay</div>
<h1 id="honemove" class="h1a"><span>TITLE OF THE TITLE</span></h1>
<h2 id="htwomove"><span>INFO BELLOW TITLE</span></h2>

关于javascript - 在 setTimeout 中使用时添加和删除类会产生竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43439523/

相关文章:

javascript - React 表中的嵌套对象数组

jquery - 如何使用默认浏览器警报覆盖 jQuery 验证插件消息

php - 在 div 中加载 ajax 后运行 javascript 代码

javascript - 检查div的加载时间

javascript - 谷歌地图标记,多个单独的事件

javascript - Symfony2 : Highchartsbundle data problems

javascript - 窗口调整大小脚本有意想不到的副作用

javascript - 从 jquery 中的另一个 javascript 调用函数

javascript - 如何使用 Node.js 为所有连接最好地实现 HTTPS?

jquery - 为 sencha-touch 中的 jquery 转换预加载 css-background-images