ฉันจะจดจำเหตุการณ์การสัมผัสโดยใช้ jQuery ใน Safari สำหรับ iPad ได้อย่างไร เป็นไปได้ไหม?


192

เป็นไปได้หรือไม่ที่จะจดจำเหตุการณ์การสัมผัสบนเบราว์เซอร์ Safari ของ iPad โดยใช้ jQuery

ฉันใช้ mouseOver และ mouseOut events ในเว็บแอปพลิเคชัน มีเหตุการณ์ที่คล้ายกันสำหรับเบราว์เซอร์ Safari ของ iPad เนื่องจากไม่มีเหตุการณ์เช่น mouseOut และ mouseMove หรือไม่

คำตอบ:


240

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)

นี่คือบางส่วนเอกสารที่ดีคือ


2
ขอบคุณ David มากฉันคิดว่ามันจะใช้ได้ แต่ e.touches [0] คืออะไร? คุณสามารถอธิบายรายละเอียดอาร์กิวเมนต์ "e" ได้หรือไม่
Abhishek B.

7
e เป็นวัตถุเหตุการณ์ที่ได้รับการส่งผ่านโดยอัตโนมัติไปยังตัวจัดการ สำหรับเบราว์เซอร์ซาฟารี (และแอนดรอยด์ด้วย) ในขณะนี้มีอาร์เรย์ของการสัมผัสทั้งหมดที่ผู้ใช้ทำบนหน้าจอ แต่ละการสัมผัสมีคุณสมบัติของตัวเอง (เช่น x, y coords)
David Pean

1
ตอนนี้คุณจะไปเกี่ยวกับการหาสิ่งที่องค์ประกอบที่จะทริกเกอร์เหตุการณ์ใน -__-
มูฮัมหมัด Umer

โปรดทราบว่าคำตอบที่ถูกต้องคือคำตอบของ Timothy Perez คำตอบนี้ไม่ได้รับการอัพเดต
EPurpl3

149

หากคุณใช้ jQuery 1.7+ มันจะง่ายกว่าคำตอบอื่น ๆ ทั้งหมด

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

1
ใช่ทิโมธีฉันไม่ได้ใช้รุ่น 1.7 ขึ้นไปตอนที่ฉันเริ่มโครงการ ตอนนี้ onwords ฉันใช้ jquery 1.7+ .. ขอบคุณสำหรับคำแนะนำที่ดี & ตอบกลับ .. ขอบคุณมาก :)
Abhishek B.

7
มันใช้งานได้ดี ฉันต้องการคลิกและเริ่มต้นเพื่อทำสิ่งเดียวกันและฉันคุ้นเคยกับไวยากรณ์ที่ไม่ใช่วัตถุเช่น$('#whatever').on('touchstart click', function(){ /* do something... */ });
goodeye

1
เมื่อฉันไป$('#whatever').on({ 'touchstart' : function(ev){}});, evไม่ได้ดูเหมือนจะมีข้อมูลเกี่ยวกับการสัมผัส (สัมผัส targetTouches หรือ changedTouches)
ปลาหมึก

8
@Octopus: ev.originalEventคุณจะพบข้อมูลสัมผัสภายใต้
Peter Bloomfield

1
@ edonbajrami ใช่แน่นอน ตรวจสอบเอกสารและค้นหา "กิจกรรมที่มอบหมาย" $ ("# element ที่จะตรวจสอบองค์ประกอบใหม่"). on ("eventX", "#element", ฟังก์ชั่น (event) {/ * ก็ตาม * /}
honk31

24

วิธีที่ง่ายที่สุดคือการใช้ห้องสมุด JavaScript multitouch เช่น 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
    });

และคุณสามารถไปต่อ มันรองรับการแตะ, แตะสองครั้ง, รูด, ถือ, แปลง (เช่นหยิก) และลาก กิจกรรมการสัมผัสยังทำงานเมื่อมีการกระทำของเมาส์เท่ากันดังนั้นคุณไม่จำเป็นต้องเขียนตัวจัดการเหตุการณ์สองชุด โอ้และคุณต้องการปลั๊กอิน jQuery ถ้าคุณต้องการที่จะสามารถเขียนในแบบ jQueryish เหมือนที่ฉันทำ


29
วิธีการแก้ปัญหา "ที่ง่ายที่สุด" ไม่เคยเกี่ยวข้องกับการสร้างปัญหาที่ซับซ้อนมากขึ้นโดยการเพิ่มห้องสมุด
Octopus

13
@ Octopus ทางออกที่ง่ายที่สุดคือการใช้ hammer.js ที่ทำให้บทคัดย่อปวดหัวข้ามเบราว์เซอร์ ใช้ส่วนขยาย jQuery เพื่อให้อยู่ในโซนที่คุณคุ้นเคย ดูเหมือนจะไม่ซับซ้อนสำหรับฉัน
trusktr

