我试过这个js代码:
<script type="text/javascript">
$(document).ready( function() {
var timer;
$('.top-menu-first-ul li').hover(function(){
if(timer) {
clearTimeout(timer);
timer = null
}
timer = setTimeout(function() {
$(this).find('ul').slideToggle(100);
}, 500)
},
// mouse out
});
});
</script>
使用这个html:
<ul class="top-menu-first-ul">
<li>
<a href="http://google.com">Google</a>
<ul class="top-menu-second-ul">
<li><a href="http://translate.google.com">Google Translate</a></li>
<li><a href="http://images.google.com">Google Images</a></li>
<li><a href="http://gmail.google.com">Gmail</a></li>
<li><a href="http://plus.google.com">Google Plus</a></li>
</ul>
</li>
<li>
<a href="http://facebook.com">Facebook</a>
</li>
<li>
<a href="http://twitter.com">Twitter</a>
</li>
</ul>
但它不起作用。
我希望在鼠标悬停时显示子菜单谷歌链接和其他将在300ms后出现。
因此,我需要阻止加载子菜单,当用户快速将鼠标悬停在其上并且不会停留在悬停链接上至少300毫秒。
然后我需要在他离开链接时停止执行代码(或向上滑动)。因为如果他经常一次又一次地翻过来然后回到一个副本,他就会停止盘旋,而代码仍在执行自己多少次将鼠标悬停在链接上。我需要以某种方式防止这种情况发生。
编辑:如果可能的话,我需要在没有像hoverIntent等插件的情况下解决这个问题,只需简单的javascript和jQuery答案 0 :(得分:6)
使用stop()
防止动画怪异,delay()
等待300毫秒。另外hover()
已被弃用我建议改为使用on()
:
$('.top-menu-first-ul li').on({
mouseover: function() {
$(this).find('ul').stop(1,1).delay(300).slideDown(100);
},
mouseleave: function() {
$(this).find('ul').stop(1,1).slideUp(100);
}
});
答案 1 :(得分:3)
我认为问题在于你在函数内使用$(this)
,在超时中调用。此闭包内的$(this)
与外部不同(jQuery事件处理程序内部为jQuery设置它)。 Here (jsfiddle)是解决方案:
$(document).ready( function() {
$('.top-menu-first-ul li').mouseenter(mouseIn);
$('.top-menu-first-ul li').mouseout(mouseOut);
});
function mouseIn(e){
var target = $(this);
var timer = setTimeout(function() {
target.find('ul').slideDown(100);
}, 500);
target.attr("data-timer", timer);
}
function mouseOut(e){
var target = $(this);
var timer = target.attr("data-timer");
if(timer){
clearTimeout(timer);
}
target.find('ul').slideUp(100)
}
UPDATE 此解决方案基于您的解决方案,但我建议使用@ elclanrs的解决方案,因为它更好(更具可读性,使用适用于此的jQuery API)。