手机网页摇一摇问题

同学让我帮她写一个用于婚礼上使用的摇一摇手机网页,使用的是

function init(){
	 if (window.DeviceMotionEvent) {
		 // 移动浏览器支持运动传感事件
		 window.addEventListener('devicemotion', deviceMotionHandler, false);
	 } 
}
其中 deviceMotionHandler是监听方法,如下:

var SHAKE_THRESHOLD = 3000;
var UPDATE_INTERVAL_TIME = 70;
// 定义一个变量保存上次更新的时间
var last_update = 0;
// 紧接着定义x、y、z记录三个轴的数据以及上一次出发的时间
var x = 0;
var y = 0;
var z = 0;
var last_x = 0;
var last_y = 0;
var last_z = 0;
var count = 1;
var arrorder = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
var running = false;
function deviceMotionHandler(eventData) {
	if(running)
		return ;
	// 获取含重力的加速度
	var acceleration = eventData.accelerationIncludingGravity; 
	// 获取当前时间
	var curTime = new Date().getTime(); 
	var timeInterval = curTime -last_update;
	// 固定时间段
	//alert(timeInterval);
	if(timeInterval < UPDATE_INTERVAL_TIME){
		//alert(timeInterval);
		return ;
	}
		
	
	
	last_update = curTime; 

	x = acceleration.x; 
	y = acceleration.y; 
	z = acceleration.z;
	
	var deltaX = x - last_x;
	var deltaY = y - last_y;
	var deltaZ = z - last_z;
	last_x = x;
	last_y = y;
	last_z = z;
	var temp = deltaX*deltaX+deltaY*deltaY+deltaZ*deltaZ;
	var tt = Math.sqrt(temp);
	
	var speed = (tt/timeInterval)*10000;
	//alert("speed="+speed);
		//var speed = Math.abs(x + y + z - last_x - last_y - last_z) / diffTime * 30000; 
	//alert(speed);
		if (speed > SHAKE_THRESHOLD) {
			running = true;
			// TODO:在此处可以实现摇一摇之后所要进行的数据逻辑操作
			$('#hand').css({"display": "block"});
			$('#orderbg').css({
				"background":"url(img/yaoyiyaobg.jpg) no-repeat",
				"position": "absolute",
				"top" : "0px",
				"background-size":"100% 100%"
			});
			$('#hand').attr("class", "hand hand-animate");
			
			switch(count){
				case 1:
					setTimeout(function(){
						$('#hand').css({"display": "none"});
						$('#orderbg').css({
							"background":"url(img/order1.jpg) no-repeat",
							"position": "absolute",
							"top" : "0px",
							"background-size":  "100% 100%"	
						});
						//$('#order1').css({"display":"block"});
						running = false;
					},1000);
					count = count + 1;

				  break;
					
				default:
				running = true;
				$('#hand').attr("class", "hand");
				alert('摇号结束!刷新可重新摇。');
				break;
			}
			
		}

		last_x = x; 
		last_y = y; 
		last_z = z; 
		
}
我发现,监听器在监听的过程中是启动多个线程的,就是一摇一下,但是这个方法却执行了两到三次,甚至四次,由于在js中没有听说过线程同步,因此,我使用了一个全局的running变量,当一个线程在执行的时候,其他线程都会自动退出,这是一个解决方案。

网上搜了很多,都是一个解决方案,比如这位大神@david1030 的一篇文章:

http://blog.csdn.net/david1030/article/details/8229008


我也写android代码,在安卓里面,为了解决摇一摇监听器在短时间内多次调用的问题,在一次执行的时候,将监听器短暂的注销掉,然后再添加上去

具体可以看下面的博客@xn4545945 

http://blog.csdn.net/t12x3456/article/details/12800475



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值