【问题标题】:How can I recognize touch events using jQuery in Safari for iPad? Is it possible?如何在 iPad 版 Safari 中使用 jQuery 识别触摸事件?可能吗?
【发布时间】:2011-06-12 22:24:43
【问题描述】:

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

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

【问题讨论】:

    标签: jquery ipad events mobile-safari jquery-events


    【解决方案1】:

    Core jQuery 对触摸事件没有任何特别之处,但您可以使用以下事件轻松构建自己的事件

    • 触摸开始
    • 触摸移动
    • 触摸结束
    • 触摸取消

    例如,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.

    【讨论】:

    • 非常感谢大卫,我认为它会起作用,但什么是 e.touches[0] ?你能详细描述论点“e”吗?
    • e 是自动传递给处理程序的事件对象。对于 safari 浏览器(以及 android),它现在包含用户在屏幕上进行的所有触摸的数组。每个触摸都有自己的属性(例如 x,y 坐标)
    • 现在你如何找到触发事件的元素-__-
    • 请注意,正确答案是蒂莫西·佩雷斯(Timothy Perez)制作的那个,这个没有更新。
    【解决方案2】:

    我有点担心只在我的项目中使用 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>
    

    【讨论】:

    • 我还添加了这个来检测自上次事件以来经过了多少时间。document.getElementById("ttime").innerHTML = ((new Date()) - touchTime); touchTime = new Date();
    【解决方案3】:

    最简单的方法是使用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 插件。

    【讨论】:

    • “最简单”的解决方案永远不会通过添加库来使问题变得更复杂
    • @Octopus 最简单的解决方案是使用hammer.js 来抽象出跨浏览器的麻烦。使用 jQuery 扩展进入您熟悉的区域。对我来说似乎并不太复杂。
    • 所谓的“最简单”的解决方案往往是人们最容易搞砸的解决方案……无论您做什么,不要忘记确保您的解决方案适用于同时支持触控和鼠标的设备,比如微软Surface
    • @Octopus:“当你只有一把锤子[原文如此]......一切看起来都像钉子”:)
    • 锤子时间到了!感谢您分享这个库,它很容易安装在我的应用程序上并开始运行!由于事件处理程序不同,设置需要一秒钟,但是一个简单的 console.log(event) 会告诉您您需要什么。谢谢!
    【解决方案4】:

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

    他们是:

    • 点击
    • 轻拍
    • 滑动
    • 向左滑动
    • 向右滑动

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

    【讨论】:

    • 感谢您抽出宝贵的时间回答我的问题。我正在调查 Jquery Mobile 事件.. 谢谢。
    • 这些事件并不能真正代表真正的触摸交互。
    • jQuery Core 是一个真正的专有名词吗?
    【解决方案5】:

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

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

    【讨论】:

    • 是的,蒂莫西,在我开始我的项目时,我没有使用 1.7+ 版本。现在我正在使用 jquery 1.7+ .. 感谢您的建议和回复.. 非常感谢。 :)
    • 这很好用。我需要 click 和 touchstart 来做同样的事情,而且我习惯了非对象语法,如$('#whatever').on('touchstart click', function(){ /* do something... */ });
    • 当我去$('#whatever').on({ 'touchstart' : function(ev){}});ev 似乎没有关于触摸的任何信息(触摸、targetTouches 或 changedTouches)
    • @Octopus : 您可以在ev.originalEvent 下找到触摸信息。
    • @edonbajrami 是的,当然。检查docs 并查找“委托事件”。 $("#element 监控新元素").on("eventX", "#element", function( event) {/*whatever*/});
    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

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

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

      【讨论】:

      • 除了 .bind 已被弃用。你应该使用.on
      【解决方案8】:

      单独使用 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 上运行良好。它检测到点击,可以轻松区分点击和触摸滚动。

      【讨论】:

      • 这个解决方案似乎是我发现的最直接的解决方案,而且似乎在 iOS 上运行良好。
      • 我先使用jquery mobile,但后来它干扰了其他功能。我现在正在使用它并且效果很好。到目前为止没有问题。
      猜你喜欢
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 2015-11-06
      • 1970-01-01
      相关资源
      最近更新 更多