@mydarck

Нужно детально понять простой код?

$('#ddmenu li').hover(function () {
  clearTimeout($.data(this,'timer'));
  $('ul',this).stop(true,true).slideDown(200);
}, function () {
  $.data(this,'timer', setTimeout($.proxy(function() {
  $('ul',this).stop(true,true).slideUp(200);
}, this), 100));

Думаю, что по приведенному выше коду мой уровень знания JQuery очевиден.
Код элементарный и общий принцип его работы я понимаю. Однако, некоторые моменты для меня не являются явными.
Например вот эта строка: clearTimeout($.data(this,'timer')); Если не сложно объясните детально и максимально доходчиво что тут к чему.
  • Вопрос задан
  • 236 просмотров
Решения вопроса 1
delphinpro
@delphinpro Куратор тега JavaScript
frontend developer
$('#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 использует собственное хранилище данных. но сути это особо не меняет, а для понимания легче.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Для того, чтобы понять что тут написано не обязательно задавать вопрос, достаточно погуглить конструкцию $.data(): https://api.jquery.com/jquery.data/ и clearTimeout(): javascript.ru/cleartimeout
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы