L'actuel le comportement sur différents appareils est incohérent . Les événements de redimensionnement et de changement d'orientation peuvent être déclenchés dans un ordre différent et à une fréquence variable. En outre, certaines valeurs (par exemple, screen.width et window.orientation) ne changent pas toujours au moment prévu. Éviter screen.width -- il ne change pas lors de la rotation dans iOS.
L'approche fiable consiste à écouter les événements resize et orientationChange. (avec quelques interrogations par sécurité), et vous obtiendrez éventuellement une valeur valide pour l'orientation. Lors de mes tests, il est arrivé que les appareils Android ne déclenchent pas d'événements lors d'une rotation complète de 180 degrés, c'est pourquoi j'ai é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 y a beaucoup de variété entre les appareils. NOTE : Les événements sont listés dans l'ordre dans lequel ils ont été déclenchés.
|==============================================================================|
| Device | Events Fired | orientation | innerWidth | screen.width |
|==============================================================================|
| iPad 2 | resize | 0 | 1024 | 768 |
| (to landscape) | orientationchange | 90 | 1024 | 768 |
|----------------+-------------------+-------------+------------+--------------|
| iPad 2 | resize | 90 | 768 | 768 |
| (to portrait) | orientationchange | 0 | 768 | 768 |
|----------------+-------------------+-------------+------------+--------------|
| iPhone 4 | resize | 0 | 480 | 320 |
| (to landscape) | orientationchange | 90 | 480 | 320 |
|----------------+-------------------+-------------+------------+--------------|
| iPhone 4 | resize | 90 | 320 | 320 |
| (to portrait) | orientationchange | 0 | 320 | 320 |
|----------------+-------------------+-------------+------------+--------------|
| Droid phone | orientationchange | 90 | 320 | 320 |
| (to landscape) | resize | 90 | 569 | 569 |
|----------------+-------------------+-------------+------------+--------------|
| Droid phone | orientationchange | 0 | 569 | 569 |
| (to portrait) | resize | 0 | 320 | 320 |
|----------------+-------------------+-------------+------------+--------------|
| Samsung Galaxy | orientationchange | 0 | 400 | 400 |
| Tablet | orientationchange | 90 | 400 | 400 |
| (to landscape) | orientationchange | 90 | 400 | 400 |
| | resize | 90 | 683 | 683 |
| | orientationchange | 90 | 683 | 683 |
|----------------+-------------------+-------------+------------+--------------|
| Samsung Galaxy | orientationchange | 90 | 683 | 683 |
| Tablet | orientationchange | 0 | 683 | 683 |
| (to portrait) | orientationchange | 0 | 683 | 683 |
| | resize | 0 | 400 | 400 |
| | orientationchange | 0 | 400 | 400 |
|----------------+-------------------+-------------+------------+--------------|