Encontrei este código de teste de orientação abaixo procurando material de referência do JQTouch. Isso funciona corretamente no simulador iOS no Safari móvel, mas não é tratado corretamente no Phonegap. Meu projeto está executando o mesmo problema que está matando esta página de teste. Existe uma maneira de detectar a mudança de orientação usando JavaScript no 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;
}
}
Respostas:
Isto é o que eu faço:
Atualização de maio de 2019:
window.orientation
é um recurso descontinuado e não é suportado pela maioria dos navegadores, de acordo com o MDN . Oorientationchange
evento está associado ao window.orientation e, portanto, provavelmente não deve ser usado.fonte
window.onorientationchange = function() { setTimeout(functionName, 0); };
Eu uso o
window.onresize = function(){ checkOrientation(); }
E no checkOrientation, você pode empregar a verificação window.orientation ou a largura do corpo, mas a ideia é que "window.onresize" seja o método mais compatível com vários navegadores, pelo menos na maioria dos navegadores móveis e de mesa que eu já tive. oportunidade de testar.fonte
fonte
resize
evento. No entanto, IIRC, essas consultas não funcionarão corretamente com o teclado para cima.Sou muito novo no iOS e no Phonegap também, mas consegui fazer isso adicionando um eventListener. Fiz a mesma coisa (usando o exemplo que você menciona) e não consegui fazê-lo funcionar. Mas isso parecia fazer o truque:
Você pode ter alguma sorte pesquisando no Grupo PhoneGap do Google o termo "orientação" .
Um exemplo que li sobre como detectar orientação foi Pie Guy: ( jogo , arquivo js ). É semelhante ao código que você postou, mas como você ... Eu não consegui fazê-lo funcionar.
Uma ressalva: o eventListener funcionou para mim, mas não tenho certeza se essa é uma abordagem excessivamente intensiva. Até agora, essa foi a única maneira que funcionou para mim, mas não sei se existem maneiras melhores e mais simplificadas.
UPDATE corrigiu o código acima, ele funciona agora
fonte
Enquanto trabalhava com o
orientationchange
evento, precisava de um tempo limite para obter as dimensões corretas dos elementos na página, mas o matchMedia funcionou bem. Meu código final:fonte
Acredito que a resposta correta já foi postada e aceita, mas há um problema que eu já experimentei e que alguns outros mencionaram aqui.
Em certas plataformas, várias propriedades, como as dimensões da janela (
window.innerWidth
,window.innerHeight
) e awindow.orientation
propriedade, não serão atualizadas quando o evento"orientationchange"
for disparado. Muitas vezes, a propriedadewindow.orientation
ficaundefined
por alguns milissegundos após o disparo"orientationchange"
(pelo menos no Chrome no iOS).A melhor maneira que encontrei para lidar com esse problema foi:
Estou verificando se a orientação é indefinida ou se a orientação é igual à última orientação detectada. Se qualquer um for verdadeiro, espero dez milissegundos e analiso a orientação novamente. Se a orientação for um valor adequado, chamo as
showXOrientation
funções. Se a orientação for inválida, continuo repetindo minha função de verificação, aguardando dez milissegundos por vez, até que seja válida.Agora, eu faria um JSFiddle para isso, como costumava fazer, mas o JSFiddle não está funcionando para mim e meu bug de suporte foi fechado, pois ninguém mais está relatando o mesmo problema. Se alguém quiser transformar isso em um JSFiddle, vá em frente.
Obrigado! Eu espero que isso ajude!
fonte
aqui está o que eu fiz:
fonte
Embora a pergunta se refira apenas ao uso do PhoneGap e iOS, e embora já tenha sido respondida, posso acrescentar alguns pontos à questão mais ampla de detectar a orientação da tela com JS em 2019:
window.orientation
propriedade é obsoleto e não suportado por navegadores Android .Não é um hotel novo que fornece mais informações sobre a orientação -screen.orientation
. Mas ainda é experimental e não é suportado pelo iOS Safari . Assim, para obter o melhor resultado, você provavelmente precisará usar a combinação dos dois:const angle = screen.orientation ? screen.orientation.angle : window.orientation
.Como @benallansmith mencionou em seu comentário , o
window.onorientationchange
evento é disparado anteswindow.onresize
, portanto, você não obterá as dimensões reais da tela, a menos que adicione algum atraso após o evento de mudança de orientação.Existe um plug-in de orientação de tela Cordova para oferecer suporte a navegadores móveis mais antigos, mas acredito que não há necessidade de usá-lo atualmente.
Houve também um
screen.onorientationchange
evento, mas está obsoleto e não deve ser usado. Adicionado apenas para completar a resposta.No meu caso de uso, não me importei muito com a orientação real, mas com a largura e altura reais da janela, o que obviamente muda com a orientação. Então, usei
resize
event para evitar lidar com atrasos entre asorientationchange
dimensões do evento e a atualização da janela:Nota 1: Usei a sintaxe do EcmaScript 6 aqui, certifique-se de compilá-la no ES5, se necessário.
Nota 2: o
window.onresize
evento também é acionado quando o teclado virtual é alternado , não apenas quando a orientação é alterada.fonte
Encontrei este código para detectar se o dispositivo está na orientação paisagem e, neste caso, adicione uma página inicial dizendo "alterar orientação para ver o site". Está funcionando nos telefones iOS, Android e Windows. Eu acho que isso é muito útil, pois é bastante elegante e evita definir uma paisagem para o site para celular. O código está funcionando muito bem. A única coisa que não é totalmente satisfatória é que, se alguém carregar a página em modo paisagem, a página inicial não aparecerá.
E o 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>
fonte
fonte
O seguinte funcionou para mim:
Eu precisava do tempo limite porque o valor de
window.orientation
não é atualizado imediatamentefonte
Estou criando um aplicativo jQTouch no PhoneGap para o iPhone. Estou lutando com esse problema há dias. Vi a solução eventlistener sugerida algumas vezes, mas não consegui fazê-la funcionar.
No final, eu vim com uma solução diferente. Basicamente, verifica a largura do corpo periodicamente usando settimeout. Se a largura for 320, a orientação é retrato; se 480, é paisagem. Então, se a orientação tiver sido alterada desde a última verificação, ela disparará uma função de material de retrato ou de paisagem, onde você poderá fazer o que quiser para cada orientação.
Código (note, eu sei que há alguma repetição no código, mas não se preocupe em reduzi-lo ainda!):
fonte
onresize
evento que será acionado imediatamente, não em 500 milissegundos 2) Este código é específico para o Android, useonorientationchange
para o iPhone 3) Teste se é suportado no navegador:"onorientationchange" in window