网上找了很多这方面的代码,
测试结果:很多都只支持安卓浏览器,对苹果浏览器都不起作用
蘋果瀏覽器是指Safari?
也不一定,我翻遍了网上js摇一摇的脚本,基本上安卓都有效果,唯独苹果系统没有效果,苹果手机上不管什么浏览器都不行,不仅仅是Safari,似乎是苹果系统关闭了跟摇一摇相关的接口啥的
@大da脸:
你用的是哪個H5 接口,我查查,很有可能是Apple手機上的實作方式不同
@RosonJ: 稍等
这是写的一个简单页面:安卓测试有效,苹果手机浏览器全部无效,所用到的js我下面再贴一个<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <meta name="viewport" content="initial-scale=1.0, width=device-width, user-scalable=no" /> <meta name="apple-mobile-web-app-capable" content="yes" /> </head> <body> <p>摇一摇!</p> <script src="/Scripts/Shake.js"></script> <script> //创建实例 var myShakeEvent = new Shake({ threshold: 10, // 摇动阈值 timeout: 500 // 事件发生频率,是可选值 }); // 监听设备动作 myShakeEvent.start(); //添加一个监听事件 window.addEventListener('shake', shakeEventDidOccur, false); //摇动回调函数 function shakeEventDidOccur() { alert('摇了一次'); } </script> </body> </html>
Shake.js:
(function(global, factory) { if (typeof define === 'function' && define.amd) { define(function() { return factory(global, global.document); }); } else if (typeof module !== 'undefined' && module.exports) { module.exports = factory(global, global.document); } else { global.Shake = factory(global, global.document); } } (typeof window !== 'undefined' ? window: this, function(window, document) { 'use strict'; function Shake(options) { //feature detect this.hasDeviceMotion = 'ondevicemotion' in window; this.options = { threshold: 15, //默认摇动阈值 timeout: 1000 //默认两次事件间隔时间 }; if (typeof options === 'object') { for (var i in options) { if (options.hasOwnProperty(i)) { this.options[i] = options[i]; } } } //使用date防止重复调用 this.lastTime = new Date(); //accelerometer values this.lastX = null; this.lastY = null; this.lastZ = null; //创建自定义事件 if (typeof document.CustomEvent === 'function') { this.event = new document.CustomEvent('shake', { bubbles: true, cancelable: true }); } else if (typeof document.createEvent === 'function') { this.event = document.createEvent('Event'); this.event.initEvent('shake', true, true); } else { return false; } } //重置时间计时器 Shake.prototype.reset = function() { this.lastTime = new Date(); this.lastX = null; this.lastY = null; this.lastZ = null; }; //开始监听 devicemotion Shake.prototype.start = function() { this.reset(); if (this.hasDeviceMotion) { window.addEventListener('devicemotion', this, false); } }; //停止监听 devicemotion Shake.prototype.stop = function() { if (this.hasDeviceMotion) { window.removeEventListener('devicemotion', this, false); } this.reset(); }; //计算是否触发摇动 Shake.prototype.devicemotion = function(e) { var current = e.accelerationIncludingGravity; var currentTime; var timeDifference; var deltaX = 0; var deltaY = 0; var deltaZ = 0; if ((this.lastX === null) && (this.lastY === null) && (this.lastZ === null)) { this.lastX = current.x; this.lastY = current.y; this.lastZ = current.z; return; } deltaX = Math.abs(this.lastX - current.x); deltaY = Math.abs(this.lastY - current.y); deltaZ = Math.abs(this.lastZ - current.z); if (((deltaX > this.options.threshold) && (deltaY > this.options.threshold)) || ((deltaX > this.options.threshold) && (deltaZ > this.options.threshold)) || ((deltaY > this.options.threshold) && (deltaZ > this.options.threshold))) { //计算上次触发摇动到现在的间隔时间 currentTime = new Date(); timeDifference = currentTime.getTime() - this.lastTime.getTime(); if (timeDifference > this.options.timeout) { window.dispatchEvent(this.event); this.lastTime = new Date(); } } this.lastX = current.x; this.lastY = current.y; this.lastZ = current.z; }; //事件处理 Shake.prototype.handleEvent = function(e) { if (typeof(this[e.type]) === 'function') { return this[e.type](e); } }; return Shake; }));
@RosonJ: 这是第二个js方法:
<script> var jsonObject=null; // 当页面加载完以后会执行window.onload window.onload = function() { var times = -1; // 记录摇动次数 var last_time = 0; var borderSpeed = 800; // 加速度变化临界值 var x = y = z = last_x = last_y = last_z = 0; if (window.DeviceMotionEvent) { window.addEventListener('devicemotion',shake,false); } else { alert('您的设备不支持摇一摇哦'); } // 每次手机移动的时候都会执行下面shake函数的代码 function shake(eventData) { var acceleration = eventData.accelerationIncludingGravity; var curTime = new Date().getTime(); var diffTime = curTime-last_time; // 每隔100ms进行判断 if (diffTime>100) { x = acceleration.x; y = acceleration.y; z = acceleration.z; var speed = Math.abs(x + y + z - last_x - last_y - last_z) / diffTime * 10000; // 判断手机确实发生了摇动而不是正常的移动 if (speed>borderSpeed) { times++; document.getElementById("text").innerHTML=times+" times"; // 用户的微信昵称和头像连接发送一次即可,不需要每次都发送 if (times==0) { document.forms["insertForm"].headimg.value =img ; document.forms["insertForm"].user.value = nickname; } document.forms["insertForm"].time.value = times; } last_time = curTime; last_x = x; last_y = y; last_z = z; } } } </script>
你这边应该可以搜到国外的资料,可以查下国外的资料有没有相关H5摇一摇的代码
@大da脸:
恩,我確認一下
@大da脸:
查詢瀏覽器對"ondevicemotion"這個API的支援如下圖,只有列出IOS Safari,沒有IOS的其他瀏覽器資訊,而IOS Safari是不支援的
另一個資訊是下圖,有開發者分享,必須是HTTPS的站,IOS才會啟用"ondevicemotion",這個我認為可能性較小,你的站是HTTPS嗎?
(下面NodeJS的語法可以忽略)
@RosonJ:
第一个图里绿色代表支持的是吧?红色和灰色是怎么?
第二个https的这边也测试了 ,无效
@大da脸:
紅色是不支援
灰色是未測試(未知)
@RosonJ: ok,非常感谢
我记得得给位置权限?实现应该是位置晃来晃去吧?无非是灵敏度问题。
这个我真的不清楚了
@大da脸: 我记得之前搞摇一摇的时候,安卓确实没问题,但4s和5当时是5正常,但4得摇很大幅度才行。。。
@顾晓北: 那当时用苹果测试的时候你记得是哪种浏览器吗?
@大da脸: 4s那时候还没chrome吧?所以理论上应该是safri