HTML5实用功能推荐

一、HTML5实用功能之Application Cache

1、Application Cache的优点和应用场景

优点

  • 离线浏览 – 用户可在离线时浏览您的完整网站
  • 速度 – 缓存资源为本地资源,因此加载速度较快。
  • 服务器负载更少 – 浏览器只会从发生了更改的服务器下载资源。

应用场景

  • 完整的离线应用,可以缓存一些商户要展示给用户的重要资源信息。
  • H5页面小游戏,当网络不稳定或者断网的情况下也可以继续进行。
  • 网站一些长期不变的公共资源,可以放缓存。
  • 其他。

2、Application Cache的运行流程和文件规范

运行流程

文件规范

CACHE MANIFEST
# Javascript v9.6
CACHE:
    cache.css
    cache.js
    jquery-2.1.4.min.js
    test1.png
    test2.png
NETWORK:

FALLBACK:

第一行CACHE MANIFEST必须写,第二行通常为版本号注释信息,用来更新manifest文件,下面分别为要缓存的文件,需要通过网络获取的文件,以及从网络请求失败的替代页面。(本文重点讲述application cache使用时的注意点以及作者在测中踩过的坑,基本使用不作重点讲述。

3、使用Application Cache的注意点和建议

  • 离线缓存文件要更新,一定要同步更新manifest文件(通常是注释版本号)。
  • 引用manifest文件的页面也会被缓存。
  • 如果manifest文件,或者内部列举的某一个文件不能正常下载,整个更新过程将视为失败,浏览器继续全部使用旧的缓存。
  • 页面不能跨域引用manifest文件,但是manifest中可以指定跨域资源进行缓存。
  • FALLBACK中的资源必须和manifest文件同源。
  • manifest缓存与http本身的缓存功能并不冲突,虽然更新manifest文件后会把manifest清单中的文件都重新去服务器请求一次,但是是基于http请求,此时http本身的缓存机制依然有效。
  • 虽然manifest清单中的NETWORK不是必写的,但是经过实测,页面中所需的资源是CACHE和NETWORK以及FALLBACK的并集,如果页面中引用的资源在三者中都没有指定,将不会获取,并不会默认从网络获取。
  • 站点中的其他页面即使没有设置manifest属性,请求的资源如果在缓存中也从缓存中访问。
  • 引用manifest页面若带参数,参数改变,浏览器会将页面认为是新的使用了application cache功能的页面,从而将该页面进行缓存,并且进行一次manifest的检查和拉取。

manifest的缓存加载和页面加载是异步的,所以manifest有更新时,需要刷新两次用户端才能实现更新。解决方法可以写一段脚本,判断当applicationcache状态为updateready时(此状态表示缓存资源更新了),提示用户更新页面,或者强制刷新。

(示例如下)

window.applicationCache.addEventListener('updateready', function(e) {  
  if (window.applicationCache.status == window.applicationCache.UPDATEREADY) {  
      window.applicationCache.swapCache();  
     if (confirm('是否下载新版本?')) {  
          window.location.reload();  
      }  
    }else {  
      // Manifest didn't changed. Nothing new to server.  
 }  
}, false);

二、HTML5实用功能之运动度传感器事件devicemotion和方向传感器事件deviceorientation

1、H5 devicemotion和deviceorientation基本介绍和应用背景。

基本介绍

  • devicemotion:封装了加速度传感器数据的事件。网页可以通过该事件获取到设备的加速度传数据。
  • deviceorientation:封装了方向传感器数据的事件。网页可以通过该事件获取到设备的方向信息。

应用场景

可以基于以上一个或者两个,来获得硬件设备的运动情况,从而进行一些处理或者开发一些趣味应用,类似:

  • 手机摇一摇(基于摇一摇的活动,例如摇一摇红包)。
  • 手机平衡球游戏等。
  • 体感游戏。
  • 等等。

2、H5 devicemotion 和deviceorientation API使用方法。

devicemotion

function initMotion(){
    if (window.DeviceMotionEvent) {
        if(shakeFlag){
            window.addEventListener('devicemotion', deviceMotionHandler, false);
        }                
    }else{
        alert("not support!");
    }  
}

deviceorientation

function initorientation(){
    if(window.DeviceOrientationEvent){
        window.addEventListener('deviceorientation',DeviceOrientationHandler,false);
    }else{
        alert("您的浏览器不支持DeviceOrientation");
    }
}

3、手机H5页面红包摇一摇Demo

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
    <script src="jquery-2.1.4.min.js"></script>
    <link href="red.css" rel="stylesheet">
    <title>red</title>
    <style>

    </style>
</head>
<body onload="initMotion()">
<div id="page1">
    <div id="red-wrap">
        <div id="circle">
            <span>Lucky Money</span>
        </div>
    </div>

    <btn id="rules" class="btn" onclick="rulesToggle()">Rules</btn>
    <btn id="tryAgain" class="btn" onclick="tryAgain()">Try Again</btn>
</div>
<div id="page2">
    <div id="rules-wrap">
        <h2 id="Rules">Rules</h2>
        <ul>
            <li>Shake your phone,and you will get lucy money of random amount.</li><br/>
            <li>Click "Get My Luck",and the money will be deposited into your account.</li><br/>
            <li>Share your luck to your friends via sharing game this to your friends.</li>        
        </ul>
    </div>
</div>



<script>
    SHAKE_THRESHOLD = 3000;
    var last_update = 0;
    var x = y = z = last_x = last_y = last_z = 0;
    var shakeFlag = 1;
    function initMotion(){
        if (window.DeviceMotionEvent) {
            if(shakeFlag){
                window.addEventListener('devicemotion', deviceMotionHandler, false);
            }                  
        }else{
            alert("not support!");
        }  
    }

    function deviceMotionHandler(eventData) {  
        var acceleration = eventData.acceleration;  
        var currTime = new Date().getTime();  
        var diffTime = currTime - last_update;  
        if (diffTime > 120 && shakeFlag == 1) {  
            last_update = currTime;  
            x = acceleration.x;  
            y = acceleration.y;  
            z = acceleration.z;  
            var speed = Math.abs(x + y + z - last_x - last_y - last_z) / diffTime * 30000;  

            if (speed > SHAKE_THRESHOLD) {  
                //要一摇之后进行业务逻辑处理              
                shaking();                        
               setTimeout(function(){$.get("red.php",function(data){
                    $("#circle span").css("font-size","30px").html(data+" "+"$");
                })},1000);

                shakeFlag = 0;
            }           
            last_x = x;  
            last_y = y;  
            last_z = z;  
        }
    }

    function tryAgain(){
        shakeFlag = 1;
        $("#circle span").html("Lucky Money");
        $("#red-wrap").removeClass("shaking");
        $("#circle span").css("font-size","20px");
        $("#circle").css("background","yellow");
    }

    function rulesToggle(){
        if(!$("#page2").height()){
            $("#page2").css({"height":"68%","opacity":1});
        }else{
            $("#page2").css({"height":0,"opacity":0});
        }       
    }
    function shaking(){
        $("#red-wrap").addClass("shaking");
    }

    function getRandomColor(){
        return "#"+("00000"+((Math.random()*16777215+0.5)>>0).toString(16)).slice(-6);
    }
    function colorChange(){
        $("#circle").css("background",getRandomColor());
        setInterval("colorChange()",200);
    }
</script>

</body>
</html>

author: arthur / bryan