2011-11-08 27 views
5

Tôi đang sử dụng mã bên dưới để cho phép kéo và thả cảm ứng trên trang web của mình. Tuy nhiên, trong khi các phần của mã của tôi có chức năng kéo/thả hoạt động, trên iPhone, tôi không thể cuộn hoặc di chuyển trang. Tôi có thể kéo thả &, nhưng chức năng cảm ứng iPhone thông thường đã biến mất!Kéo thả trên thiết bị di động sử dụng một số mã dịch sự kiện (bao gồm mã), nhưng sự kiện bình thường không hoạt động

Tôi đã tìm thấy đoạn mã dưới đây trong một số phản hồi lưu lượng truy cập stackoverflow vì vậy tôi tự hỏi liệu có giải pháp cho việc này hay không. Tôi muốn có thể kéo & thả trên cả hai trang web & thiết bị di động.

Cảm ơn!

đang kéo tôi (chỉ là một danh sách):

$(function() { 
    $(".drag_me ul").sortable(); 
}); 

mã cho sự kiện liên lạc:

function touchHandler(event) 
{ 
var touches = event.changedTouches, 
    first = touches[0], 
    type = ""; 

    switch(event.type) 
{ 
    case "touchstart": type = "mousedown"; break; 
    case "touchmove": type="mousemove"; break;   
    case "touchend": type="mouseup"; break; 
    default: return; 
} 
var simulatedEvent = document.createEvent("MouseEvent"); 
simulatedEvent.initMouseEvent(type, true, true, window, 1, 
          first.screenX, first.screenY, 
          first.clientX, first.clientY, false, 
          false, false, false, 0/*left*/, null); 

first.target.dispatchEvent(simulatedEvent); 
event.preventDefault(); 
} 

function init() 
{ 
    document.addEventListener("touchstart", touchHandler, true); 
    document.addEventListener("touchmove", touchHandler, true); 
    document.addEventListener("touchend", touchHandler, true); 
    document.addEventListener("touchcancel", touchHandler, true);  
} 
+0

Chỉ muốn nói rằng tôi sử dụng ứng dụng này trên một ứng dụng web của tôi dành cho iPad. Tất cả các sự kiện khác hoạt động tốt, nó phải là một lỗi trong mã của bạn. Để tham khảo: http://www.midemos.com/demos/iphone/touch/?/iphone/touch/ – Charlie

Trả lời

1

Tôi đã làm việc trên cùng một vấn đề và nghĩ rằng tôi chỉ liếm nó. Tôi gỡ bỏ ruột của touchHandler và sử dụng chúng để điền vào gọi lại chỉ liên kết người nghe sự kiện với con của <div id='stage'>. Dưới đây là mã của tôi bằng cách sử dụng jquery. Hi vọng điêu nay co ich!

function init(){ 


$("#stage").children().bind('touchstart touchmove touchend touchcancel', function(){ 
    var touches = event.changedTouches, first = touches[0], type = ""; 
    switch(event.type){  
     case "touchstart": type = "mousedown"; 
    break;  
     case "touchmove": type="mousemove"; 
    break;    
     case "touchend": type="mouseup"; 
    break;  
     default: return; 
    } 

    var simulatedEvent = document.createEvent("MouseEvent"); 
    simulatedEvent.initMouseEvent(type, true, true, window, 1, 
         first.screenX, first.screenY, 
         first.clientX, first.clientY, false, 
         false, false, false, 0/*left*/, null); 
    first.target.dispatchEvent(simulatedEvent); 
    event.preventDefault(); 
    }); 
} 
+0

Tất nhiên, sẽ tốt hơn nếu làm cho chuỗi chọn ("#stage") một đối số để init, hoặc truyền init() một mảng các chuỗi chọn và làm ràng buộc trong một vòng lặp cho mỗi mục. – joatis

0

Bạn đang ngăn chặn các chức năng cuộn mặc định với dòng mã này:

event.preventDefault(); 

Vì đối tượng sự kiện này được gắn với tài liệu, tất cả các cuộn gốc đều bị tắt.

Nếu bạn muốn cho phép cuộn trang một cách tự nhiên, hãy thêm trình xử lý sự kiện vào phần tử tài liệu (theo cách đó nếu người dùng cuộn trong vùng khác với vùng chứa có thể sắp xếp, họ sẽ có thể cuộn trang bình thường) .

Thay đổi:

function init() 
{ 
    document.addEventListener("touchstart", touchHandler, true); 
    document.addEventListener("touchmove", touchHandler, true); 
    document.addEventListener("touchend", touchHandler, true); 
    document.addEventListener("touchcancel", touchHandler, true);  
} 

Để:

function init() 
{ 
    $('#sortable_container').bind('touchstart touchmove touchend touchcancel', touchHandler); 
} 
+0

ah .. ok có ý nghĩa. vì vậy điều này #sortable_container là id của một số div có lẽ nơi tôi muốn cho phép các sự kiện liên lạc ..? –

+0

Vâng, đó là ý tưởng. Vì vậy, nếu người dùng cuộn trên 'div # sortable_container' thì trình xử lý sự kiện kéo sẽ kích hoạt, nếu không họ sẽ có thể tự cuộn trang. – Jasper

+0

Tôi có 2 địa điểm trên trang web của mình mà tôi muốn cho phép kéo. Vì vậy, tôi có:

...
...
Tôi cố gắng để gọi các ràng buộc trên #dragregion nhưng không ai trong số các kéo làm việc bây giờ:/ –

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