2009-03-22 11 views
6

Tôi đang ràng buộc sự kiện trực tiếp trên các liên kết trong ứng dụng PhoneGap của mình. Sự kiện không thành công (được xác nhận bởi alert() ing), nhưng có vẻ như bất kỳ dữ liệu cảm ứng nào không được gắn với đối tượng sự kiện như nó phải như vậy. Điều này xảy ra trên tất cả các sự kiện chạm - touchstart, touchmovetouchend.jQuery live() xóa thuộc tính sự kiện chạm iPhone?

$('a').live('touchend', function(event) { 
    event.preventDefault(); 
    alert(event.touches.length); // event.touches should be populated! 
}); 

Bất kỳ ý tưởng nào? Tôi có SOL với jQuery.live() không?

Trả lời

2

Sự kiện chạm hiện không được hỗ trợ bởi Events/live.

Từ các tài liệu:

giá trị sự kiện có thể xảy ra: nhấp chuột, dblclick, mousedown, mouseup, MouseMove, mouseover, mouseout, KeyDown, bấm phím, KeyUp

Hiện nay không được hỗ trợ: làm mờ, focus, mouseenter, mouseleave, thay đổi, gửi

Bạn có thể cân nhắc việc thử sử dụng nhấp chuột nếu điều đó sẽ phù hợp với nhu cầu của bạn, hoặc bạn có thể chuyển sang sử dụng livequery, có thể sẽ hỗ trợ nó. (livequery là nội dung trực tiếp ban đầu dựa trên, tôi không chắc chắn tại sao nó không hỗ trợ tất cả các sự kiện tương tự)

+0

Tôi sẽ cố gắng ra livequery, cảm ơn. Hình như các sự kiện liên lạc đã bị bắt OK rằng họ đã được hỗ trợ khá, nhưng tôi đoán một cái gì đó thêm phải xảy ra để vượt qua cùng tất cả các thuộc tính sự kiện. – ceejayoz

+0

Tôi tin rằng livequery sử dụng tính giờ và đó là lý do tại sao nó có thể hỗ trợ nhiều hơn nữa. Nhóm jQuery đã sử dụng một phương pháp khác hiệu quả hơn, nhưng cũng bị giới hạn. – Jab

16

Thực ra, bạn có thể sử dụng phương thức .live. Bạn không có thuộc tính event.touches vì ​​cách jQuery xử lý các sự kiện trong nội bộ. Để "sửa" sự kiện, jQuery nhân bản sự kiện. Khi làm như vậy, nó chỉ sao chép trên một số lượng giới hạn các thuộc tính vì lý do hiệu suất. Tuy nhiên, bạn vẫn có thể truy cập đối tượng sự kiện ban đầu thông qua thuộc tính event.originalEvent.

Vì vậy, ví dụ mã của bạn sẽ cần phải trông giống như sau:

$('a').live('touchend', function(event) { 
    event.preventDefault(); 
    console.log(event.originalEvent.touches.length); 
}); 

Sau đây là các tính năng mà được sao chép qua: http://github.com/jquery/jquery/blob/master/src/event.js#L411

+0

Điều này có vẻ đúng trong jQuery 1.4 mới. Nó không phải là trường hợp trong 1.3. – ceejayoz

+1

jQuery 1.3.x có cùng một hành vi, để sao chép qua một số thuộc tính chung và hiển thị sự kiện ban đầu dưới dạng thuộc tính originalEvent. Nguồn có liên quan: http://github.com/jquery/jquery/blob/1.3/src/event.js#L282 –