2012-02-12 27 views
15

Tôi đang làm việc trên trò chơi canvas html5 nhưng tôi không biết cách xử lý các sự kiện chạm. Khi người dùng chạm vào màn hình và kéo, khi đó trình duyệt sẽ cuộn trang. Tôi muốn ngăn chặn nó, và bắt đầu cảm ứng, và chạm vào vị trí kết thúc. Có thể không?Ngăn cuộn trang khi kéo trong IOS và Android

Cảm ơn trước

+1

Tự bắt đầu từ đây http://jquerymobile.com/ – ShankarSangoli

+3

Xin lỗi, nhưng tôi không muốn sử dụng thư viện. Làm thế nào nó hoạt động sau đó trong jquerymobile? –

+1

Nó không phải là một plugin nhưng thư viện di động jQuery, – ShankarSangoli

Trả lời

19

Bạn cần ghi đè hành vi chạm mặc định để ngừng chạm vào kéo trang. Rõ ràng, bạn sẽ cần phải xử lý chúng một lần nữa nếu trang của bạn trở nên lớn hơn khu vực có sẵn, nhưng khi bạn đang thực hiện một trò chơi, giả sử bạn đang thực hiện bố cục 100%/100%.

Mã này là từ mặc định phonegap index.html nhưng sẽ giúp bạn, tôi chắc chắn.

function preventBehavior(e) { 
    e.preventDefault(); 
}; 

document.addEventListener("touchmove", preventBehavior, false); 

Tôi muốn thêm một điều nữa là bạn hoàn toàn đi đúng hướng để tránh các khuôn khổ. Chúng rất tuyệt vời cho một số thứ, nhưng bạn sẽ nhận được kết quả tốt hơn rất nhiều từ nền tảng.

Chỉnh sửa: đây là số W3C working draft nói về các sự kiện chạm, có thể hữu ích cho bạn.

+1

Trang này thực hiện một công việc tuyệt vời giải thích cách xử lý sự kiện chạm: http: // stackoverflow .com/questions/7056026/biến thể-of-e-touches-e-targettouches-và-e-changestouches – David

+0

Trong một số trường hợp, bạn cũng nên thêm 'document.addEventListener (" touchstart ", preventBehavior, false);' vào mã ở trên để làm cho nó hoạt động. – optimizitor

3
canvas.addEventListener('touchstart', function(e) 
{ 
    alert(e.changedTouches[0].pageX + " " + e.changedTouches[0].pageY); 
} 
canvas.addEventListener('touchend', function(e) 
{ 
    alert(e.changedTouches[0].pageX + " " + e.changedTouches[0].pageY); 
} 

Dưới đây là một bài viết tốt về chạm và cử chỉ trên điện thoại di động:

http://www.sitepen.com/blog/2008/07/10/touching-and-gesturing-on-the-iphone/

+1

Bạn có cần 'e.preventDefault()'? –

9

Nếu bạn không muốn sử dụng jQuery thoại di động hoặc bất kỳ thư viện khác rồi bạn có thể thử điều này.

var startX, startY, endX, endY; 
document.addEventListener("touchstart", function(e){ 
    startX = e.touches[0].pageX; 
    startY = e.touches[0].pageY; 

    e.preventDefault();//Stops the default behavior 
}, false); 

document.addEventListener("touchend", function(e){ 
    endX = e.touches[0].pageX; 
    endY = e.touches[0].pageY; 

    e.preventDefault();//Stops the default behavior 
}, false); 
+0

Tại sao lại là downvote ??? Bạn có thể để lại lý do? – ShankarSangoli

+1

Tôi đã không downvote nhưng ... Bạn có một số lỗi cú pháp và trong bài viết của bạn, bạn đã viết "Nếu bạn' không muốn sử dụng jQuery điện thoại di động "sau đó gửi mã jQuery. OP cho biết anh không muốn sử dụng thư viện. – Will

+1

@WilliamVanRensselaer - Cảm ơn vì điều đó tôi hoàn toàn bỏ lỡ OP cũng không sử dụng jQuery. Tôi nghĩ OP không muốn jQuery di động. Nhưng bây giờ đã sửa đổi mã của tôi để sử dụng JavaScript đơn giản. – ShankarSangoli

5

Do vi phạm các thay đổi được thực hiện trong các phiên bản Chrome gần đây, các câu trả lời ở trên không còn chính xác nữa. Gắn trình nghe sự kiện cảm ứng vào tài liệu hoặc phần tử nội dung sẽ khiến trình xử lý sự kiện được đăng ký ở chế độ "thụ động", điều này làm cho các cuộc gọi đến preventDefault bị bỏ qua.

Có hai giải pháp:

  • Các giải pháp ưu tiên là sử dụng CSS phong cách touch-action để xác định rằng không di chuyển nên xảy ra (ví dụ với giá trị "none")

  • Trong trường hợp điều này không thích hợp (ví dụ: nếu loại tương tác sẽ thay đổi động theo cách không thể xác định trước khi cử chỉ bắt đầu) thì trình xử lý sự kiện phải được đăng ký với tham số thứ ba được đặt thành { passive: false } (bạn nên thực hiện phát hiện trình duyệt để đảm bảo rằng phong cách được hỗ trợ đầu tiên, t hough).

Các vấn đề liên quan