$('#ddmenu li').hover( // обрабатываем событие :hover
// В this у нас будет элемент li
// Начинайте читать со второй функции, будет понятнее
// функия выполнится при наведении мыши
function () {
// Достать из data-атрибута* ссылку на таймер и очистить его
// Таким образом, если мы увели мышку с элемента, и тут же
// сразу навели обратно, не будет моргания выпадашки
clearTimeout($.data(this,'timer'));
// Выбираем ul внутри наведенного li
// Останавливаем анимации, если они не успели закончится
// И начинаем новую анимацию slideDown (показываем выпадашку)
$('ul',this).stop(true,true).slideDown(200);
},
// функия выполнится при уходе мыши
function () {
// В this (элемент li) в data-атрибут* под именем timer запишем
// результат функции setTimeout (ссылка на таймер)
$.data(this,'timer', setTimeout(
// Proxy "протаскивает" контекст this внутрь функции
$.proxy(
function() { // Функция, внутрь которой пробросится контекст
// Благодаря прокси здесь this по-прежнему указывает на li
// Получается мы выбираем ul внутри наведенного li
// Останавливаем анимации, если они не успели закончится
// И начинаем новую анимацию slideUp (скрываем выпадашку, видимо)
$('ul',this).stop(true,true).slideUp(200);
},
this // пробрасываемый контекст - наведенный элемент
),
100 // таймаут, через 0.1 сек после ухода мыши выполнится функция закрытия
));
}
);
* Не совсем верно. Данные пишутся не в data-атрибут. jQuery использует собственное хранилище данных. но сути это особо не меняет, а для понимания легче.