【发布时间】:2019-03-15 11:56:24
【问题描述】:
听起来是一个简单的问题,但解决起来却非常具有挑战性。对于某些网站,我的内容只有在用户悬停/聚焦链接时才会显示。然而,链接本身有一个目标。
如果触摸屏用户单击其中一个链接,浏览器会立即转到href 位置。这意味着悬停内容永远不可见!
这就是为什么没有鼠标(或像魔术遥控器一样悬停的其他设备)的用户应该看到替代内容的原因。但是我该如何检测呢?
$(document).on('click','#my-menu-inner > ul > li > a',function(e) {
if(clientHasInputDeviceSupportingHover()) {
return true;
} else {
e.preventDefault();
$('#for-no-hover-visitors').html('');
$(this).clone().appendTo('#for-no-hover-visitors');
$(this).next().clone().appendTo('#for-no-hover-visitors');
}
});
function clientHasInputDeviceSupportingHover() {
// HOW CAN I DETECT THIS???
if($('#checkhover:checked').length > 0) {
return true;
}
return false;
}
.clearfix::after {
content: "";
clear: both;
display: table;
}
#my-menu-inner > ul {
margin:10px;
width:100%;
background-color:yellow;
list-style-type:none;
position:relative;
}
#my-menu-inner > ul > li {
float:left;
margin:20px;
}
#my-menu-inner > ul > li > a {
padding:20px;
border:1px solid black;
display:block;
}
#my-menu-inner > ul > li > div.sub {
position:absolute;
top:calc(100% - 20px);
background-color:red;
padding:40px;
display:none;
left:0;
width:100vw;
}
#my-menu-inner > ul > li a:hover + div.sub, #my-menu-inner > ul > li a:focus + div.sub,
#my-menu-inner > ul > li > div.sub:hover, #my-menu-inner > ul > li > div.sub:focus {
display:block;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Simulate for Client supporting hover: <input type="checkbox" id="checkhover" />
<div id="my-menu">
<div id="my-menu-inner">
<ul class="clearfix">
<li>
<a href="http://www.example.com/foo/">foo</a>
<div class="sub">
<ul>
<li><a href="http://www.example.com/mobile/">mobile</a></li>
<li><a href="http://www.example.com/users/">users</a></li>
</ul>
</div>
</li>
<li>
<a href="http://www.example.com/bar/">bar</a>
<div class="sub">
<ul>
<li><a href="http://www.example.com/never/">never</a></li>
<li><a href="http://www.example.com/see-me/">see me</a></li>
</ul>
</div>
</li>
</ul>
</div>
</div>
<div id="for-no-hover-visitors"></div>
问题是clientHasInputDeviceSupportingHover()。 找出这一点最可靠的方法是什么?
到目前为止我们所知道的
可以检测到触摸设备: What's the best way to detect a 'touch screen' device using JavaScript?
鼠标检测至少可以“onclick”工作: How to detect if a device has mouse support?
通常有很多不同的可能输入设备: https://en.wikipedia.org/wiki/Input_device#Pointing_device
非常欢迎通用/更可靠的解决方案。
【问题讨论】:
-
您可以检查设备是否为手机。谷歌上有很多例子如何检查它的触摸设备。
-
@ConstantinChirila 这没用。例如,4K 触摸屏怎么样?带触摸板的迷你上网本怎么样?
-
之前有人问过这个问题 - 例如在这里:stackoverflow.com/questions/21054126/… 不幸的是,虽然似乎没有好的解决方案 :( (我最近有完全相同的问题,最后只是测试了触摸支持 - 这并不理想,因为同时访问两者的用户体验更差,但我没有看到更好的东西。)
-
@RobinZigmond 鼠标支持的问题是相似的,因为我猜除了支持悬停/焦点的鼠标外,只有很少的输入可能性。但我希望可能有一个脚本可以模拟悬停或类似的东西并因此给出足够的答案?
-
您可以在任何类型的设备上查看触控支持。可能我的评论让你失望了,因为我说的是移动。但正如@Robin Zigmond 所说,两种输入的用户体验更差。
标签: javascript jquery html css hover