2017-01-13 7 views
0

Пожалуйста, помогите мне разобраться, как справиться с ситуацией. У нас есть ссылка. Существует правило: hover css для этой ссылки, которое расширяет дополнительный блок ссылок.jQuery preventDefault в соответствии с: зависанием на мобильном телефоне

$('li').children('a').on('click', function(e) { 
 
\t 
 
    if ($(this).siblings('div').is(':hidden')) { 
 
    
 
    \t e.preventDefault(); 
 
    
 
    } 
 
    
 
});
ul { 
 
    list-style-type: none; 
 
    border: 1px solid black; 
 
    background-color: white; 
 
} 
 

 
a { 
 
    display: block; 
 
    height: 30px; 
 
    line-height: 30px; 
 
} 
 

 
li:hover div { 
 
    display: block; 
 
} 
 

 
li div { 
 
    display: none; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 
 
<ul> 
 
    <li> 
 
    <a href="google.com">Google</a> 
 
    <div> 
 
     <a href="gmail.com">GMail</a> 
 
     <a href="maps.google.com">Maps</a> 
 
    </div> 
 
    </li> 
 
</ul>

Идея: Нужно preventDefault для первого звена до дополнительных ссылок расширен. На рабочем столе вы не заметите разницу (если вы удаляете правило CSS: hover CSS и пытаетесь нажать на первую ссылку, это не сработает, поскольку остальные ссылки скрыты). Правильное поведение: пользователь набирает первую ссылку, видит других, и после этого он может нажать на первую ссылку.

Проблема начинается с мобильных телефонов с тех пор, как наведите курсор мыши и щелкните на них. Когда пользователь нажимает на первую ссылку, он будет выполнять href, хотя дополнительные ссылки были скрыты в момент нажатия. Но поскольку правило: hover применяется одновременно с нажатием на ссылку, JS рассматривает его так, как будто ссылки уже открыты и не препятствуют умолчанию. Означает, что мой текущий оператор IF ЛОЖЬ на мобильных устройствах за секунду до фактического щелчка. Пожалуйста, помогите мне найти правильный подход.

Решение без использования jquery-mobile приветствуется! Спасибо!

ответ

0

Это возможное решение: Всегда запускайте preventDefault. И основываясь на видимости div, решите показать ссылки или перейти на href.

$('li').children('a').on('click', function(e) { 
 
\t 
 
    e.preventDefault(); 
 
    var $links = $(this).siblings('div'); 
 
    
 
    if ($links.is(':hidden')) { 
 
    $links.show(); 
 
    } else { 
 
    window.location.href = this.href; 
 
    } 
 
    
 
});
ul { 
 
    list-style-type: none; 
 
    border: 1px solid black; 
 
    background-color: white; 
 
} 
 

 
a { 
 
    display: block; 
 
    height: 30px; 
 
    line-height: 30px; 
 
} 
 

 
li:hover div { 
 
    display: block; 
 
} 
 

 
li div { 
 
    display: none; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 
 
<ul> 
 
    <li> 
 
    <a href="google.com">Google</a> 
 
    <div> 
 
     <a href="gmail.com">GMail</a> 
 
     <a href="maps.google.com">Maps</a> 
 
    </div> 
 
    </li> 
 
</ul>

PS: Это более вероятно, будет проблемой пользовательский опыт для меня. На сенсорных устройствах у нас действительно нет события hover. Поэтому трудно обеспечить тот же опыт, что и рабочий стол. Обычно на мобильных устройствах будет немного отличаться дизайн, например, выпадающее меню переключает на tap или touchstart событиях в этом случае.

+0

Здравствуйте, спасибо за ваше предложение, но, к сожалению, на мобильных устройствах ваш код будет иметь такую ​​же проблему. Когда пользователь нажимает/нажимает на первую ссылку, будет выполняться href. Вот почему я пытался избежать. На ПК он работает отлично. Но сотовый телефон выполняет «: hover» перед проверкой JS, если он скрыт. Так что для JS это «видимо» сразу после первого касания. – Mike

+0

Интересно. Код работает на моем мобильном телефоне. При нажатии первой ссылки отображаются дополнительные ссылки и остаются на странице. Но если это не работает на вашем тестовом устройстве, есть работа, чтобы поместить 'href' в другой атрибут. Например: используя 'Google' в html, а в js используйте 'window.location.href = $ (this) .data (" href ");' –

+0

То же самое. Проблема не в href, проблема в том, что когда дело доходит до JS, чтобы проверить, скрыт или нет DIV, на мобильных устройствах он становится «видимым» при клике, но до того, как JS поймает событие click, поэтому JS выполняет инструкцию ELSE. Вы можете увидеть его в режиме мобильной эмуляции Google Chrome, например, попробуйте iPhone 6. – Mike

 Смежные вопросы

  • Нет связанных вопросов^_^