[英]jQuery add class on mouseenter and remove it 500ms after mouseout
我有一個小菜單,想在懸停時將類添加到子菜單項中。 檢查您將了解的代碼:
HTML
<ul class="root">
<li>Menu1
<ul class="submenu">
<li>Menu11</li>
<li>Menu12</li>
</ul>
</li>
<li>Menu2
<ul class="submenu">
<li>Menu21</li>
<li>Menu22</li>
</ul>
</li>
</ul>
JS
$('.root li').mouseenter( function( e1 ) {
var thisItem = $(this);
setTimeout( function( e1 ) {
if ( $(thisItem).children().hasClass('open') ) {
return;
} else {
$(thisItem).children().addClass('open');
$(thisItem).siblings().children().removeClass('open');
}
}, 200 );
}).mouseleave( function( e2 ) {
var thisItem = $(this);
setTimeout( function( e2 ) {
if ( !$(thisItem).children().hasClass('open') ) { return; } else {
$(thisItem).children().removeClass('open');
}
}, 500 );
});
一些CSS
.root li { display: inline-block; background: #eee; color: #333 }
.root li:hover { background: #333; color: #fff }
.submenu li { clear: both }
.root li ul {display: none}
.root li ul.open {display: block}
問題
當將鼠標移出menu12或menu22並重新移入時,在鼠標移出500ms的超時時間內,該子菜單會冒泡且最終關閉。
小提琴
感謝您的回復
使用clearTimeout清除setTimeout
$('.root li').mouseenter(function (e1) {
var thisItem = $(this);
clearTimeout(x);
y = setTimeout(function (e1) {
if ($(thisItem).children().hasClass('open')) {
return;
} else {
$(thisItem).children().addClass('open');
$(thisItem).siblings().children().removeClass('open');
}
}, 200);
}).mouseleave(function (e2) {
var thisItem = $(this);
clearTimeout(y);
x = setTimeout(function (e2) {
if (!$(thisItem).children().hasClass('open')) {
return;
} else {
$(thisItem).children().removeClass('open');
}
}, 500);
});
您需要清除mouseenter和mouseleave上的設置計時器
$('.root li').mouseenter(function (e1) {
var thisItem = $(this);
clearTimeout(thisItem.data('hoverTimer'))
var timer = setTimeout(function (e1) {
if ($(thisItem).children().hasClass('open')) {
return;
} else {
$(thisItem).children().addClass('open');
$(thisItem).siblings().children().removeClass('open');
}
}, 200);
thisItem.data('hoverTimer', timer)
}).mouseleave(function (e2) {
var thisItem = $(this);
clearTimeout(thisItem.data('hoverTimer'))
var timer = setTimeout(function (e2) {
if (!$(thisItem).children().hasClass('open')) {
return;
} else {
$(thisItem).children().removeClass('open');
}
}, 500);
thisItem.data('hoverTimer', timer)
});
演示: 小提琴
您需要清除超時以免觸發。 http://jsfiddle.net/5G3BH/14/
var timeoutHandler;
$('.root li').mouseenter( function( e1 ) {
var thisItem = $(this);
clearTimeout(timeoutHandler);
timeoutHandler = setTimeout( function( e1 ) {
if ( $(thisItem).children().hasClass('open') ) {
return;
} else {
$(thisItem).children().addClass('open');
$(thisItem).siblings().children().removeClass('open');
}
}, 200 );
}).mouseleave( function( e2 ) {
var thisItem = $(this);
clearTimeout(timeoutHandler);
timeoutHandler = setTimeout( function( e2 ) {
if ( !$(thisItem).children().hasClass('open') ) { return; } else {
$(thisItem).children().removeClass('open');
}
}, 500 );
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.