Encontré este código de prueba de orientación a continuación buscando material de referencia JQTouch. Esto funciona correctamente en el simulador de iOS en Safari móvil, pero no se maneja correctamente en Phonegap. Mi proyecto se encuentra con el mismo problema que está matando esta página de prueba. ¿Hay alguna manera de sentir el cambio de orientación usando JavaScript en Phonegap?
window.onorientationchange = function() {
/*window.orientation returns a value that indicates whether iPhone is in portrait mode, landscape mode with the screen turned to the
left, or landscape mode with the screen turned to the right. */
var orientation = window.orientation;
switch (orientation) {
case 0:
/* If in portrait mode, sets the body's class attribute to portrait. Consequently, all style definitions matching the body[class="portrait"] declaration
in the iPhoneOrientation.css file will be selected and used to style "Handling iPhone or iPod touch Orientation Events". */
document.body.setAttribute("class", "portrait");
/* Add a descriptive message on "Handling iPhone or iPod touch Orientation Events" */
document.getElementById("currentOrientation").innerHTML = "Now in portrait orientation (Home button on the bottom).";
break;
case 90:
/* If in landscape mode with the screen turned to the left, sets the body's class attribute to landscapeLeft. In this case, all style definitions matching the
body[class="landscapeLeft"] declaration in the iPhoneOrientation.css file will be selected and used to style "Handling iPhone or iPod touch Orientation Events". */
document.body.setAttribute("class", "landscape");
document.getElementById("currentOrientation").innerHTML = "Now in landscape orientation and turned to the left (Home button to the right).";
break;
case -90:
/* If in landscape mode with the screen turned to the right, sets the body's class attribute to landscapeRight. Here, all style definitions matching the
body[class="landscapeRight"] declaration in the iPhoneOrientation.css file will be selected and used to style "Handling iPhone or iPod touch Orientation Events". */
document.body.setAttribute("class", "landscape");
document.getElementById("currentOrientation").innerHTML = "Now in landscape orientation and turned to the right (Home button to the left).";
break;
}
}
Respuestas:
Esto es lo que hago:
Actualización de mayo de 2019:
window.orientation
es una característica obsoleta y no es compatible con la mayoría de los navegadores de acuerdo con MDN . Elorientationchange
evento está asociado con window.orientation y, por lo tanto, probablemente no debería usarse.fuente
window.onorientationchange = function() { setTimeout(functionName, 0); };
Yo uso
window.onresize = function(){ checkOrientation(); }
Y en checkOrientation puedes emplear window.orientation o body width testing pero la idea es que "window.onresize" es el método de navegador más cruzado, al menos con la mayoría de los navegadores móviles y de escritorio que he tenido oportunidad de probar con.fuente
fuente
resize
evento. Sin embargo, IIRC, estas consultas no funcionarán correctamente con el teclado arriba.Soy bastante nuevo en iOS y Phonegap también, pero pude hacer esto agregando un eventListener. Hice lo mismo (usando el ejemplo al que hace referencia), y no pude hacerlo funcionar. Pero esto parecía hacer el truco:
Es posible que tenga suerte buscando en el grupo PhoneGap Google el término "orientación" .
Un ejemplo del que leí como ejemplo sobre cómo detectar la orientación fue Pie Guy: ( juego , archivo js ). Es similar al código que has publicado, pero como tú ... No pude hacerlo funcionar.
Una advertencia: el EventListener funcionó para mí, pero no estoy seguro de si este es un enfoque demasiado intensivo. Hasta ahora ha sido la única forma que me ha funcionado, pero no sé si hay formas mejores y más optimizadas.
ACTUALIZACIÓN arregló el código anterior, funciona ahora
fuente
Mientras trabajaba con el
orientationchange
evento, necesitaba un tiempo de espera para obtener las dimensiones correctas de los elementos en la página, pero matchMedia funcionó bien. Mi codigo final:fuente
Creo que la respuesta correcta ya ha sido publicada y aceptada, sin embargo, hay un problema que he experimentado yo mismo y que otros han mencionado aquí.
En ciertas plataformas, varias propiedades como las dimensiones de la ventana (
window.innerWidth
,window.innerHeight
) y lawindow.orientation
propiedad no se actualizarán cuando se active el evento"orientationchange"
. Muchas veces, la propiedadwindow.orientation
esundefined
por unos pocos milisegundos después del disparo de"orientationchange"
(al menos está en Chrome en iOS).La mejor manera que encontré para manejar este problema fue:
Estoy comprobando si la orientación no está definida o si la orientación es igual a la última orientación detectada. Si cualquiera de los dos es cierto, espero diez milisegundos y luego vuelvo a analizar la orientación. Si la orientación es un valor apropiado, llamo al
showXOrientation
funciones. Si la orientación no es válida, continúo haciendo un bucle en mi función de verificación, esperando diez milisegundos cada vez, hasta que sea válida.Ahora, haría un JSFiddle para esto, como solía hacerlo, pero JSFiddle no ha funcionado para mí y mi error de soporte se cerró ya que nadie más informa el mismo problema. Si alguien más quiere convertir esto en un JSFiddle, adelante.
¡Gracias! ¡Espero que esto ayude!
fuente
Aquí esta lo que hice:
fuente
Aunque la pregunta se refiere solo al uso de PhoneGap e iOS, y aunque ya fue respondida, puedo agregar algunos puntos a la pregunta más amplia de detectar la orientación de la pantalla con JS en 2019:
window.orientation
la propiedad está en desuso y no es compatible con los navegadores de Android . Hay una propiedad más nueva que proporciona más información sobre la orientación -screen.orientation
. Pero todavía es experimental y no es compatible con iOS Safari . Así que para conseguir el mejor resultado es probable que tenga que utilizar la combinación de los dos:const angle = screen.orientation ? screen.orientation.angle : window.orientation
.Como @benallansmith mencionó en su comentario , el
window.onorientationchange
evento se dispara anteswindow.onresize
, por lo que no obtendrá las dimensiones reales de la pantalla a menos que agregue algún retraso después del evento de cambio de orientación.Existe un complemento de orientación de pantalla de Cordova para admitir navegadores móviles más antiguos, pero creo que no hay necesidad de usarlo hoy en día.
También hubo un
screen.onorientationchange
evento, pero está en desuso y no debe usarse. Agregado solo para completar la respuesta.En mi caso de uso, no me importaba mucho la orientación real, sino más bien el ancho y la altura reales de la ventana, que obviamente cambia con la orientación. Así que usé el
resize
evento para evitar lidiar con retrasos entre elorientationchange
evento y la actualización de las dimensiones de la ventana:Nota 1: Utilicé la sintaxis de EcmaScript 6 aquí, asegúrese de compilarlo en ES5 si es necesario.
Nota 2: el
window.onresize
evento también se activa cuando se alterna el teclado virtual , no solo cuando cambia la orientación.fuente
Encontré este código para detectar si el dispositivo está en orientación horizontal y en este caso agrego una página de bienvenida que dice "cambiar orientación para ver el sitio". Funciona en teléfonos iOS, Android y Windows. Creo que esto es muy útil ya que es bastante elegante y evito establecer una vista horizontal para el sitio móvil. El código funciona muy bien. Lo único que no es completamente satisfactorio es que si alguien carga la página en vista horizontal, la página de bienvenida no aparece.
Y el HTML:
<div id="alert" class="hide"> <div id="content">This site is not thought to be viewed in landscape mode, please turn your device </div> </div>
fuente
fuente
Lo siguiente funcionó para mí:
Necesitaba el tiempo de espera porque el valor de
window.orientation
no se actualiza de inmediatofuente
Estoy creando una aplicación jQTouch en PhoneGap para iPhone. He estado luchando con este problema durante días. He visto la solución eventlistener sugerida varias veces, pero simplemente no pude hacer que funcione.
Al final se me ocurrió una solución diferente. Básicamente verifica el ancho del cuerpo periódicamente usando settimeout. Si el ancho es 320, entonces la orientación es vertical, si 480 es horizontal. Luego, si la orientación ha cambiado desde la última verificación, activará una función de material vertical o una función de material horizontal donde puede hacer lo suyo para cada orientación.
Código (nota, sé que hay una cierta repetición en el código, ¡simplemente no me he molestado en recortarlo todavía!):
fuente
onresize
evento que se disparará inmediatamente, no en 500 milisegundos 2) Este código es específico de Android, useonorientationchange
en su lugar para iPhone 3) Pruebe si es compatible con el navegador:"onorientationchange" in window