Меню аккордеон на задержке при событии hover | jQuery
Доброго всем дня!
У меня проблема. Некорректно работает скрипт для меню-аккордеона. Я составил довольно обычный jquery-скрипт для того, чтобы в меню-аккордеон при наведении мышки на пункты разделов меню после небольшого таймаута в 0.5 секунды плавно раскрывались соответствующие вложенные пункты и подразделы. Вот этот скрипт: <script type="text/javascript"> $(document).ready(function(){ $("#menu1 a.ssylka_razd").hover(function(){ $(this).addClass('waiting'); setTimeout(function(){ p = $('#menu1 .waiting').parent().next().children('ul'); p.slideDown(500).removeClass('waiting'); },800); }, function(){ $('#menu1 .waiting').removeClass('waiting'); }); }); </script> Вот оптимизированный (сокращенный) HTML-код, который обслуживает скрипт: <ul id='menu1'> <li class='current1'> <a href='#' class='ssylka'>МАНГАЛЫ</a> </li> <li> <a href='#' class='ssylka_razd'>КОПТИЛЬНИ</a> </li> <li> <ul> <li> <a href='#' class='ssylka'>Коптильни с гидрозатвором на подставке</a> </li> <li> <a href='#' class='ssylka'>Коптильни малые</a> </li> </ul> </li> <li> <a href='#' class='ssylka_razd'>МЕБЕЛЬ ДЛЯ ДАЧИ Camping World</a> </li> <li> <ul> <li> <a href='#' class='ssylka'>Складные стулья</a> </li> <li> <a href='#' class='ssylka'>Складные кресла</a> </li> </ul> </ul> Скрипт, вроде бы, правильный. Он должен игнорировать быстрые перемещения мышки (кратковременные задержки мышки над пунктами разделов). И только лишь, когда мышка останавливается над пунктом раздела (class='ssylka_razd') более, чем на 0.8 секунды, срабатывает скрипт, чтобы плавно выкатить вложенные пункты и подразделы. Однако, когда я, тестируя скрипт, быстро перемещаю мышку верх-вниз-верх-вниз по меню-аккордеону, некоторые пункты-разделы начинают раскрываться. Хотя, этого не должно происходить, потому что при быстрых осциляциях мышки, он не задерживается над пунктами разделов более 0.1-0.3 секунды. ______________________________ Подскажите, пожалуйста, как исправить мой скрипт, и в чем моя ошибка. Чтобы увидеть воочию этот эффект, можете проверить меню-аккордеон на этой тестовой странице: Если можно, дайте совет, без исправления html-кода моего примера. |
Александр О., в строке 3 обьявите переменную для таймера
в строку 13 добавьте обнуление таймера |
to рони:
Прошу прощения, не соображу никак. Если я объявлю переменную таймера в третьей строке, вроде: var timer = setTimeout( скрипт, 800); то я, тем самым, запускаю в этом месте скрипт timer ... Или вы имеете ввиду иное объявление таймера? Если Вас не затруднит, настучите, пожалуйста, здесь эти строчки. Я не дока в вопросах javascript. |
Цитата:
неужели вы сами непонимаите логику -- таймер сработал а он у вас завязан на класс -- он сразу и сработает если курсор над любой ссылкой в этот момент -- ещё ждать он не будет |
Александр О.,
$(function () { var timer; $("#menu1 ul").hide(); $(".current1").parents("ul").css("display", "block"); $(".ssylka_razd").parent(".current1").next().children("ul").css("display", "block"); $("#menu1 a.ssylka_razd").hover(function () { $(this).addClass("waiting"); timer = setTimeout(function () { p = $("#menu1 .waiting").parent().next().children("ul"); p.slideDown(500).removeClass("waiting") }, 800) }, function () { window.clearTimeout(timer); $("#menu1 .waiting").removeClass("waiting") }) }); |
Цитата:
|
to рони:
Логику понимает тот, кто хорошо разбирается в базовом материале. Верно, как и следующее: "лишь тот красиво изложит мудрую мысль на русском языке, кто учил русский язык" :) Я разобрался. Правильный код: $("#menu1 a.ssylka_razd").hover(function(){ $(this).addClass('waiting'); animationTimer = setTimeout(function(){ p = $('#menu1 .waiting').parent().next().children('ul'); p.slideDown(500).removeClass('waiting'); },800); }, function(){ $('#menu1 .waiting').removeClass('waiting'); clearTimeout(animationTimer); }); Вы мне сказали про строку 3. Я сообразил, что строка должна быть 7. Но код у меня сразу не заработал, поскольку я написал var animationTimer = setTimeout... Спасибо большое. Без вас бы я и дальше мучился в потугах... :) |
Часовой пояс GMT +3, время: 07:48. |