มีตำแหน่งเทียบเท่ากับ e.PageX สำหรับเหตุการณ์ 'touchstart' เนื่องจากมีสำหรับเหตุการณ์คลิกหรือไม่?


104

ฉันพยายามรับตำแหน่ง X ด้วย jQuery ของเหตุการณ์ touchstart ที่ใช้กับฟังก์ชันถ่ายทอดสดหรือไม่

ได้แก่

$('#box').live('touchstart', function(e) { var xPos = e.PageX; } );

ตอนนี้สิ่งนี้ใช้ได้กับ "คลิก" เป็นเหตุการณ์ ฉันจะได้รับมันด้วยเหตุการณ์สัมผัสบนโลก (โดยไม่ใช้alpha jQuery) ได้อย่างไร

ความคิดใด ๆ ?

ขอบคุณสำหรับความช่วยเหลือ


ฉันพบสิ่งนี้สำหรับผู้ที่ต้องการความช่วยเหลือเกี่ยวกับสิ่งนี้: - stackoverflow.com/questions/3183872/…นอกจากนี้ยังใช้งานได้กับ touchstart
แว็กซ์

คำตอบ:


180

มาช้า แต่คุณต้องเข้าถึงเหตุการณ์เดิมไม่ใช่ jQuery ที่นวด นอกจากนี้เนื่องจากเหตุการณ์เหล่านี้เป็นเหตุการณ์แบบมัลติทัชจึงต้องทำการเปลี่ยนแปลงอื่น ๆ :

$('#box').live('touchstart', function(e) {
  var xPos = e.originalEvent.touches[0].pageX;
});

หากคุณต้องการนิ้วอื่นคุณสามารถค้นหาได้ในดัชนีอื่น ๆ ของรายการสัมผัส

อัปเดตสำหรับ JQUERY ที่ใหม่กว่า:

$(document).on('touchstart', '#box', function(e) {
  var xPos = e.originalEvent.touches[0].pageX;
});

คุณมีวงเล็บปิดท้ายที่ขาดหายไปมันควรจะเป็น:})
SteveLacy

ใช่คุณเป็น แปลกใจไม่มีใครสังเกตเห็นมา 2 ปี! =) ขอบคุณ!
mkoistinen

แต่น่าเสียดายที่ไม่ได้ทำงานสำหรับฉันฉันลงเอยด้วยการที่จะได้รับ x และ y touchmoveในครั้งแรก
andrewb

@andrewb เพิ่มe.preventDefault()ในtouchstartตัวจัดการเหตุการณ์
matewka

ขอบคุณเพื่อน. e.touches[0].pageX;ทำงานได้ดีสำหรับฉัน
Jayant Varshney

43

ฉันใช้ฟังก์ชันง่ายๆนี้สำหรับโครงการที่ใช้ JQuery

    var pointerEventToXY = function(e){
      var out = {x:0, y:0};
      if(e.type == 'touchstart' || e.type == 'touchmove' || e.type == 'touchend' || e.type == 'touchcancel'){
        var touch = e.originalEvent.touches[0] || e.originalEvent.changedTouches[0];
        out.x = touch.pageX;
        out.y = touch.pageY;
      } else if (e.type == 'mousedown' || e.type == 'mouseup' || e.type == 'mousemove' || e.type == 'mouseover'|| e.type=='mouseout' || e.type=='mouseenter' || e.type=='mouseleave') {
        out.x = e.pageX;
        out.y = e.pageY;
      }
      return out;
    };

ตัวอย่าง:

$('a').on('mousedown touchstart', function(e){
  console.log(pointerEventToXY(e)); // will return obj ..kind of {x:20,y:40}
})

หวังว่านี่จะเป็นประโยชน์สำหรับคุณ;)


13
ไม่จำเป็นต้องตรวจสอบประเภทเหตุการณ์เนื่องจาก e.pageX จะไม่ได้กำหนดไว้สำหรับเหตุการณ์การสัมผัส แค่ทำout.x = e.pageX || e.originalEvent.touches[0].pageX;
กริฟฟิน

1
ก่อนที่จะกลับออกไปฉันเพิ่มส่วนนี้เพื่อรับตำแหน่งเปอร์เซ็นต์ตามองค์ประกอบหลักในกรณีที่ช่วยใครก็ได้ ... var offsetParent = e.target.offsetParent; var parentLeft = e.target.offsetParent.offsetLeft; out.percentX = (out.x - offsetParent.offsetLeft) / offsetParent.offsetWidth; out.percentY = (out.y - offsetParent.offsetTop) / offsetParent.offsetHeight; กลับออกไป;
sradforth

if(e.type == 'touchstart' || e.type == 'touchmove' || e.type == 'touchend' || e.type == 'touchcancel'){-> if (e.type.startsWith("touch"))?
gil9red

@Griffin - ฉันคิดว่าปัญหากับคำแนะนำของคุณคือบนเดสก์ท็อปเมื่อเมาส์อยู่ที่ขอบด้านซ้ายของเอกสารสาขาแรกของคำสั่งของคุณจะให้ผลเป็น 0 ซึ่งถูกตีความว่าเป็นเท็จและข้อผิดพลาดของเบราว์เซอร์เนื่องจากการสัมผัส ไม่ได้กำหนดไว้ในสาขาที่สอง ตกลง?
MSC

13

ฉันลองใช้คำตอบอื่น ๆ ที่นี่ แต่ originalEvent ก็ไม่ได้กำหนดเช่นกัน เมื่อตรวจสอบพบคุณสมบัติประเภท TouchList (ตามคำแนะนำของผู้โพสต์อื่น) และจัดการเพื่อไปที่ pageX / Y ด้วยวิธีนี้:

var x = e.changedTouches[0].pageX;

4
ใช้งานได้ดีสำหรับรหัสที่ใช้จาวาสคริปต์ทั้งหมด screw jquery
Martian2049

2
ผู้ช่วยของฉัน! ทำงานได้อย่างสมบูรณ์แบบแม้กระทั่งกับ touchmove ()
Tibix

7

หากคุณไม่ได้ใช้ jQuery ... คุณต้องเข้าถึงหนึ่งในเหตุการณ์TouchListเพื่อรับTouchวัตถุที่มีpageX/Y clientX/Yฯลฯ

ลิงค์ไปยังเอกสารที่เกี่ยวข้องมีดังนี้

ฉันใช้e.targetTouches[0].pageXในกรณีของฉัน


0

ตรวจสอบซาฟารีอ้างอิงนักพัฒนาในระดับสัมผัส

ตามนี้ควรมี pageX / Y - บางทีคุณควรตรวจการสะกด? ตรวจสอบให้แน่ใจว่าpageXไม่ใช่PageX

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