我知道在 iPhone 上的 Safari 中,您可以通过监听onorientationchange
事件和查询window.orientation
角度来检测屏幕的方向和方向的变化。
这可以在 Android 手机的浏览器中实现吗?
明确地说,我问的是 Android 设备的旋转是否可以通过运行在标准网页上的JavaScript检测到。在 iPhone 上是可能的,我想知道它是否可以在 Android 手机上完成。
我知道在 iPhone 上的 Safari 中,您可以通过监听onorientationchange
事件和查询window.orientation
角度来检测屏幕的方向和方向的变化。
这可以在 Android 手机的浏览器中实现吗?
明确地说,我问的是 Android 设备的旋转是否可以通过运行在标准网页上的JavaScript检测到。在 iPhone 上是可能的,我想知道它是否可以在 Android 手机上完成。
不同设备的实际行为是不一致的。resize 和orientationChange 事件可以以不同的顺序以不同的频率触发。此外,某些值(例如 screen.width 和 window.orientation)并不总是在您期望的时候发生变化。避免使用 screen.width -- 在 iOS 中旋转时它不会改变。
可靠的方法是同时监听 resize 和orientationChange 事件(使用一些轮询作为安全措施),您最终会得到一个有效的方向值。在我的测试中,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 设备之间的一致性之外,设备之间还有很多变化。注意:事件按它们触发的顺序列出。
|================================================== ================================| | 设备 | 被解雇的事件| 方向 | 内宽度 | 屏幕宽度| |================================================== ================================| | 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 | |----------------+-------------------+------------ -+------------+--------------| | 机器人手机| 方向改变 | 90 | 320 | 320 | | (到风景) | 调整大小 | 90 | 第569话 第569话 |----------------+-------------------+------------ -+------------+--------------| | 机器人手机| 方向改变 | 0 | 第569话 第569话 | (肖像) | 调整大小 | 0 | 320 | 320 | |----------------+-------------------+------------ -+------------+--------------| | 三星银河 | 方向改变 | 0 | 400 | 400 | | 平板电脑 | 方向改变 | 90 | 400 | 400 | | (到风景) | 方向改变 | 90 | 400 | 400 | | | 调整大小 | 90 | 第683话 第683话 | | 方向改变 | 90 | 第683话 第683话 |----------------+-------------------+------------ -+------------+--------------| | 三星银河 | 方向改变 | 90 | 第683话 第683话 | 平板电脑 | 方向改变 | 0 | 第683话 第683话 | (肖像) | 方向改变 | 0 | 第683话 第683话 | | 调整大小 | 0 | 400 | 400 | | | 方向改变 | 0 | 400 | 400 | |----------------+-------------------+------------ -+------------+--------------|
要检测 Android 浏览器上的方向更改,请将侦听器附加到on的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 不是这种情况)。
two-bit-fool 的优秀答案提供了所有背景知识,但让我尝试对如何处理 iOS 和 Android 上的方向更改进行简明、务实的总结:
resize
只处理事件。window.innerWidth
且window.InnerHeight
仅执行操作。window.orientation
- 它不会在 iOS 上更新。 resize
Android 上的事件,仅orientationchange
处理 iOS 上的事件。window.orientation
(andwindow.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);
它还支持桌面浏览器,但它总是返回相同的值。