在JavaScript/jQuery中,如何检测客户端设备是否有鼠标?
我有一个网站,在用户将鼠标悬停在某个项目上时会弹出一些信息面板。我正在使用jQuery.hoverIntent来检测悬停事件,但是这显然不适用于像iPhone/iPad/Android这样的触摸屏设备。因此,在这些设备上,我想改为使用轻触来显示信息面板。
在JavaScript/jQuery中,如何检测客户端设备是否有鼠标?
我有一个网站,在用户将鼠标悬停在某个项目上时会弹出一些信息面板。我正在使用jQuery.hoverIntent来检测悬停事件,但是这显然不适用于像iPhone/iPad/Android这样的触摸屏设备。因此,在这些设备上,我想改为使用轻触来显示信息面板。
var isTouchDevice = 'ontouchstart' in document.documentElement;
注意:仅仅因为设备支持触摸事件并不意味着它是一个纯触摸屏幕设备。许多设备(例如我的Asus Zenbook)支持单击和触摸事件,即使它们没有任何实际的触摸输入机制。在设计触摸支持时,始终包括单击事件支持,并且永远不要假设任何设备是纯粹的其中之一。
在 Android 上发现测试 window.Touch 不起作用,但是这样做可以:
function is_touch_device() {
return !!('ontouchstart' in window);
}
hover
和 click
都进行处理。另一种方法是使用 CSS 媒体查询,在较小的屏幕或移动设备上仅使用某些样式,这些设备最有可能具有触摸/点击功能。因此,如果您在 CSS 中有某些特定样式,并且从 jQuery 中检查这些元素是否具有移动设备样式属性,则可以钩入它们以编写针对移动设备的代码。if ("ontouchstart" in window || navigator.msMaxTouchPoints) {
isTouch = true;
} else {
isTouch = false;
}
可以在任何地方使用!
isTouch = "ontouchstart" in window || navigator.msMaxTouchPoints;
。 - Andrewreturn (('ontouchstart' in window)
|| (navigator.maxTouchPoints > 0)
|| (navigator.msMaxTouchPoints > 0));
为什么要使用maxTouchPoints和msMaxTouchPoints:
微软已经声明,从Internet Explorer 11开始, 微软供应商前缀版本的此属性(msMaxTouchPoints) 可能会被删除,并建议改用maxTouchPoints。
来源:http://ctrlq.org/code/19616-detect-touch-screen-javascript
我使用:
if(jQuery.support.touch){
alert('Touch enabled');
}
在jQuery Mobile 1.0.1中
对于我的第一篇帖子/评论:
我们都知道'touchstart'在点击之前触发。
我们也知道当用户打开您的页面时,他或她会执行以下操作:
让我们尝试一些东西:
//--> 开始:jQuery
var hasTouchCapabilities = 'ontouchstart' in window && (navigator.maxTouchPoints || navigator.msMaxTouchPoints);
var isTouchDevice = hasTouchCapabilities ? 'maybe':'nope';
//attach a once called event handler to window
$(window).one('touchstart mousemove click',function(e){
if ( isTouchDevice === 'maybe' && e.type === 'touchstart' )
isTouchDevice = 'yes';
});
//<-- 结束: jQuery
祝您拥有愉快的一天!
谷歌浏览器似乎在这方面返回了虚假的正面结果:
var isTouch = 'ontouchstart' in document.documentElement;
我想这与它的“模拟触摸事件”的能力有关(F12->右下角的设置->“覆盖”选项卡->最后一个复选框)。我知道默认情况下它是关闭的,但这就是我认为导致结果变化的原因(在Chrome中,“in”方法曾经起作用)。 然而,据我测试,这似乎是有效的:
var isTouch = !!("undefined" != typeof document.documentElement.ontouchstart);
我运行了这段代码的所有浏览器都显示typeof为"object",但是我更加确定它不是undefined :-)
在IE7、IE8、IE9、IE10、Chrome 23.0.1271.64、iPad上的Chrome 21.0.1180.80和iPad Safari上进行了测试。如果有人进行更多的测试并分享结果,那就太棒了。
我为我的网站之一撰写了这篇文章,它可能是最可靠的解决方案。特别是因为即使是 Modernizr 也可能会在触摸检测上出现误报。
如果你正在使用 jQuery
$(window).one({
mouseover : function(){
Modernizr.touch = false; // Add this line if you have Modernizr
$('html').removeClass('touch').addClass('mouse');
}
});
window.onmouseover = function(){
window.onmouseover = null;
document.getElementsByTagName("html")[0].className += " mouse";
}
function is_touch_device() {
return !!('ontouchstart' in window);
}
可以在安卓的Mozilla、Chrome、Opera、安卓默认浏览器以及iPhone上的Safari上运行...全部正常...
对我来说看起来很稳定 :)
:hover
,因此在为多个设备编写一个样式表时,最好仅将:hover
用于纯粹的美观目的。 - drudge