Мне нужно показать/скрыть каскадное меню, когда пользователь переместит мышь на определенный элемент. Это довольно легко достичь с помощью jquery, используя функцию наведения:
NB: таймер используется только для скрытия меню после 200 мс, и это не важно.
$(document).ready(function() {
var timer;
$('.element,.cascading_menu').hover(function(){
clearTimeout(timer);
$('.cascading_menu').show();
}, function(){
timer = setTimeout(function(){$('.cascading_menu').hide();},200);
});
});
Я должен повторить этот код для каждого меню, которое я хочу скрыть.
Но поскольку у меня много меню, я хотел бы уменьшить длину кода.
Моя идея состояла в том, чтобы использовать массив "id of element hovering: id menu to show/hide".
Как вы думаете, можно ли написать функцию jQuery, которая, учитывая этот массив элементов, обеспечивает отображение каждого меню без необходимости записывать этот код дюжину раз?
Большое спасибо за ваши ответы. В конце я написал этот код, который работает довольно хорошо. Проблема заключалась в том, что элементы, отображающие weren'e сыновья элемента, зависали, поэтому я создал два массива, один с зависающим элементом, а другой с отображаемым элементом и объединил все с функцией $.each. Вот код:
$(document).ready(function() {
var timer;
var h1=["prof","notif_cont","explo"];
var h2=[".profile",".notification",".explore"];
$('.hover').hover(
function(){
var hoverrato=$(this).children(':first');
$.each(h1, function(indice,checker){
if($(hoverrato).hasClass(checker)){
var index_hov=indice;
ul_show=h2[index_hov];
clearTimeout(timer);
$(ul_show).show(65);
}
});
},
function(){
timer = setTimeout(function(){$(ul_show).hide(65);},200);
});
});
Вы можете использовать this
чтобы вы могли использовать один и тот же код для всех элементов, но все зависит от вашего форматирования HTML-кода.
$(document).ready(function() {
$('.element').hover(function(){
$(this).find(".cascading_menu").stop().slideDown();
}, function(){
$(this).find(".cascading_menu").delay(200).slideUp();
});
});
Примечание. Вы также можете использовать delay(ms)
вместо таймера.
Вот хороший пример каскадного меню стиля "Windows 7" Fiddle
$(function(){
$('.hasDropdown').hover(function(){
$(this).find('ul:first').show();
},function(){
$(this).find('ul').hide();
})
});
он будет каскадно бесконечно глубоко :-) в теории
Я бы поставил его, как это, который будет работать для меню с глубиной, при условии, каждый <li class="hoverli">
с подменю имеется подменю, которое неупорядоченный список (<ul class="file_menu">
). Важно передать длительность (то есть, ноль) в .hide()
или .delay()
не будет работать, поскольку она не использует очередь эффектов без установленной продолжительности.
HTML:
<div id="button">
<ul class="hover">
<li class="hoverli">Hover over me!
<ul class="file_menu">
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
</ul>
</li>
<li class="hoverli">or me!
<ul class="file_menu">
<li class="hoverli">submenu!
<ul class="file_menu">
<li>A</li>
<li>B</li>
<li>C</li>
<li>D</li>
</ul>
</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
</ul>
</li>
</ul>
</div>
JavaScript:
$(".hoverli").hover(function(){
$(this).find("ul").show();
}, function(){
$(this).find("ul").delay(200).hide(0);
});
CSS:
ul, li {
margin:0;
padding:0;
list-style:none;
}
.menu_class {
border:1px solid #1c1c1c;
}
.file_menu {
display:none;
width:300px;
border: 1px solid #1c1c1c;
}
.file_menu li {
background-color: white;
}
setTimeout
и использовать вместо него.delay(200)
(я знаю, вы сказали, что эта часть не важна, но она экономит несколько строк)