Có vị trí tương đương với e.PageX cho sự kiện 'touchstart' như cho sự kiện nhấp chuột không?


104

Tôi đang cố gắng có được vị trí X với jQuery của một sự kiện touchstart, được sử dụng với chức năng trực tiếp?

I E

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

Bây giờ, điều này hoạt động với sự kiện 'nhấp chuột'. Làm thế nào để tôi có được nó với một sự kiện chạm vào (không sử dụng alpha jQuery Mobile)?

Bất kỳ ý tưởng?

Cảm ơn vì bất kì sự giúp đỡ.


Tôi tìm thấy điều này cho những ai đang cần trợ giúp về điều này: - stackoverflow.com/questions/3183872/… Nó cũng hoạt động trên touchstart.
sáp nhập

Câu trả lời:


180

Kinda trễ, nhưng bạn cần truy cập sự kiện ban đầu, không phải sự kiện được tạo bằng jQuery. Ngoài ra, vì đây là các sự kiện đa chạm nên cần thực hiện các thay đổi khác:

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

Nếu bạn muốn các ngón tay khác, bạn có thể tìm thấy chúng trong các chỉ số khác của danh sách cảm ứng.

CẬP NHẬT CHO JQUERY MỚI HƠN:

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

Bạn có một thiếu ngoặc kết thúc ở cuối, nó phải là:})
SteveLacy

Bạn đúng. Ngạc nhiên không ai để ý trong 2 năm! =) Cảm ơn!
mkoistinen

Thật không may, nó không hiệu quả với tôi, cuối cùng tôi phải lấy x và y trên đầu tiên touchmove.
andrewb

@andrewb, thêm e.preventDefault()vào touchstartxử lý sự kiện.
matewka

Cảm ơn cậu. Vâng e.touches[0].pageX;làm việc cho tôi
Jayant Varshney

43

Tôi sử dụng hàm đơn giản này cho dự án dựa trên 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;
    };

thí dụ:

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

hy vọng điều này sẽ hữu ích cho bạn;)


13
Không cần phải kiểm tra loại sự kiện vì e.pageX sẽ không được xác định cho các sự kiện chạm. Just doout.x = e.pageX || e.originalEvent.touches[0].pageX;
Griffin

1
Trước khi quay lại, tôi thêm phần này để lấy vị trí phần trăm dựa trên phần tử mẹ trong trường hợp nó giúp ích cho bất kỳ ai ... 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; trở ra;
sradforth

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

@Griffin - Tôi nghĩ vấn đề với đề xuất của bạn là trên máy tính để bàn, khi chuột ở cạnh trái của tài liệu, nhánh đầu tiên của câu lệnh của bạn sẽ trả về 0, được hiểu là sai và sau đó trình duyệt bị lỗi do chạm là không xác định trên nhánh thứ hai. Đồng ý?
MSC

13

Tôi đã thử một số câu trả lời khác ở đây, nhưng originalEvent cũng không được xác định. Khi kiểm tra, đã tìm thấy một thuộc tính được phân loại TouchList (theo đề xuất của một người đăng khác) và đã truy cập được pageX / Y theo cách này:

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

4
điều này hoạt động tốt cho tất cả các mã dựa trên javascript. vít jquery
Martian2049

2
Vị cứu tinh của tôi! Hoạt động hoàn hảo ngay cả đối với touchmove ().
Tibix 25/09/18

7

Nếu bạn không sử dụng jQuery ... bạn cần truy cập vào một trong các sự kiện TouchListđể lấy một Touchđối tượng có pageX/Y clientX/Yv.v.

Dưới đây là các liên kết đến các tài liệu liên quan:

Tôi đang sử dụng e.targetTouches[0].pageXtrong trường hợp của tôi.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.