新技术论坛
搜索
查看: 880|回复: 0
打印 上一主题 下一主题

[JS/AJAX] 读javascript高级程序设计-在线检测,cookie,子cookie

[复制链接]
  • TA的每日心情
    开心
    2016-10-18 06:23
  • 签到天数: 72 天

    连续签到: 1 天

    [LV.6]常住居民II

    扫一扫,手机访问本帖
    楼主
    跳转到指定楼层
    发表于 2016-3-17 21:52:21 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
    开发离线应用时,往往在离线状态时把数据存在本地,而在联机状态时再把数据发送到服务器。html5提供了检测在线状态的方法:navigator.onLine和online/offline事件。
    1.navigator.onLine属性
    表示当前的网络状态是否在线,true表示在线,false表示离线。当网络状态变化时,该属性也会随之变化。
    2.online和offline事件
    HTML5提供了这两个事件,会在网络状态变化时触发。online在网络由离线变为在线时触发;offline在网络由在线变为离线时触发。
    1. <font color="#000000"><p>You are currently: <span id="status">http://www.012082.cn/hgxjgftzwz/<script>document.write(navigator.onLine ? "在线" : "离线");</script></span></p>
    2.     <p>切换脱机状态,看看效果</p>
    3.     <script>
    4.         EventUtil.addHandler(window, "online", function(){
    5.             document.getElementById("status").innerHTML = "在线";
    6.         });
    7.         EventUtil.addHandler(window, "offline", function(){
    8.             document.getElementById("status").innerHTML = "离线";
    9.         });
    10.     </script></font>
    复制代码

    二、cookie
    1.cookie构成:
    • 名称:cookie的名称必须是经过URL编码后的字符串。虽然它是不区分大小写的,但是实际应用时建议把它当作区分大小写来使用。
    • 值:cookie中字符串值,也必须是经过URI编码的字符串。
    • 域:表示cookie对于哪个域有效。
    • 路径:cookie是针对域中的哪个目录生效。
    • 失效时间:表示cookie失效时间的时间戳,它是GMT格式的日期。将该事件设置小于当前时,就相当于删除了cookie。
    • 安全标识:指定该标识后,只有使用SSL请求连接的时候cookie才会发送到服务器。secure标识是cookie中唯一一个非键值对的部分,它只包含一个secure单词。
    2.cookie读写删除操作
    在JavaScript中可以通过document.cookie可以读取当前域名下的cookie,是用分号隔开的键值对构成的字符串。类似于name=aa;age=15;
    注意所有的键值对名称和值都是经过encodeURIComponent()编码的,使用时要进行解码。
    当给document.cookie赋值时,不会直接覆盖现有的cookie,而是会追加一个新的cookie。例如:
    document.cookie="a=1";//执行后会看到新增了一个cookie。

    常用的cookie读写删除方法:



    1. var CookieUtil = {
    2. //根据key读取cookie
    3.     get: function (name){
    4.          //注意对键编码
    5.         var cookieName = encodeURIComponent(name) + "=",
    6.             cookieStart = document.cookie.indexOf(cookieName),
    7.             cookieValue = null,
    8.             cookieEnd;
    9.         //找到cookie键   
    10.         if (cookieStart > -1){
    11.              //键后面第一个分号位置
    12.             cookieEnd = document.cookie.indexOf(";", cookieStart);
    13.             if (cookieEnd == -1){
    14.                 cookieEnd = document.cookie.length;
    15.             }
    16.             //cookie值解码
    17.             cookieValue = http://www.073511.cn/zqtzgplkh/ decodeURIComponent(document.cookie.substring(cookieStart + cookieName.length, cookieEnd));
    18.         }
    19.         return cookieValue;
    20.     },
    21.     //设置cookie
    22.     set: function (name, value, expires, path, domain, secure) {
    23.         var cookieText = encodeURIComponent(name) + "=" + encodeURIComponent(value);
    24.         //失效时间,GMT时间格式
    25.         if (expires instanceof Date) {
    26.             cookieText += "; expires=" + expires.toGMTString();
    27.         }
    28.         if (path) {
    29.             cookieText += "; path=" + path;
    30.         }
    31.         if (domain) {
    32.             cookieText += "; domain=" + domain;
    33.         }
    34.         if (secure) {
    35.             cookieText += "; secure";
    36.         }
    37.         document.cookie = cookieText;
    38.     },
    39.     //删除cookie,保持相同的键、域、路径、安全选项,然后设置失效时间即可
    40.     unset: function (name, path, domain, secure){
    41.         this.set(name, "", new Date(0), path, domain, secure);
    42.     }
    43. };
    复制代码

    实例:“不再提示”
    1. <p id="know">友情提示区域1 <a href="javascript:void(0)" target="_self" id="btn-know">不再提示</a></p>
    2.     <input type="button" value="清除cookie" id="delete-btn" />
    3.     <script type="text/javascript">
    4.          var cookiekey="知道了";
    5.         EventUtil.addHandler(window, "load", function(){     
    6.             var know1 = CookieUtil.get(cookiekey);
    7.             if(know1){
    8.                  document.getElementById("know").style.display="none";
    9.                  }
    10.             EventUtil.addHandler(document.getElementById("delete-btn"), "click", function(){
    11.                 CookieUtil.unset(cookiekey);        
    12.             })      
    13.         });
    14.         EventUtil.addHandler(document.getElementById("btn-know"),"click",function(){
    15.              CookieUtil.set(cookiekey, "1");
    16.              document.getElementById("know").style.display="none";
    17.              });
    18.     </script>
    复制代码

    3.子cookie
    有时站点需要记录多个cookie,比如多块功能区域都有气泡提示,点击“不再提示”后取消提醒,此时每个区域都需要记录一个很简单的cookie。由于浏览器cookie数量是有限制的,为了减少cookie数量可以使用子cookie的方式。在一个cookie值中使用类似查询字符串的格式可以存储多组键值对,这样就不必每个键值对都占用一个cookie了。子cookie值举例:
    1. iknow=know0=1&know1=1
    复制代码

    ①获取所有子cookie并将它放在一个对象中返回,对象的属性名为子cookie名称,对象的属性值为子cookie的值。
       
    1. getAll: function(name){http://www.057316.cn/zqtllt/
    2.         var cookieName = encodeURIComponent(name) + "=",
    3.             cookieStart = document.cookie.indexOf(cookieName),
    4.             cookieValue = null,
    5.             cookieEnd,
    6.             subCookies,
    7.             i,
    8.             parts,
    9.             result = {};
    10.         if (cookieStart > -1){
    11.             cookieEnd = document.cookie.indexOf(";", cookieStart)
    12.             if (cookieEnd == -1){
    13.                 cookieEnd = document.cookie.length;
    14.             }
    15.             //取出cookie字符串值
    16.             cookieValue = document.cookie.substring(cookieStart + cookieName.length, cookieEnd);           
    17.             if (cookieValue.length > 0){
    18.                    //用&将cookie值分隔成数组
    19.                 subCookies = cookieValue.split("&");         
    20.                 for (i=0, len=subCookies.length; i < len; i++){
    21.                        //等号分隔出键值对
    22.                     parts = subCookies[i].split("=");
    23.                     //将解码后的兼职对分别作为属性名称和属性值赋给对象
    24.                     result[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1]);
    25.                 }
    26.                 return result;
    27.             }
    28.         }
    29.         return null;
    30.     }
    复制代码

    ②get()获取单个子cookie。
    1. get: function (name, subName){
    2.          //获取所有子cookie
    3.         var subCookies = this.getAll(name);
    4.         if (subCookies){
    5.              //从属性中获取单个子cookie
    6.             return subCookies[subName];
    7.         } else {
    8.             return null;
    9.         }
    10.     }
    复制代码

    ③setAll设置整个cookie
       
    1. setAll: function(name, subcookies, expires, path, domain, secure){
    2.         var cookieText = encodeURIComponent(name) + "=",
    3.             subcookieParts = new Array(),
    4.             subName;
    5.         //遍历子cookie对象的属性
    6.         for (subName in subcookies){
    7.              //要先检测属性名
    8.             if (subName.length > 0 && subcookies.hasOwnProperty(subName)){
    9.                  //属性名和属性值编码后=连接为字符串,并放到数组中
    10.                 subcookieParts.push(encodeURIComponent(subName) + "=" + encodeURIComponent(subcookies[subName]));
    11.             }
    12.         }
    13.         if (subcookieParts.length > 0){
    14.              //用&连接子cookie串
    15.             cookieText += subcookieParts.join("&");
    16.             if (expires instanceof Date) {
    17.                 cookieText += "; expires=" + expires.toGMTString();
    18.             }
    19.             if (path) {
    20.                 cookieText += "; path=" + path;
    21.             }
    22.             if (domain) {
    23.                 cookieText += "; domain=" + domain;
    24.             }
    25.             if (secure) {
    26.                 cookieText += "; secure";
    27.             }
    28.         } else {
    29.             cookieText += "; expires=" + (new Date(0)).toGMTString();
    30.         }
    31.         //设置整个cookie
    32.         document.cookie = cookieText;        
    33.     }

    34. ④set设置单个子cookie

    35.     set: function (name, subName, value, expires, path, domain, secure) {
    36.         //获取当前cookie对象
    37.         var subcookies = this.getAll(name) || {};
    38.         //单个cookie对应的属性替换
    39.         subcookies[subName] = value;
    40.         //重新设置cookie
    41.         this.setAll(name, subcookies, expires, path, domain, secure);
    42.     }
    复制代码

    ⑤删除cookie
    删除整个cookie, 将失效时间设置为过期日期即可。
    1. unsetAll: function(name, path, domain, secure){
    2.         this.setAll(name, null, new Date(0), path, domain, secure);
    3.     }
    复制代码

    删除单个子cookie,需要先获取所有子cookie对象,然后删除子cookie对应的属性,最后再将子cookie对象重新设置回去。
    1. unset: function (name, subName, path, domain, secure){
    2.          //获取当前cookie对象
    3.         var subcookies = this.getAll(name);
    4.         if (subcookies){
    5.              //删除子cookie对应的属性
    6.             delete subcookies[subName];
    7.           //重新设置cookie
    8.             this.setAll(name, subcookies, null, path, domain, secure);
    9.         }
    10.     }
    复制代码

    ⑥调用实例:多个气泡提示区域,“不再提示”功能cookie记录在同一个cookie中。
    1. <p id="know0">友情提示区域1 <a href="javascript:void(0)" target="_self" id="btn-know0">不再提示</a></p>
    2.     <p id="know1">友情提示区域2 <a href="javascript:void(0)" target="_self" id="btn-know1">不再提示</a></p>
    3.     <input type="button" value="清除cookie" id="delete-btn" />
    4.     <script type="text/javascript">
    5. var cookiekey = 'iknow',
    6. key0 = 'know0',
    7. key1 = 'know1';
    8. EventUtil.addHandler(window, 'load', function () {
    9.   var know0 = SubCookieUtil.get(cookiekey, key0);
    10.   if (know0) {
    11.     document.getElementById('know0').style.display = 'none';
    12.   }
    13.   var know1 = SubCookieUtil.get(cookiekey, key1);
    14.   if (know1) {
    15.     document.getElementById('know1').style.display = 'none';
    16.   }
    17.   EventUtil.addHandler(document.getElementById('delete-btn'), 'click', function () {
    18.     SubCookieUtil.unset(cookiekey, key0);
    19.     SubCookieUtil.unset(cookiekey, key1);
    20.   })
    21.   EventUtil.addHandler(document.getElementById('btn-know0'), 'click', function () {
    22.     SubCookieUtil.set(cookiekey, key0, 1);
    23.     document.getElementById('know0').style.display = 'none';
    24.   });
    25.   EventUtil.addHandler(document.getElementById('btn-know1'), 'click', function () {
    26.     SubCookieUtil.set(cookiekey, key1, 1);
    27.     document.getElementById('know1').style.display = 'none';
    28.   });
    29. });
    30.     </script>
    复制代码


    注意:cookie不能用来存储大量数据,也不能存储敏感数据。



    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    手机版|Archiver|开发者俱乐部 ( ICP/ISP证:辽B-2-4-20110106号 IDC证:辽B-1-2-20070003号 )

    GMT+8, 2024-12-23 05:25 , Processed in 0.113896 second(s), 22 queries .

    X+ Open Developer Network (xodn.com)

    © 2009-2017 沈阳讯网网络科技有限公司

    快速回复 返回顶部 返回列表