Answers:
要检测Android浏览器上的方向变化,请将侦听器附加到上的orientationchange
或resize
事件window
:
// Detect whether device supports orientationchange event, otherwise fall back to
// the resize event.
var supportsOrientationChange = "onorientationchange" in window,
orientationEvent = supportsOrientationChange ? "orientationchange" : "resize";
window.addEventListener(orientationEvent, function() {
alert('HOLY ROTATING SCREENS BATMAN:' + window.orientation + " " + screen.width);
}, false);
检查window.orientation
属性以找出设备的定向方向。使用Android手机,screen.width
或者screen.height
随着设备旋转而更新。(iPhone并非如此)。
跨不同设备的实际行为是不一致的。resize和directionChange事件可以以不同的顺序以不同的频率触发。另外,某些值(例如screen.width和window.orientation)并非总是在您期望的时候改变。避免使用screen.width-在iOS中旋转时不会更改。
可靠的方法是同时监听resize和directionChange事件(将一些轮询作为安全陷阱),最终您将获得一个有效的Direction值。在我的测试中,将Android设备旋转整整180度时,有时不会触发事件,因此,我还添加了setInterval来轮询方向。
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);
这是我测试过的四种设备的结果(对ASCII表很抱歉,但这似乎是显示结果的最简单方法)。除了iOS设备之间的一致性外,跨设备还有很多不同之处。注意:事件按触发的顺序列出。
| ================================================= =========================== | | 设备| 事件已触发| 方向| innerWidth | screen.width | | ================================================= =========================== | | iPad 2 | 调整大小 0 | 1024 | 768 | | (至景观)| 方向变化| 90 | 1024 | 768 | | ---------------- + ------------------- + ------------ -+ ------------ + -------------- | | iPad 2 | 调整大小 90 | 768 | 768 | | (至肖像)| 方向变化| 0 | 768 | 768 | | ---------------- + ------------------- + ------------ -+ ------------ + -------------- | | iPhone 4 | 调整大小 0 | 480 | 320 | | (至景观)| 方向变化| 90 | 480 | 320 | | ---------------- + ------------------- + ------------ -+ ------------ + -------------- | | iPhone 4 | 调整大小 90 | 320 | 320 | | (至肖像)| 方向变化| 0 | 320 | 320 | | ---------------- + ------------------- + ------------ -+ ------------ + -------------- | | Droid手机| 方向变化| 90 | 320 | 320 | | (至景观)| 调整大小 90 | 569 | 569 | | ---------------- + ------------------- + ------------ -+ ------------ + -------------- | | Droid手机| 方向变化| 0 | 569 | 569 | | (至肖像)| 调整大小 0 | 320 | 320 | | ---------------- + ------------------- + ------------ -+ ------------ + -------------- | | 三星Galaxy | 方向变化| 0 | 400 | 400 | | 平板电脑| 方向变化| 90 | 400 | 400 | | (至景观)| 方向变化| 90 | 400 | 400 | | | 调整大小 90 | 683 | 683 | | | 方向变化| 90 | 683 | 683 | | ---------------- + ------------------- + ------------ -+ ------------ + -------------- | | 三星Galaxy | 方向变化| 90 | 683 | 683 | | 平板电脑| 方向变化| 0 | 683 | 683 | | (至肖像)| 方向变化| 0 | 683 | 683 | | | 调整大小 0 | 400 | 400 | | | 方向变化| 0 | 400 | 400 | | ---------------- + ------------------- + ------------ -+ ------------ + -------------- |
previousOrientation
应该使用当时的方向进行初始化:var previousOrientation = window.orientation;
如果要忽略180度旋转,即不需要区分左右横向和上下颠倒或不同的变体,请添加以下内容作为第一行checkOrientation()
:if (0 === (previousOrientation + window.orientation) % 180) return;
但是,如果没有额外的setTimeout
诡计,你只会从这个iOS上,其中一个迅速180度旋转只创建一个有利于单一 orientationchange
事件。
两位傻瓜的绝妙答案提供了所有背景知识,但让我尝试一下有关如何处理iOS和Android方向变化的简要,实用的摘要:
resize
仅处理事件。window.innerWidth
和window.InnerHeight
唯一。window.orientation
-它在iOS上不是最新的。 resize
Android上的事件,仅在orientationchange
iOS上的事件。window.orientation
(和window.innerWidth
和window.InnerHeight
)进行操作与记住先前的方向并进行比较相比,这些方法提供了一些好处:
window.orientation
在桌面浏览器上不可用)。您始终可以收听窗口调整大小事件。如果在这种情况下,窗口从大于宽的窗口变为大于宽的窗口(反之亦然),则可以确定电话方向刚刚改变。
在HTML5中是可能的。
您可以在这里阅读更多内容(并尝试现场演示):http : //slides.html5rocks.com/#slide-orientation。
window.addEventListener('deviceorientation', function(event) {
var a = event.alpha;
var b = event.beta;
var g = event.gamma;
}, false);
它还支持桌面浏览器,但始终返回相同的值。
我有同样的问题。我正在为Adroid设备使用Phonegap和Jquery mobile。要正确调整大小,我必须设置一个超时时间:
$(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);
}
解决方法如下:
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");
}
});
}
您可以尝试与所有浏览器兼容的解决方案。
以下是orientationchange
兼容性图片:
因此,我编写了一个orientaionchange
polyfill,它是基于@media属性来修复directionchange实用程序库的—directionchange -fix
window.addEventListener('orientationchange', function(){
if(window.neworientation.current === 'portrait|landscape'){
// do something……
} else {
// do something……
}
}, false);
对两位傻瓜的回答有一点贡献:
如droid手机上表中所述,“ orientationchange”事件比“ resize”事件更早触发,从而阻止了下一个resize调用(由于if语句)。宽度属性仍未设置。
一种解决方法虽然可能不是一个完美的解决方法,但可能是不触发“ orientationchange”事件。可以通过将“ orientationchange”事件绑定包装在“ if”语句中来存档:
if (!navigator.userAgent.match(/android/i))
{
window.addEventListener("orientationchange", checkOrientation, false);
}
希望能帮助到你
(测试是在Nexus S上完成的)