我们假设我有一个网页,其中有一些onmouseover javascript行为来下拉菜单(或类似的东西)
显然,这不适用于iPad或智能手机等触控设备。
如何检测浏览器是否支持onmouseover或onmouseout等悬停事件以及CSS中的hover伪标记?
注意:我知道如果我对此感到担心,我应该用不同的方式写出来,但我很好奇是否可以进行检测。
编辑:当我说“支持悬停事件”时,我的意思是“浏览器是否有有意义的悬停事件表示”。如果硬件支持它但软件不支持(反之亦然),则没有有意义的表示。除了一些upcoming tech之外,我认为任何触摸设备都没有悬停事件的有意义的表示。
答案 0 :(得分:19)
此方法可捕获更多设备/浏览器
try {
document.createEvent("TouchEvent");
alert(true);
}
catch (e) {
alert(false);
}
答案 1 :(得分:12)
var supportsTouch = (typeof Touch == "object");
只是检测它是否是触摸设备,然后做你特别的事情。 这是最简单的方法,因为大多数触摸设备模拟鼠标事件,但没有鼠标驱动设备模拟触摸事件。
答案 2 :(得分:7)
这是2016年,现在有很多设备同时具有触摸和类似鼠标的输入。 “无法触摸”是不判断“可以鼠标悬停”的好方法。举几个例子:
因此,用户可能无法悬停一分钟,然后,在同一设备上,无需刷新页面,他们将笔从Galaxy Note中拔出并且(假设它没有着火)他们突然 使用悬停在他们的互动中,他们希望它能够正常工作。
如果您需要知道您的用户a)是否可以使用b)当前 使用的设备可以方便地将其移除,>强>你可以:
mousemove
事件绑定到您的文档body
,如果鼠标移动触发游标,则会激活“悬停”状态(例如,将类user-can-mouseover
添加到body
)正在移动,然后立即解除绑定,所以它只发生一次。touchstart
的{{1}}事件和重新激活它的mousemove
,以便触摸触发鼠标事件的浏览器(在Android和Windows上非常常见) ),正常的触摸滚动不会触发touchend
。mousemove
事件取消绑定这些mousemove
和touchstart
事件,以便做好内务管理这将导致在用户开始使用行为类似于鼠标的输入设备时触发“可悬停”状态。
例如,采用混合设备:
...并带着一个带鼠标的老式桌面工作站:
答案 3 :(得分:2)
基于user568458响应的功能集,允许您打开/关闭:触摸设备的悬停样式(我没有在所有设备上尝试过):
function detectMouseMove() {
$(document).one('mousemove', function() {
$('body').addClass('hoverActive');
detectTouchEvent();
});
}
function detectTouchEvent() {
$(document).one('touchstart', function() {
$('body').removeClass('hoverActive');
detectMouseMove();
});
}
然后你可以在样式表之前使用.hoverActive:hover选择器,以防止移动浏览器尝试显示悬停状态。
答案 4 :(得分:1)
non-legacy browsers的另一种方法是利用媒体查询hover和any-hover
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