2011-11-08 7 views
5

Sto utilizzando il codice seguente per consentire il trascinamento della selezione sul mio sito Web. Tuttavia, mentre le parti del mio codice che hanno funzionalità di trascinamento della selezione, su un iPhone, non riesco a scorrere o spostare la pagina in alcun modo. Posso trascinare lo spostamento &, ma la normale funzionalità touch di iPhone non funziona più!Trascinare la selezione sui dispositivi mobili utilizzando un codice che traduce l'evento (codice incluso), ma gli eventi normali non funzionano

Ho trovato il frammento di seguito in diverse risposte StackOverflow quindi mi chiedo se c'è una soluzione per questo. Voglio essere in grado di trascinare & di rilascio su entrambi i siti Web & mobile.

Grazie!

mio codice trascinamento (solo un elenco):

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

codice per gli eventi di tocco:

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

Volevo solo dire che lo uso su un'app Web per l'iPad. Tutti gli altri eventi funzionano correttamente, deve essere un errore nel codice. Per riferimento: http://www.midemos.com/demos/iphone/touch/?/iphone/touch/ – Charlie

risposta

1

ho lavorato sullo stesso problema e che ho appena leccato. Ho rimosso il coraggio di touchHandler e li uso per popolare il callback che lega gli ascoltatori di eventi solo ai figli di <div id='stage'>. Di seguito è riportato il mio codice utilizzando jquery. Spero che questo ti aiuti!

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

Ovviamente, sarebbe meglio impostare la stringa di selettore ("#stage") come argomento per init, o passare init() a una matrice di stringhe di selettore e eseguire il binding in un ciclo per ciascun elemento. – joatis

0

ti impedisce la funzionalità di scorrimento di default con questa riga di codice:

event.preventDefault(); 

Poiché questo oggetto evento è legato al documento, tutti gli scroll nativi sono disabilitati.

Se si desidera consentire lo scorrimento della pagina in modo nativo, aggiungere i listener di eventi a un discendente dell'elemento del documento (in questo modo se l'utente scorre in una regione diversa dal contenitore ordinabile, sarà in grado di scorrere normalmente la pagina) .

Cambio:

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

A:

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

ah .. ok ha senso. così questo #sortable_container può essere l'id di qualche div forse dove voglio permettere gli eventi touch ..? –

+0

Sì, questa è l'idea. Quindi, se l'utente scorre su 'div # sortable_container', il gestore di eventi di trascinamento scatterà, altrimenti sarà in grado di scorrere la pagina in modo nativo. – Jasper

+0

Ho 2 posizioni sul mio sito che voglio consentire il trascinamento. Così ho:

...
...
ho provato a chiamare il legato sulla #dragregion ma nessuno di trascinamento funziona ora:/ –

Problemi correlati