如何确定客户端是否为触摸设备

时间:2011-06-07 08:33:27

标签: javascript jquery touch tablet

是否有任何漂亮而干净的方法或技巧来确定用户是否在触摸设备上?

我知道有类似的东西 var isiPad = navigator.userAgent.match(/iPad/i) != null;

但我只是想知道是否有一个技巧来确定用户是否在Touch设备上? 因为那里有更多的触摸设备和平板电脑,只有iPad。

谢谢。

6 个答案:

答案 0 :(得分:27)

您可以使用以下JS功能:

function isTouchDevice() {
   var el = document.createElement('div');
   el.setAttribute('ongesturestart', 'return;'); // or try "ontouchstart"
   return typeof el.ongesturestart === "function";
}

来源:Detecting touch-based browsing

请注意,上述代码仅测试浏览器是否支持触摸,而不是设备。

相关链接:

jquery for mobilejtouch

中可能存在检测结果

答案 1 :(得分:14)

if ("ontouchstart" in document.documentElement)
{
  alert("It's a touch screen device.");
}
else
{
 alert("Others devices");
}

我在这里和那里浏览了大量的简单代码

答案 2 :(得分:13)

包含modernizer,这是一个很小的功能检测库。然后你可以使用下面的东西。

if (Modernizr.touch){
   // bind to touchstart, touchmove, etc and watch `event.streamId`
} else {
   // bind to normal click, mousemove, etc
}

答案 3 :(得分:4)

使用document.createEvent("TouchEvent")无法在桌面设备上使用。所以你可以在if语句中使用它。

请注意,此方法可能会在非触控设备上产生错误。我希望在ontouchstart中检查document.documentElement

答案 4 :(得分:2)

查看此post,它提供了一个非常好的代码段,用于检测触摸设备时的操作或调用touchstart事件时该怎么办:

$(function(){
  if(window.Touch) {
    touch_detect.auto_detected();
  } else {
    document.ontouchstart = touch_detect.surface;
  }
}); // End loaded jQuery
var touch_detect = {
  auto_detected: function(event){
    /* add everything you want to do onLoad here (eg. activating hover controls) */
    alert('this was auto detected');
    activateTouchArea();
  },
  surface: function(event){
    /* add everything you want to do ontouchstart here (eg. drag & drop) - you can fire this in both places */
    alert('this was detected by touching');
    activateTouchArea();
  }
}; // touch_detect
function activateTouchArea(){
  /* make sure our screen doesn't scroll when we move the "touchable area" */
  var element = document.getElementById('element_id');
  element.addEventListener("touchstart", touchStart, false);
}
function touchStart(event) {
  /* modularize preventing the default behavior so we can use it again */
  event.preventDefault();
}

答案 5 :(得分:1)

如果您使用Modernizr,则可以很容易地使用前面提到的Modernizr.touch

但是,为了安全起见,我更喜欢使用Modernizr.touch和用户代理测试的组合。

var deviceAgent = navigator.userAgent.toLowerCase();

var isTouchDevice = Modernizr.touch || 
(deviceAgent.match(/(iphone|ipod|ipad)/) ||
deviceAgent.match(/(android)/)  || 
deviceAgent.match(/(iemobile)/) || 
deviceAgent.match(/iphone/i) || 
deviceAgent.match(/ipad/i) || 
deviceAgent.match(/ipod/i) || 
deviceAgent.match(/blackberry/i) || 
deviceAgent.match(/bada/i));

if (isTouchDevice) {
        //Do something touchy
    } else {
        //Can't touch this
    }

如果您不使用Modernizr,只需将上面的Modernizr.touch函数替换为('ontouchstart' in document.documentElement)

即可

另请注意,测试用户代理iemobile将为您提供比Windows Phone更广泛的检测到的Microsoft移动设备。

Also see this SO question