2009-03-21 14 views
14

Sto cercando le opzioni su come tracciare lo zoom e il panning dell'utente su una pagina quando viene visualizzato in Safari su un iPhone. Safari espone gli eventi di spostamento e di gesto, quindi, in teoria, posso tenere un conto corrente delle operazioni di panoramica e zoom, ma sembra eccessivo poiché il browser deve monitorarlo internamente.Safari iPhone - Come rilevare il livello di zoom e l'offset?

Queste informazioni sono esposte tramite il modello di oggetto documento?

risposta

2

Secondo lo Safari Web Content Guide, gli eventi di zoom (doppio tocco) non sono esposti, quindi non sono sicuro di come sia possibile rintracciarlo.

Non credo che questa informazione sia esposta attraverso il DOM.

1

In realtà penso che le cose potrebbero essere spostate un po 'dopo la risposta di Steve, come dare un'occhiata al link guida contenuto che ha fornito posso vedere una sezione su Handling Multi-Touch Events e anche Handling Gesture Events.

Non li ho ancora provati ma sembrano abbastanza promettenti. Io fornire un aggiornamento una volta li ho controllato fuori e avere un link demo disponibile ...

+0

google fastflip (http://fastflip.googlelabs.com/) lo fa, quindi è certamente possibile – cobbal

+0

Hai ricevuto un aggiornamento? ;) – alex

22

Quando si esegue lo zoom in, window.innerWidth viene regolato, ma document.documentElement.clientWidth non è, quindi:

var zoom = document.documentElement.clientWidth/window.innerWidth; 

(Ho provato iOS4, senza viewport<meta>).

Tuttavia, non fare affidamento su di esso per qualcosa di importante. Dimensioni/dimensioni dei pixel della finestra DOM nei browser mobili are a complete mess.

+0

Grazie per quello. È un hack, ma suona come potrebbe effettivamente funzionare, che è almeno qualcosa. –

+3

Sottolineando solo qui (quindi è necessario un numero inferiore di doc run) che 'document.documentElement.clientWidth' non include le scrollbar, mentre' window.innerWidth' fa. Lo stesso per altezza. – icedwater

+0

Ignorando le barre di scorrimento, per Safari 10, la sua var zoom = document.documentElement.clientWidth/window.outerWidth; – uchuugaka

0

misuro ingrandire in questo modo (funziona su iOS solo):

screenOrientedWidth = screen.width; 
if (window.orientation == 90) { 
    screenOrientedWidth = screen.height; 
} 
return screenOrientedWidth/window.innerWidth; 

Non dipende di quanto ampio contenuto è.

Tuttavia, in iOS Safari window.innerWidth non è corretto all'interno di un gestore gestureend. È necessario rinviare tale calcolo per l'esecuzione successiva. In GWT, utilizzo scheduleDeferred, ma non posso dire come implementarlo in puro JavaScript.

1

Su Mobile Safari e Android, ecco un modo accurato per misurare quanto è stata ingrandita la pagina.

Provalo qui: http://jsbin.com/cobucu/3 - cambia zoom quindi fai clic su misura.

Tecnica è quello di aggiungere un livello div superiore:

<body> 
<div id=measurer style="position:absolute;width:100%"></div> 

e utilizzare il calcolo:

function getZoom(){ 
    return document.getElementById('measurer').offsetWidth/window.innerWidth; 
} 

L'unico problema è trovare un modo ordinato per rilevare che l'utente ha modificato zoom (pinch , doppio tocco, ecc.).Opzioni:

  • webkitRequestAnimationFrame: molto affidabile, ma che possa causare jankiness se si utilizza animazioni (a causa di calo di prestazioni)
  • setInterval: affidabili, ma molto brutto
  • eventi touch: cerca due dita o doppio tap : brutto e forse difficile da rendere affidabile al 100%
  • window.onresize + window.onorientationchange + window.onscroll: semplice ma totalmente inaffidabile (Modifica: e onscroll può causare problemi di prestazioni in WKWebView o Mobile Safari 8 o versioni successive).

PS: Windows Phone ha bisogno di una soluzione diversa (pinch-zoom non cambia la finestra - pinch-zoom su Windows ha la sua propria finestra separata che non è visibile a JavaScript).

Problemi correlati