我希望这不会为时已晚,但 iOS 4.2+ 的 Safari 将在 iPhone 3GS(或其他没有陀螺仪的设备)上注册 DeviceOrientationEvent 是否令人沮丧?
底线,DeviceOrientation 不适用于 iPhone 3GS。但是正如有人提到的,DeviceMotionEvent 有效,但是您必须以与使用带有陀螺仪的设备不同的方式访问事件数据(我知道很傻!)。
第一步:我在混合中添加了一个变量来捕获 OrientationEvent 是否实际上是使用任何非空数据触发的(就像有陀螺仪一样)。
var canHandleOrientation;
if (window.DeviceOrientationEvent) {
window.addEventListener("deviceorientation", handleOrientation, false);
}
function handleOrientation(event){
console.log("Orientation:" + event.alpha + ", " + event.beta + ", " + event.gamma);
canHandleOrientation = event; // will be either null or with event data
}
现在您知道该事件是否真的有陀螺仪数据!因此,如果您想默认为其他内容(即 window.DeviceMotionEvent),您可以使用条件。
if (!canHandleOrientation) {
console.log("There is no gyroscope")
}
我在 iPhone 3GS(无陀螺仪)和 iPad 2(陀螺仪)的 Mobile Safari 和我的 Macbook Pro(陀螺仪)上的 Chrome 上对此进行了测试。似乎工作。
现在,如果您想在方向数据不可用的情况下获取 DeviceMotionEvent 数据作为替代方案,那么...
if (window.DeviceMotionEvent && !canHandleOrientation) {
window.addEventListener('devicemotion', handleMotion, false);
}
function handleMotion(event){
if(event.acceleration){
//requires a gyroscope to work.
console.log("Motion Acceleration: " + event.acceleration.x + ", " + event.acceleration.y + ", " + event.acceleration.z);
}
else{
//this is for iPhone 3GS or a device with no gyroscope, and includes gravity.
console.log("Motion AccelerationGravity: " + event.accelerationIncludingGravity.x + ", " + event.accelerationIncludingGravity.y + ", " + event.accelerationIncludingGravity.z);
}
}
这应该涵盖了大多数带有 webkit 浏览器的设备的基础......我希望。Havent 在任何 Android 设备上对其进行了测试。
应该注意,每个事件返回不同的数字,因此您可能需要做一些工作来规范它们。但这是您如何访问它们的基础知识。
让我知道这是否有帮助!