Je sais que dans Safari sur un iPhone, vous pouvez détecter l'orientation de l'écran et le changement d'orientation en écoutant l' onorientationchange
événement et en window.orientation
recherchant l'angle.
Est-ce possible dans le navigateur sur les téléphones Android?
Pour être clair, je demande si la rotation d'un appareil Android peut être détectée par JavaScript s'exécutant sur une page Web standard. C'est possible sur un iPhone, et je me suis demandé si cela pouvait être fait pour les téléphones Android.
la source
Le comportement réel sur les différents appareils est incohérent . Les événements resize et orientationChange peuvent se déclencher dans une séquence différente avec une fréquence variable. De plus, certaines valeurs (par exemple screen.width et window.orientation) ne changent pas toujours lorsque vous vous y attendez. Évitez screen.width - cela ne change pas lors de la rotation dans iOS.
L'approche fiable consiste à écouter à la fois les événements de redimensionnement et d'orientationChange (avec une interrogation comme prise de sécurité), et vous obtiendrez finalement une valeur valide pour l'orientation. Lors de mes tests, les appareils Android ne parviennent parfois pas à déclencher des événements lors d'une rotation complète de 180 degrés.J'ai donc également inclus un setInterval pour interroger l'orientation.
var previousOrientation = window.orientation; var checkOrientation = function(){ if(window.orientation !== previousOrientation){ previousOrientation = window.orientation; // orientation changed, do your magic here } }; window.addEventListener("resize", checkOrientation, false); window.addEventListener("orientationchange", checkOrientation, false); // (optional) Android doesn't always fire orientationChange on 180 degree turns setInterval(checkOrientation, 2000);
Voici les résultats des quatre appareils que j'ai testés (désolé pour le tableau ASCII, mais cela semblait être le moyen le plus simple de présenter les résultats). Mis à part la cohérence entre les appareils iOS, il existe une grande variété entre les appareils. REMARQUE: les événements sont répertoriés dans l'ordre de leur déclenchement.
la source
previousOrientation
doit être initialisé avec l'orientation alors actuelle:var previousOrientation = window.orientation;
Si vous voulez ignorer les rotations à 180 degrés, c'est-à-dire que vous n'avez pas besoin de faire la distinction entre le paysage gauche ou droit et les variantes inversées ou non, ajoutez comme première ligne pourcheckOrientation()
:if (0 === (previousOrientation + window.orientation) % 180) return;
Cependant, sanssetTimeout
astuce supplémentaire , vous n'en bénéficierez que sur iOS, où une rotation rapide à 180 degrés ne crée qu'un seulorientationchange
événement.L'excellente réponse de two-bit-fool fournit tout le contexte, mais laissez-moi tenter un résumé concis et pragmatique de la façon de gérer les changements d'orientation sur iOS et Android :
resize
événement uniquement.window.innerWidth
etwindow.InnerHeight
seulement.window.orientation
- il ne sera pas à jour sur iOS.resize
événement sur Android et uniquement l'orientationchange
événement sur iOS.window.orientation
(etwindow.innerWidth
etwindow.InnerHeight
)Ces approches offrent de légers avantages par rapport à se souvenir de l'orientation précédente et à comparer:
window.orientation
n'est pas disponible sur les navigateurs de bureau).la source
Vous pouvez toujours écouter l'événement de redimensionnement de la fenêtre. Si, lors de cet événement, la fenêtre est passée de plus haute que large à plus large que haute (ou vice versa), vous pouvez être à peu près sûr que l'orientation du téléphone vient d'être modifiée.
la source
C'est possible en HTML5.
Vous pouvez en savoir plus (et essayer une démo en direct) ici: http://slides.html5rocks.com/#slide-orientation .
window.addEventListener('deviceorientation', function(event) { var a = event.alpha; var b = event.beta; var g = event.gamma; }, false);
Il prend également en charge les navigateurs de bureau, mais il renvoie toujours la même valeur.
la source
J'ai eu le même problème. J'utilise Phonegap et Jquery mobile, pour les appareils Adroid. Pour redimensionner correctement, j'ai dû définir un délai d'attente:
$(window).bind('orientationchange',function(e) { fixOrientation(); }); $(window).bind('resize',function(e) { fixOrientation(); }); function fixOrientation() { setTimeout(function() { var windowWidth = window.innerWidth; $('div[data-role="page"]').width(windowWidth); $('div[data-role="header"]').width(windowWidth); $('div[data-role="content"]').width(windowWidth-30); $('div[data-role="footer"]').width(windowWidth); },500); }
la source
Voici la solution:
var isMobile = { Android: function() { return /Android/i.test(navigator.userAgent); }, iOS: function() { return /iPhone|iPad|iPod/i.test(navigator.userAgent); } }; if(isMobile.Android()) { var previousWidth=$(window).width(); $(window).on({ resize: function(e) { var YourFunction=(function(){ var screenWidth=$(window).width(); if(previousWidth!=screenWidth) { previousWidth=screenWidth; alert("oreientation changed"); } })(); } }); } else//mainly for ios { $(window).on({ orientationchange: function(e) { alert("orientation changed"); } }); }
la source
Un autre problème - certaines tablettes Android (le Motorola Xoom je crois et un Elonex bas de gamme sur lequel je fais des tests, probablement d'autres aussi) ont leurs accéléromètres configurés de sorte que window.orientation == 0 en mode LANDSCAPE, pas en mode portrait !
la source
vous pouvez essayer la solution, compatible avec tous les navigateurs.
Voici la
orientationchange
photo de compatibilité: par conséquent, jeorientaionchange
crée un polyfill, c'est un attribut basé sur @media pour corriger la bibliothèque de l'utilitaire orientationchange—— orientationchange-fixwindow.addEventListener('orientationchange', function(){ if(window.neworientation.current === 'portrait|landscape'){ // do something…… } else { // do something…… } }, false);
la source
Il convient de noter que sur mon Epic 4G Touch, j'ai dû configurer la vue Web pour utiliser WebChromeClient avant que les appels javascript Android ne fonctionnent.
webView.setWebChromeClient(new WebChromeClient());
la source
Traverser le navigateur
$(window).on('resize orientationchange webkitfullscreenchange mozfullscreenchange fullscreenchange', function(){ //code here });
la source
Une petite contribution à la réponse du fou à deux bits:
Comme décrit sur le tableau sur les téléphones droïdes, l'événement "orientationchange" est déclenché plus tôt que l'événement "resize" bloquant ainsi le prochain appel de redimensionnement (à cause de l'instruction if). La propriété Width n'est toujours pas définie.
Une solution de contournement mais peut-être pas parfaite pourrait être de ne pas déclencher l'événement "orientationchange". Cela peut être archivé en encapsulant la liaison d'événement "orientationchange" dans l'instruction "if":
if (!navigator.userAgent.match(/android/i)) { window.addEventListener("orientationchange", checkOrientation, false); }
J'espère que cela aide
(les tests ont été effectués sur Nexus S)
la source