Itachi261092
@Itachi261092
Веб-разработчик, писатель, геймер...

Как сопоставить hover с touchstart?

Здравствуйте. На сайте есть менюшка с выплывающими дочерними подменюшками при наведении (hover) на основную менюшку. всплывание сделано так:
$('.menu-fallback').hover(function () {
        $(this).find('.fallback').stop().slideDown('fast')
        $(this).addClass('active');
    }, function () {
        $(this).find('.fallback').stop().slideUp('fast');
        $(this).removeClass('active');
    });

Сайт не адаптирован под мобильное меню, и при тапе на главный пункт, естественно, сразу происходит переход на выбранный пункт. Я попытался это изменить:
$('.menu-fallback').hover(function () {
        if ($(this).hasClass('active')){
            //Если уже выделено
        }
        else{
            // Если нету класса active
            $(this).find('>a').click(function(e){
                e.preventDefault();
            });
        }
        $(this).find('.fallback').stop().slideDown('fast')
        $(this).addClass('active');
    }, function () {
        $(this).find('.fallback').stop().slideUp('fast');
        $(this).removeClass('active');
    });

Что привело к тому, что родительские ссылки теперь вообще не отрабатывают. событие перехода блокируется.
Как это исправить? Или может быть есть какой то способ легко связать функцию hover с touchstart ?
  • Вопрос задан
  • 481 просмотр
Решения вопроса 2
darkkemper
@darkkemper
Programmer / Software Developer
Воспользуйтесь:
function is_touch_device() {
    return !!('ontouchstart' in window);
}

и в случае, если функция вернет true, замените hover на click.
Ответ написан
Itachi261092
@Itachi261092 Автор вопроса
Веб-разработчик, писатель, геймер...
Помог совет Евгения, но допёр как всё сделать, я не сразу. В итоге получился вот такой код:
// Проверка на тач девайсы
    function is_touch_device() {
        return !!('ontouchstart' in window);
    }
    if (is_touch_device() == true){
        // Функция меню для тач девайсов
        $('.menu-fallback').on('touchstart click', function(e) {
            // Если нету класса active
            if (!$(this).hasClass('active')){
                // Если у пункта есть подменю, отключить ссылку
                if ($(this).children().is('.fallback')){
                    e.preventDefault();
                }
                // Если есть другие активные пункты, отключаем их
                $('.menu-fallback.active').each(function () {
                    $(this).find('.fallback').stop().slideUp('fast');
                    $(this).removeClass('active');
                });
                // Делаем активным текущий пункт
                $(this).find('.fallback').stop().slideDown('fast');
                $(this).addClass('active');
            }
        });
    }
    // для мыши
    else{
        $('.menu-fallback').hover(function () {
            $(this).find('.fallback').stop().slideDown('fast')
            $(this).addClass('active');
        }, function () {
            $(this).find('.fallback').stop().slideUp('fast');
            $(this).removeClass('active');
        });
    }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы