我正在尝试在Javascript中使用HTML5 deviceOrientation事件来在用户围绕他旋转iPhone时旋转图像。
我使用此代码来检测陀螺仪何时移动:
window.addEventListener('deviceorientation', function (e) {
alpha = e.alpha;
beta = e.beta;
gamma = e.gamma;
}, true);
它在iPhone 4+和iPad 2上运行良好,但3GS(以及较旧的iPhone)上没有陀螺仪。这就是我正在测试deviceOrientationSupport的原因:
if(window.DeviceOrientationEvent){ // gyroscope support
alert('DeviceOrientationEvent support OK');
} else {
alert('DeviceOrientationEvent support KO');
}
我在很多网站或论坛上看过这个代码,但我的问题是在IOS 5.0.1下使用我的iPhone 3GS,这个测试表明我:deviceOrientationSupport OK!
我认为只有Safari能够处理这些事件时才进行此测试:(
所以我的问题是,是否可以添加测试以了解硬件是否可以触发定位事件?
谢谢!
答案 0 :(得分:4)
我希望这不会给你太晚,但是对于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上用于iPhone 3GS(无陀螺仪)和iPad 2(陀螺仪)以及Macbook Pro(陀螺仪)上的Chrome测试。似乎工作。
现在,如果您想在Orientation数据不可用时获取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浏览器的大多数设备的基础...我希望。没有在任何Android设备上测试它。
应该注意,每个事件都返回不同的数字,因此您可能需要做一些工作来规范化它们。但这是您访问它们的基础知识。
请告诉我这是否有帮助!
答案 1 :(得分:3)
在遇到与上述相同的问题后,我也遇到了旧版iPad / iPhone的问题,甚至没有在addEventListener上调用该函数。
所以我发现以下内容对我来说效果更好,并且消除了任何不受支持的设备通过的可能性(这是一个加载屏幕,所以它确实需要一个间隔才能完成其完整的测试。所以不适合所有人)
var _i = null;
var _e = null;
var _c = 0;
var updateDegree = function(e){
_e = e;
}
window.addEventListener('deviceorientation', updateDegree, false);
// Check event support
_i = window.setInterval(function(){
if(_e !== null && _e.alpha !== null){
// Clear interval
clearInterval(_i);
// > Run app
}else{
_c++;
if(_c === 10){
// Clear interval
clearInterval(_i);
// > Redirect
}
}
}, 200);
答案 2 :(得分:0)
虽然3GS上没有陀螺仪,但它完全能够使用内置的加速度计检测设备方向的变化。自第一部iPhone以来,iOS已经获得了这种支持。
答案 3 :(得分:0)
我遇到了类似的问题,我的桌面也接受了window.DeviceOrientationEvent事件。我使用以下代码检查移动设备中的方向支持:
var deviceSupportOrientation = false;
window.onload = function() {
if (window.DeviceOrientationEvent) {
window.addEventListener("deviceorientation", function() {
deviceSupportOrientation = true;
window.removeEventListener('deviceorientation');
}, false);
}
};
JSFiddle:http://jsfiddle.net/7L5mg8hj/1/]