1
โซลูชันที่ "ง่ายที่สุด" นั้นมักเป็นโซลูชันที่ผู้คนมักจะทำมากที่สุด ... ไม่ว่าคุณจะทำอะไรอย่าลืมตรวจสอบให้แน่ใจว่าโซลูชันของคุณทำงานบนอุปกรณ์ที่รองรับการสัมผัสและเมาส์เช่น Microsoft Surface
Simon_Weaver

1
@ Octopus: "เมื่อสิ่งที่คุณมีคือค้อน [sic] ... ทุกอย่างดูเหมือนเป็นเล็บ" :)
Gone Coding

มันเป็นเวลาที่ค้อน! ขอบคุณที่แชร์ห้องสมุดนี้มันง่ายในการติดตั้งบนแอปพลิเคชันของฉันและเริ่มทำงาน! ใช้เวลาสองวินาทีในการตั้งค่าเนื่องจากตัวจัดการเหตุการณ์แตกต่างกัน แต่ console.log (เหตุการณ์) จะบอกสิ่งที่คุณต้องการ ขอขอบคุณ!
Andy

24

การใช้ touchstart หรือ touchend alone นั้นไม่ใช่วิธีที่ดีเพราะถ้าคุณเลื่อนหน้าจออุปกรณ์จะตรวจพบว่าเป็นการแตะหรือแตะด้วย ดังนั้นวิธีที่ดีที่สุดในการตรวจจับเหตุการณ์การแตะและคลิกในเวลาเดียวกันคือการตรวจจับเหตุการณ์การสัมผัสที่ไม่ได้เคลื่อนย้ายหน้าจอ (การเลื่อน) ในการทำเช่นนี้เพียงแค่เพิ่มรหัสนี้ลงในแอปพลิเคชันของคุณ:

$(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 มันตรวจจับการแตะและสามารถแยกความแตกต่างของการแตะและสัมผัสได้อย่างง่ายดาย


2
วิธีนี้ดูเหมือนจะตรงไปตรงมาที่สุดที่ฉันพบและทำงานได้ดีบน iOS
Joshua Lawrence Austill

ฉันใช้ jquery mobile ก่อน แต่หลังจากนั้นมันก็รบกวนการทำงานอื่น ๆ ฉันใช้สิ่งนี้ในตอนนี้และทำงานได้อย่างสมบูรณ์แบบ ยังไม่มีปัญหา
Anurag Priyadarshi

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
  }
});

ยกเว้นที่.bindเลิกใช้แล้ว คุณควรใช้.on
jcuenod

15

jQuery Core ไม่มีอะไรพิเศษ แต่คุณสามารถอ่านได้ที่หน้าjQuery Mobile Eventsเกี่ยวกับกิจกรรมการสัมผัสที่แตกต่างกันซึ่งยังทำงานบนอุปกรณ์อื่นนอกเหนือจากอุปกรณ์ iOS เช่นกัน

พวกเขาเป็น:

  • แตะเบา ๆ
  • taphold
  • งาบ
  • ปัดไปทางซ้าย
  • swiperight

โปรดสังเกตว่าในระหว่างการเลื่อนเหตุการณ์ (ขึ้นอยู่กับการสัมผัสบนอุปกรณ์มือถือ) อุปกรณ์ iOS จะหยุดการจัดการ DOM ขณะเลื่อน


ขอบคุณที่ให้เวลาสำคัญกับคำถามของฉัน ฉันกำลังดูเหตุการณ์ Jquery Mobile .. ขอบคุณ
Abhishek B.

เหตุการณ์เหล่านั้นไม่ได้เป็นตัวแทนของการโต้ตอบแบบสัมผัสจริง
trusktr

jQuery Core เป็นคำนามที่เหมาะสมหรือไม่?
Peter Mortensen

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>

ฉันยังเพิ่มนี้เพื่อตรวจหาเท่าใดเวลาที่ผ่านมาตั้งแต่เหตุการณ์ที่ผ่านมา ..document.getElementById("ttime").innerHTML = ((new Date()) - touchTime); touchTime = new Date();
hanamj

3

ฉันเพิ่งทดสอบปลั๊กอิน GitHub jQuery Touch Events ของ benmajor สำหรับ jQueryทั้งรุ่น 1.4 และ 1.7+ มันมีน้ำหนักเบาและทำงานได้อย่างสมบูรณ์แบบทั้งกับonและbindในขณะที่ให้การสนับสนุนสำหรับกิจกรรมสัมผัสที่ครบถ้วนสมบูรณ์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.