这是一种与设备无关的技术(不确定我对功能检测的信任程度。许多现代浏览器报告支持触摸事件,即使界面是鼠标)我曾经使悬停菜单按预期在触摸屏上工作(即防止当我们只想第一次点击触发悬停时,过早地“点击”顶部菜单链接的触摸事件)。
诀窍是要认识到触摸悬停+单击事件将在彼此的顶部发生。即悬停事件将几乎立即跟随单击事件。我们可以检测到这一点并阻止点击通过......仅在悬停事件后经过一定时间阈值时才允许点击触发。
在桌面上进行测试时,无论我点击多快,我都无法让悬停和点击之间的经过时间快于大约 150 毫秒。在 iPad(第 4 代)上进行测试时,悬停和点击之间的经过时间始终约为 7 - 8 毫秒。所以我选择了 50ms 的阈值时间来允许点击。我写的 jQuery 函数如下(假设一个标准的嵌套列表 CSS 悬停菜单):
function initNav(){
// make drop-downs work properly with touchscreens by preventing instant hover-click
$( some_selector_for_your_top_level_list_items ).each(function(){
var li = $(this);
li.mouseover(function(){
// store time of hover event
li.data( 'hoverTime', new Date().getTime() );
});
li.children('a').click(function(){
// only allow click if at least 50ms has elapsed since hover
return ( new Date().getTime() - li.data('hoverTime') ) > 50;
});
});
}
到目前为止,工作就像一个魅力。对于速度慢得多的设备来说,50 毫秒可能太低了。
对于非 JS,您仍将默认 CSS 悬停行为作为后备。
希望这对人们有所帮助,因为我找不到一个不涉及可疑功能检测和/或使用 JS 重写 CSS 悬停行为的好的插入式解决方案。