2011-11-08 10 views
5

Web sitemde dokunarak sürükleyip bırakmaya izin vermek için aşağıdaki kodu kullanıyorum. Bununla birlikte, benim sürükle/bırak işlevine sahip kodumun parçaları bir iPhone'da çalışırken, yine de sayfayı kaydırılamıyor veya taşıyamıyorum. &'u sürükleyip bırakabilirim, ancak normal iPhone dokunma işlevi gitti!Olayı çeviren bir kod kullanarak mobil aygıtlarda açılan sürükle (kod dahil), ancak normal olaylar çalışmıyor

Aşağıdaki parçacıkları birkaç stackoverflow yanıtında buldum, bu yüzden bunun için bir çözüm olup olmadığını merak ediyorum. Web'de hem & hem de web & cep telefonuna bırakabilmek istiyorum.

Teşekkürler!

benim sürükleme kodu (sadece liste): Dokunmatik olaylar için

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

kodu:

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

Sadece bunu iPad için bir web uygulamasında kullandığımı söylemek istedim. Diğer tüm etkinlikler iyi çalışıyor, kodunuzda bir hata olmalı. Referans için: http://www.midemos.com/demos/iphone/touch/?/iphone/touch/ – Charlie

cevap

1

aynı sorun üzerinde çalışıyoruz ve oldum ben sadece yaladı düşünüyorum. TouchHandler'ın bağırsaklarını kaldırdım ve olay dinleyicilerini yalnızca <div id='stage'>'un çocuklarına bağlayan geri bildirimi doldurmak için kullanıyorum. Aşağıda jquery kullanarak kodum var. Bu yardımcı olur umarım!

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

Tabii ki, selektör dizgisini ("#stage") init için bir argümanı yapmak ya da init() dizisini selektör dizilerini geçirmek ve her bir öğe için bir döngüde bağlamayı yapmak daha iyi olurdu. – joatis

0

Sen bu kod satırı ile varsayılan kaydırma işlevselliği engelliyor:

event.preventDefault(); 

Bu olay nesnesi belgeye bağlı olduğundan, tüm yerel kaydırmalar devre dışı bırakılmıştır.

Sayfanın doğal olarak kaydırılmasına izin vermek istiyorsanız, olay dinleyicilerinizi belge öğesinin bir alt öğeye ekleyin (böylece kullanıcı, sıralı bir konteynırdan başka bir bölgede kaydırırsa, sayfayı normal olarak kaydırır). .

Değişimi:

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

için:

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

ah .. tamam anlamlıdır. Yani bu #sortable_container belki de dokunmatik olaylara izin vermek istediğim bazı divların kimliği olur mu? –

+0

Evet, bu fikir. Böylece, kullanıcı 'div # sortable_container' üzerinde kaydırırsa, sürükleme olay işleyicisi tetiklenir, aksi takdirde sayfayı doğal olarak kaydırır. – Jasper

+0

Sitemde sürüklemeye izin vermek istediğiniz 2 yerim var.

...
...
Ben #dragregion üzerinde bağlama aramaya çalıştım ama sürükleyerek hiçbiri artık işler: Ben var/ –

İlgili konular