2011-10-13 25 views
5

Tôi có một ứng dụng dựa trên web bao gồm một thành phần mà người dùng có thể cuộn lên và xuống bằng ngón tay của họ. Tôi sử dụng phương pháp preventDefault của sự kiện để ngăn chặn hành vi mặc định khi di chuyển cảm ứng dịch chuyển toàn bộ màn hình xung quanh trên các thiết bị iOS.Làm cách nào để ngăn chặn hành vi mặc định của sự kiện touchmove trong iOS 5?

Thật không may điều này dường như không hoạt động nữa trong iOS 5 mà tôi vừa mới nâng cấp lên sáng nay. Tôi phải giả định rằng điều này chỉ được thực hiện khác nhau trong iOS 5, nhưng tôi vẫn chưa thể tìm thấy một tài nguyên cung cấp hướng dẫn.

Cảm ơn!

Cập nhật # 1: Tôi không thể tìm thấy câu trả lời cho câu hỏi cụ thể của mình, nhưng tôi có thể điều chỉnh mã của mình một chút để sử dụng kiểu cuộn -webkit-cuộn (được đặt thành giá trị "chạm ") và thực hiện khả năng di chuyển quán tính snazzy (nơi nội dung cuộn nhanh hơn tùy thuộc vào tốc độ của swipe của bạn và sẽ" cao su ban nhạc trả lại "... Điện thoại

Cập nhật # 2: Bây giờ tôi có một vấn đề lạ khác.Vì một số lý do kỳ lạ rằng hành vi di chuyển tràn bị trộn lẫn đôi khi nhờ đó bạn phải kéo ngón tay sang trái và phải qua phần tử chứa để làm cho nội dung của nó di chuyển lên và xuống. để tìm hiểu lý do tại sao điều này xảy ra - có ai có bất kỳ ý tưởng nào không?

Trả lời

6

Thứ nhất, tôi có thể xác minh rằng e.preventDefault() vô hiệu hóa tất cả di chuyển trong iOS 5 bằng cách sử dụng đoạn mã sau:

document.ontouchmove = function(e){ e.preventDefault(); } 

Thật không may, tuy nhiên, điều này sẽ vô hiệu hóa các di chuyển trên overflow: di chuyển div. (Nếu có ai có giải pháp để cho phép cuộn phần tử bên trong được bật, vui lòng chia sẻ.)

Về cập nhật # 2, tôi đã nhận thấy hành vi lạ khi có phần tử cuộn được lồng trong phần tử cuộn khác (bao gồm cả trang). Đôi khi thiết bị do dự về yếu tố người dùng dự định cuộn. Đặc biệt tôi đã nhận thấy vấn đề này bằng cách sử dụng vị trí: cố định. Giải pháp của tôi là đảm bảo cơ thể có chiều cao 100% và các phần tử cuộn có thể sử dụng vị trí: tuyệt đối nếu có thể.

+0

có lẽ bạn có thể làm một số logic kiểm tra như 'if ($ (e.currentTarget) .css ('tràn') = 'cuộn'!) e .preventDefault(); '. Vì document.ontouchmove sẽ kích hoạt sau ontouchmove của phần tử scollable, bạn có thể làm 'el.ontouchmove = function() {allowScroll = true}' và sau đó có 'document.ontouchmove' sử dụng giá trị đó để xác định hành động và sau đó đặt giá trị trở lại thành sai. –

+0

@BrianNickel Cảm ơn lời khuyên. Đây là một bước đi đúng hướng cho phép bạn ngăn chặn việc di chuyển trực tiếp trên cơ sở từng phần tử (bao gồm việc cuộn trực tiếp trên cơ thể), nhưng nếu người dùng chạm vào một phần tử có thể cuộn đã ở cạnh của cuộn của nó phạm vi, nó vẫn sẽ kết thúc cuộn cơ thể (hiển thị lanh màu xám bên dưới). Có lẽ cách duy nhất để giải thích hướng của touchmove và kiểm tra xem phần tử có nằm ở rìa phạm vi có thể cuộn của nó không? –

+0

@RyanRapp Cảm ơn bạn đã trả lời.Tôi có lẽ đã không mô tả rõ ràng về hành vi mà tôi đang nói đến. Với iOS 4, tôi sẽ sử dụng e.preventDefault() trong phần tử (ví dụ, DIV) với trình xử lý sự kiện touchmove của tràn để tôi có thể dịch chuyển nội dung xung quanh thông qua định vị tuyệt đối dựa trên chuyển động của ngón tay bên trong phần tử. Bây giờ e.preventDefault() chặn nó khi tôi cố gắng di chuyển ngón tay của tôi toàn bộ trang, mà không có đủ nội dung để cuộn, không di chuyển quá nhiều nhưng di chuyển xung quanh để bạn có thể thấy kết cấu nền của Safari đằng sau nó. – natlee75

7

Tôi đã tìm thấy một giải pháp rất đơn giản. Khi sự kiện chạm vào phần tử của bạn được phép cuộn, chỉ cần thêm cờ vào sự kiện. Trên lắng nghe sự kiện trên các tài liệu chỉ cần kiểm tra nếu cờ được thiết lập và chỉ dừng sự kiện nếu cờ không được thiết lập:

this.$scrollableEl.on('touchmove', function(event){ 
    event.comesFromScrollable = true; 
    //when you have containers that are srollable but 
    //doesn't have enough content to scroll sometimes: 
    //event.comesFromScrollable = el.offsetHeight < el.scrollHeight; 
}) 

$document.on('touchmove', function(event){ 
    if(!event.comesFromScrollable){ 
     event.preventDefault() 
    } 
    }) 

Bạn cũng có thể sử dụng event.stopImmediatePropagation thay vào đó, do đó bạn không cần eventListener trên tài liệu yếu tố, nhưng điều này phá vỡ zepto.js tap trong trường hợp của tôi:

this.$scrollableEl.on('touchmove', function(event){ 
    event.stopImmediatePropagation() 
}) 
+0

Xin cảm ơn! Làm việc như một say mê! Tôi đã sửa đổi nó theo cách mà tôi chỉ cần thêm một thuộc tính data-custom và nếu scrolls có sẵn sẽ không bị dừng lại. bằng cách này chúng ta có thể lưu một eventlistener :) –

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