2012-12-20 9 views
6

Attualmente sto sviluppando una pagina Web per un iPhone che contiene un elemento DIV che l'utente può toccare e trascinare. Inoltre, quando l'utente trascina l'elemento nella parte superiore o inferiore dello schermo del dispositivo, voglio scorrere automaticamente la pagina verso l'alto o verso il basso.iOS tocca alla vista del dispositivo x/y coordinate via Javascript

Il problema che sto riscontrando è cercare di determinare una formula affidabile per ottenere le coordinate nell'evento onTouchMove che corrispondono al dito dell'utente che raggiunge la parte superiore o inferiore della finestra del dispositivo. La mia formula attuale sembra noiosa e credo che ci possa essere un modo più semplice per farlo.

La mia formula attuale per determinare se l'evento di tocco ha raggiunto la parte inferiore dello schermo:

function onTouchMoveHandler(e) 
{ 
    var orientation=parent.window.orientation; 
    var landscape=(orientation==0 || orientation==180)?true:false; 
    var touchoffsety=(!landscape?screen.height - (screen.height - screen.availHeight):screen.width - (screen.width - screen.availWidth)) - e.touches[0].screenY + (window.pageYOffset * .8); 
    if(touchoffsety < 40) alert('finger is heading off the bottom of the screen'); 
} 

Ho fatto un po 'di Javascript riflessione su oggetti come le finestre, documenti, corpo, e.touches per vedere se potessi trovare una serie di numeri che equivarrebbe sempre ad essere uguale alla parte superiore o inferiore dello schermo, ma senza successo affidabile. Aiutare con questo sarebbe molto apprezzato.

+0

Ecco un collegamento con una spiegazione approfondita di diverse piattaforme mobili e variabili Javascript che descrivono le dimensioni del viewport e quanto possono differire l'una dall'altra. Questo mi ha aiutato a trovare la risposta: http://tripleodeon.com/2011/12/first-understand-your-screen/ – Brain2000

risposta

2

Supponendo che il campo screenY mantenga la coordinata y relativa allo schermo indipendentemente dalla posizione di scorrimento corrente, il calcolo corrente non ha molto senso per me. Spero di non aver frainteso ciò che stai cercando di fare.

Per scoprire se un tocco è vicino alla parte superiore o inferiore del dispositivo, vorrei prima controllare se ScreenY è vicino alla parte superiore (superiore essendo 0), poiché è possibile lavorare direttamente con quel valore. Quindi, se non è vicino alla cima, calcola quanto è vicino al fondo e controlla quello.

var touch = e.touches[0]; 
if (touch.screenY < 50) 
{ 
    alert("Closing in on Top"); 
} 
else //Only do bottom calculations if needed 
{ 
    var orientation=parent.window.orientation; 
    var landscape=(orientation==0 || orientation==180)?true:false; 
    //height - (height - availHeight) is the same as just using availHeight, so just get the screen height like this 
    var screenHeight = !landscape ? screen.availHeight : screen.availWidth; 
    var bottomOffset = screenHeight - touch.screenY; //Get the distance of the touch from the bottom 
    if (bottomOffset < 50) 
     alert("Closing in on Bottom"); 
} 
+0

Questo è uno dei problemi che ho incontrato. Uno avrebbe pensato che ScreenY è tutto ciò di cui hai bisogno, ma non è questo il caso. Uno dei motivi è che se si dispone di due iFrame e si trascina un DIV nella parte inferiore di iFrame, i numeri sembrano inclinati a seconda di quanto si scorrono attualmente verso il basso. È qui che entra in gioco window.pageYOffset, che indica fino a che punto scorre la finestra del browser. Ma a seconda di dove viene fatto scorrere, sembra che l'importo corretto sia superiore o inferiore. Ecco perché l'ho modificato moltiplicandolo per 8, ma è ancora pignolo. – Brain2000

+0

Hai provato cliente? Forse questo ti aiuterà anche tu: http://stackoverflow.com/questions/5885808/includes-touch-events-clientx-y-scrolling-or-not – Wutz

+0

Sì, ho provato tutti e tre, clientY, screenY e touchY. – Brain2000

1

In realtà non è male. Si potrebbe anche usare Zepto.js e la sua built-in eventi di tocco e .offset() metodo per ottenere un po 'più facile:

Tuttavia, io sono interessato a sapere se o non riesci effettivamente a farlo scorrere in basso, e se la performance è abbastanza fluida da rendere l'effetto utile. (lo scorrimento frequente in iOS interrompe JavaScript molto duramente)

+0

Ho funzionato abbastanza bene su un iPad 1 usando window.outerHeight - touch.screenY <40. Sto usando un setTimeout a 20 millisecondi per lo scorrimento impostando il parametro .scrollTop incrementato di 20 pixel ogni volta. Sto anche spostando il div su cui il tuo dito è trattenuto dalla stessa quantità in modo che non si muova mentre lo sfondo scorre. La performance è in realtà piuttosto liscia. – Brain2000