ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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


P
Peter Mortensen

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)制作的,这个没有更新。
T
Timothy Perez

如果您使用的是 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*/});
P
Peter Mortensen

单独使用 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,但后来它干扰了其他功能。我现在正在使用它并且效果很好。到目前为止没有任何问题。
D
David Johnstone

最简单的方法是使用 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 扩展进入您熟悉的区域。对我来说似乎并不太复杂。
所谓“最简单”的解决方案往往是人们搞砸最多的解决方案……无论您做什么,都不要忘记确保您的解决方案适用于同时支持触控和鼠标的设备,例如 Microsoft Surface
@Octopus:“当你只有一把锤子[原文如此]......一切看起来都像钉子”:)
现在是锤子时间!感谢您分享这个库,它很容易安装在我的应用程序上并开始运行!由于事件处理程序不同,设置需要一秒钟,但是一个简单的 console.log(event) 会告诉您您需要什么。谢谢!
P
Peter Mortensen

您可以使用 .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
K
Karol

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

他们是:

轻敲

水龙头

刷卡

向左滑动

向右滑动

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


感谢您为我的问题提供重要的时间。我正在调查 Jquery Mobile 事件。谢谢。
这些事件并不能真正代表真正的触摸交互。
jQuery Core 是一个真正的专有名词吗?
h
hanamj

我有点担心只为我的项目使用 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();
P
Peter Mortensen

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