使用 JavaScript 在浏览器中检测 Android 手机的旋转

IT技术 javascript android webkit
2021-02-07 19:05:25

我知道在 iPhone 上的 Safari 中,您可以通过监听onorientationchange事件和查询window.orientation角度来检测屏幕的方向和方向的变化

这可以在 Android 手机的浏览器中实现吗?

明确地说,我问的是 Android 设备的旋转是否可以通过运行在标准网页上的JavaScript检测到在 iPhone 上是可能的,我想知道它是否可以在 Android 手机上完成。

6个回答

不同设备的实际行为是不一致的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 |
|----------------+-------------------+------------ -+------------+--------------|
@mklement0 时至今日,window.orientation 在 Windows Phone 8.1 上始终是未定义的。
2021-03-20 19:05:25
很好的答案。previousOrientation应该使用当时的方向进行初始化:var previousOrientation = window.orientation;如果您想忽略 180 度旋转,即您不需要区分左右横向和颠倒或不倒置变体,请添加以下内容作为第一行checkOrientation()if (0 === (previousOrientation + window.orientation) % 180) return;但是,如果没有额外的setTimeout诡计,你只会从这个iOS上,其中一个迅速180度旋转只创建一个有利于单一 orientationchange事件。
2021-03-28 19:05:25
谢谢@mklement,我调整了代码来初始化previousOrientation。
2021-03-28 19:05:25
在 iOS5 模拟器中,如果您横向刷新然后旋转,则不会触发此代码。
2021-03-29 19:05:25
为伟大的信息干杯。这是我的头脑,因为当您使用cordova 时,Windows Phone 8.1 没有调整大小或方向改变事件。诉诸于使用 setInterval 以及故障安全。
2021-04-02 19:05:25

要检测 Android 浏览器上的方向更改,请将侦听器附加到onorientationchangeresize事件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.widthscreen.height随着设备旋转而更新。(iPhone 不是这种情况)。

无需为 iOS 使用两位傻瓜的 hack。只需在 Android 上使用 screen.width 和 screen.height,在 iOS 上使用 window.innerWidth 和 window.innerHeight。
2021-03-11 19:05:25
在 Droid 上,这完全是疯了。当手机在横向模式下旋转时,它会提醒 screen.width 为 320,当手机在纵向模式下旋转时,它会检测到 screen.width 569!怎么来的??
2021-03-13 19:05:25
它运作良好。Ayyash - 这里的重点是,当不支持“orientationchange”时,它将回退到“resize”
2021-03-19 19:05:25
澄清一下:那些正在寻找也适用于 iOS的解决方案的人应该看看两位傻瓜或我的答案。
2021-03-19 19:05:25
这真的有效吗?我试过 jquery $(window).bind("orientationchange",fn); 但它没有用,我必须使用上面的表格吗?我在窗口中尝试了“onorientationchange”,它返回 false
2021-03-24 19:05:25

two-bit-fool 的优秀答案提供了所有背景知识,但让我尝试对如何处理 iOS 和 Android 上的方向更改进行简明、务实的总结

  • 如果您只关心窗口尺寸(典型情况) - 而不是特定方向:
    • resize处理事件。
    • 在您的处理程序中,执行window.innerWidthwindow.InnerHeight仅执行操作。
    • 不要使用window.orientation- 它不会在 iOS 上更新。
  • 如果您确实关心特定方向
    • 处理resizeAndroid 上事件,orientationchange处理 iOS 上事件。
    • 在您的处理程序中,对window.orientation(andwindow.innerWidthwindow.InnerHeight)采取行动

与记住以前的方向和比较相比,这些方法提供了一些好处:

  • 仅维度方法也适用于在可以模拟移动设备的桌面浏览器上进行开发,例如 Chrome 23。(window.orientation在桌面浏览器上不可用)。
  • 不需要全局/匿名文件级函数包装级变量。
这很有用!这让我意识到我不在乎方向,这让事情变得容易多了。
2021-03-16 19:05:25
@albanx 在 ios 上的 chrome 中仍然存在问题:/ safari 很好
2021-03-19 19:05:25
问题是当调整大小或方向事件触发 window.innerWidth 报告错误和 Droid 设备
2021-03-30 19:05:25

您可以随时收听窗口调整大小事件。如果在那个事件中,窗口从高比宽变成比高宽(反之亦然),您可以确定手机方向刚刚改变。

我仍然很难想象当渲染它的设备旋转 270 度时,网页可以做什么不同的有用,但如果你说你有一个有效的用例,我不会狡辩。在这种情况下:抱歉,我不知道 Android 浏览器是否提供了这种详细程度。
2021-03-11 19:05:25
我不确定这有什么关系……你为什么需要知道手机是否颠倒?手机的浏览器有一个顶部,网页会定向到浏览器的顶部。任何有两个脑细胞相互摩擦的用户如果想要正面朝上看网页,只要将手机翻转过来就可以了
2021-03-15 19:05:25
这是个好主意,我会试试(并让我的 Android 手机朋友来测试!)
2021-03-18 19:05:25
这有点苛刻。我很想知道这样我就可以根据屏幕的方向显示不同的内容,这最多可以有 4 个不同的页面,需要浏览器知道它是否已经旋转了 0、90、180 和 270 度。这在 JavaScript 中,在 iPhone 上都是可能的,这就是我问的原因。
2021-03-21 19:05:25
我刚刚意识到这种方法没有给我手机的方向。我会知道它是纵向还是横向,但不知道它是倒置还是向左或向右转。任何进一步的想法?
2021-03-22 19:05:25

在 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);

它还支持桌面浏览器,但它总是返回相同的值。

这个事件实际上更多的是用于访问运动传感器,尽管我认为它也可以用于检测方向变化。
2021-03-22 19:05:25
在我的 Android Galaxy S2 上,它不受股票浏览器和海豚浏览器的支持。但适用于移动 Firefox。
2021-03-31 19:05:25