[英]How do I detect whether a browser supports mouseover events?
假设我有一个网页,它有一些 onmouseover javascript 行为来下拉菜单(或类似的东西)
显然,这不适用于 iPad 或智能手机等触控设备。
如何检测浏览器是否支持悬停事件,如 onmouseover 或 onmouseout 以及 CSS 中的 :hover 伪标签?
注意:我知道如果我对此感到担心,我应该以不同的方式编写它,但我很好奇是否可以进行检测。
编辑:当我说“支持悬停事件”时,我的意思是“浏览器是否对悬停事件具有有意义的表示”。 如果硬件支持而软件不支持(反之亦然),则没有有意义的表示。 除了一些即将到来的技术,我认为任何触摸设备都没有有意义的悬停事件表示。
此方法捕获更多设备/浏览器
try {
document.createEvent("TouchEvent");
alert(true);
}
catch (e) {
alert(false);
}
现在是 2016 年,许多设备都具有触摸和类似鼠标的输入已有好几年了。 “Can't touch”不是判断“Can mouseover”的好方法。 举几个例子:
因此,用户可能无法悬停一分钟,然后,在同一设备上,不刷新页面,他们将笔从 Galaxy Note 中拔出,并且(假设它没有着火)他们突然在交互中使用悬停,他们希望它能够正常工作。
如果您需要知道您的用户 a) 是否可以使用并且 b) 当前正在使用使他们能够方便地移动鼠标的设备,您可以:
mousemove
事件绑定到您的文档body
,该事件激活“已悬停”状态(例如,将类user-can-mouseover
到body
),然后立即解除绑定,使其只发生一次。touchstart
暂时停用该事件mousemove
和touchend
是重新激活它,这样,在浏览器上触发式鼠标事件(在Android和Windows很常见),正常触摸滚动不会触发mousemove
。mousemove
事件解除这些touchstart
和touchend
事件的绑定, touchend
进行良好的管理这将导致在用户开始使用行为类似于鼠标的输入设备时触发“可以悬停”状态。
以混合设备为例:
...并使用鼠标获取老式桌面工作站:
基于 user568458 的响应的一组功能,允许您打开/关闭触摸设备的 :hover 样式(我还没有在所有设备上尝试过):
function detectMouseMove() {
$(document).one('mousemove', function() {
$('body').addClass('hoverActive');
detectTouchEvent();
});
}
function detectTouchEvent() {
$(document).one('touchstart', function() {
$('body').removeClass('hoverActive');
detectMouseMove();
});
}
然后,您可以在任何 :hover 选择器之前在样式表中使用 .hoverActive 以防止移动浏览器尝试显示悬停状态。
matchMedia('(hover: hover)').matches; // Primary device can hover
matchMedia('(hover: none)').matches; // Primary device cannot hover
matchMedia('(any-hover: hover)').matches; // At least one of the connected devices can hover
matchMedia('(any-hover: none)').matches; // None of the connected devices can hover
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.