我如何在iPad的Safari中使用jQuery识别触摸事件?有可能吗?

问题描述 投票:190回答:8

是否可以使用jQuery在iPad的Safari浏览器上识别触摸事件?

我在Web应用程序中使用mouseOver和mouseOut事件。 iPad的Safari浏览器是否有类似事件,因为没有mouseOut和mouseMove这样的事件?

jquery events ipad javascript-events mobile-safari
8个回答
238
投票

Core jQuery的触摸事件没有什么特别的,但是您可以使用以下事件轻松构建自己的事件

  • touchstart
  • touchmove
  • touchend
  • touchcancel

例如,touchmove

document.addEventListener('touchmove', function(e) {
    e.preventDefault();
    var touch = e.touches[0];
    alert(touch.pageX + " - " + touch.pageY);
}, false);

这在大多数基于WebKit的浏览器(包括Android)中有效。

Here is some good documentation


148
投票

如果您使用的是jQuery 1.7+,它甚至比所有其他答案还要简单。

$('#whatever').on({ 'touchstart' : function(){ /* do something... */ } });

24
投票

最简单的方法是使用multitouch JavaScript library like Hammer.js。然后,您可以编写如下代码:

canvas
    .hammer({prevent_default: true})
    .bind('doubletap', function(e) { // And double click
        // Zoom-in
    })
    .bind('dragstart', function(e) { // And mousedown
        // Get ready to drag
    })
    .bind('drag', function(e) { // And mousemove when mousedown
        // Pan the image
    })
    .bind('dragend', function(e) { // And mouseup
        // Finish the drag
    });

您可以继续前进。它支持点击,双击,滑动,按住,变换(即捏)和拖动。当发生等效的鼠标操作时,触摸事件也会触发,因此您无需编写两组事件处理程序。哦,如果您希望能够像我一样以jQueryish的方式编写,则需要jQuery插件。


24
投票

单独使用touchstart或touchend并不是一个好的解决方案,因为如果滚动页面,设备也会将其检测为触摸或点击。因此,同时检测点击事件的最佳方法是仅检测不会移动屏幕(滚动)的触摸事件。因此,只需将以下代码添加到您的应用程序即可:

$(document).on('touchstart', function() {
    detectTap = true; // Detects all touch events
});
$(document).on('touchmove', function() {
    detectTap = false; // Excludes the scroll events from touch events
});
$(document).on('click touchend', function(event) {
    if (event.type == "click") detectTap = true; // Detects click events
       if (detectTap){
          // Here you can write the function or codes you want to execute on tap

       }
 });

我测试了它,它在iPad和iPhone上都能正常工作。它检测点击并可以轻松区分点击和触摸滚动。


18
投票

您可以使用.on()捕获多个事件,然后测试触摸屏,例如:

$('#selector')
.on('touchstart mousedown', function(e){
  e.preventDefault();
  var touch = e.touches[0];
  if(touch){
    // Do some stuff
  }
  else {
    // Do some other stuff
  }
});

15
投票

[jQuery Core没有什么特别的,但是您可以在jQuery Mobile Events页面上阅读有关不同的触摸事件的信息,这些事件也可以在iOS设备之外使用。

它们是:

  • 点击
  • taphold
  • 刷卡
  • swipeleft
  • swiperight

还请注意,在滚动事件期间(基于移动设备上的触摸),iOS设备会在滚动时冻结DOM操作。


6
投票

我有点担心只为项目使用touchmove,因为它似乎仅在您的触摸从一个位置移动到另一位置(而不是在初始触摸上)时触发。因此,我将其与touchstart结合使用,这对于初始触摸和任何移动似乎都非常有效。

<script>

function doTouch(e) {
    e.preventDefault();
    var touch = e.touches[0];

    document.getElementById("xtext").innerHTML = touch.pageX;
    document.getElementById("ytext").innerHTML = touch.pageY;   
}

document.addEventListener('touchstart', function(e) {doTouch(e);}, false);
document.addEventListener('touchmove', function(e) {doTouch(e);}, false);

</script>

X: <div id="xtext">0</div>
Y: <div id="ytext">0</div>

3
投票

我刚刚针对1.4和1.7+版本的jQuery测试了benmajor's GitHub jQuery Touch Events plugin。它轻巧,可以与onbind完美配合,同时为详尽的触摸事件集提供支持。

© www.soinside.com 2019 - 2024. All rights reserved.