在Javascript中测试iPhone 3GS的设备定位事件的硬件支持

时间:2012-01-31 09:45:41

标签: javascript iphone html5 gyroscope device-orientation

我正在尝试在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能够处理这些事件时才进行此测试:(

所以我的问题是,是否可以添加测试以了解硬件是否可以触发定位事件?

谢谢!

4 个答案:

答案 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/]