今天review新人写的javascript代码的时候发现了很多的问题。这里以function getCookie(name){}为例。

其中比较典型的一个问题就是如何通过javascript获取cookie里面的一个值。 那么我们先来看看cookie到底长什么样子呢?
直接在浏览器地址栏输入: javascript:alert(document.cookie); 回车。(这行代码的意思是,让浏览器执行javascript语句: alert(document.cookie);)
结果是:uin=webryan; sessionid=10293123834; pgv_send=1; cur_page=index 这个样子。
注意:1.开始没有空格,2.分号后又空格 3.最后没有分号。那么我们获取cookie的方法就比较明确了。。

一种是用document.cookie.split(“; “)的方式把字符串分割成几个段,然后遍历整个数组。 把每个数组单元等号左边的和name对比是否相等,相等则取等号右边的值。

  1. function getCookie(name){
  2. var arr = document.cookie.split("; ");
  3. for(var i=0,len=arr.length;i<len;i++){
  4. var item = arr[i].split("=");
  5. if(item[0]==name){
  6. return item[1];
  7. }
  8. }
  9. return "";
  10. }
  1. function getCookie(name){
  2. var arr = document.cookie.split("; ");
  3. for(var i=0,len=arr.length;i<len;i++){
  4. var item = arr[i].split("=");
  5. if(item[0]==name){
  6. return item[1];
  7. }
  8. }
  9. return "";
  10. }

第二种就是直接在字符串中搜索关键字。由于分号有空格,加上防止出现搜索cookie name为“str”的value是,有一个test_str的cookie名称。这里我们先进行一次过滤。 然后在找到 ;str的位置,这样就不会出问题。具体情况如下

  1. function getCookie(name){
  2. var value="";
  3. var cookie = ";"+document.cookie.replace(/;\s+/g,";")+";"
  4. var pos = cookie.indexOf(";"+name+"=");
  5. if(pos>-1){
  6. var start = cookie.indexOf("=",pos);
  7. var end = cookie.indexOf(";",start);
  8. value = unescape(cookie.substring(start+1,end));
  9. }
  10. return value;
  11. }
  1. function getCookie(name){
  2. var value="";
  3. var cookie = ";"+document.cookie.replace(/;\s+/g,";")+";"
  4. var pos = cookie.indexOf(";"+name+"=");
  5. if(pos>-1){
  6. var start = cookie.indexOf("=",pos);
  7. var end = cookie.indexOf(";",start);
  8. value = unescape(cookie.substring(start+1,end));
  9. }
  10. return value;
  11. }

不同方法在不同时刻有不同的选择。 这个就是晓晓说的选型问题。

现在实际使用的代码是

  1. /**
  2. * cookie相关
  3. */
  4. $.cookie = {
  5. /**
  6. * 读取cookie
  7. *
  8. * @param {String} n=名称
  9. * @return {String} cookie值
  10. * @example
  11. * $.cookie.get('id_test');
  12. */
  13. get:function(n){
  14. var m = document.cookie.match(new RegExp( "(^| )"+n+"=([^;]*)(;|$)"));
  15. return !m ? "":unescape(m[2]);
  16. },
  17. /**
  18. * 设置cookie
  19. * @param {String} name cookie名称 --必填
  20. * @param {String} value cookie值 --必填
  21. * @param {String} domain 所在域名
  22. * @param {String} path 所在路径
  23. * @param {Number} hour 存活时间,单位:小时
  24. * @example
  25. * $.cookie.set('value1','cookieval',"id.qq.com","/test",24); //设置cookie
  26. */
  27. set:function(name,value,domain,path,hour){
  28. var expire = new Date();
  29. expire.setTime(expire.getTime() + (hour?3600000 * hour:30*24*60*60*1000));
  30. document.cookie = name + "=" + value + "; " + "expires=" + expire.toGMTString()+"; path="+ (path ? path :"/")+ "; " + (domain ? ("domain=" + domain + ";") : "");
  31. },
  32. /**
  33. * 删除指定cookie,复写为过期 !!注意path要严格匹配, /id 不同于/id/
  34. *
  35. * @param {String} name cookie名称
  36. * @param {String} domain 所在域
  37. * @param {String} path 所在路径
  38. * @example
  39. * $.cookie.del('id_test'); //删除cookie
  40. */
  41. del : function(name, domain, path) {
  42. document.cookie = name + "=; expires=Mon, 26 Jul 1997 05:00:00 GMT; path="+ (path ? path :"/")+ "; " + (domain ? ("domain=" + domain + ";") : "");
  43. },
  44. /**
  45. * 删除所有cookie -- 这里暂时不包括目录下的cookie
  46. * @example
  47. * $.cookie.clear(); //删除所有cookie
  48. */
  49. clear:function(){
  50. var rs = document.cookie.match(new RegExp("([^ ;][^;]*)(?=(=[^;]*)(;|$))", "gi"));
  51. // 删除所有cookie
  52. for (var i in rs){
  53. document.cookie = rs[i] + "=;expires=Mon, 26 Jul 1997 05:00:00 GMT; path=/; " ;
  54. }
  55. },
  56. /**
  57. * uin -- 针对业务,对外开源请删除
  58. *
  59. * @return {String} uin值
  60. * @example
  61. * $.cookie.uin();
  62. */
  63. uin:function(){
  64. var u = $.cookie.get("uin");
  65. return !u?null:parseInt(u.substring(1, u.length),10);
  66. }
  67. };

转 通过js获取cookie的实例及简单分析的更多相关文章

  1. 通过js获取cookie的实例及简单分析

    今天碰到一个在firefox下swfupload 上传时session不一致问题 在一个项目遇到多文件上传时,firefox下,服务器端的session获取不一致问题. 解决办法: 解决办法:将ses ...

  2. 简单利用XSS获取Cookie信息实例演示

    简单利用XSS获取Cookie信息实例演示   首先要找到一个有XXS的站,这里就不整什么大站了,谷歌一下inurl:'Product.asp?BigClassName',搜出来的命中率也比较高.随便 ...

  3. js获取cookie

    js获取cookie 之前用jQuery.cookie来获取cookie,虽然简单,但是项目上又多引用了一个插件,总觉得不太好,下面是我封装的js原生获取cookie的函数. function get ...

  4. node.js获取cookie

    node.js 获取cookie var Cookies ={}; if (req.headers.cookie != null) { req.headers.cookie.split(';').fo ...

  5. js获取cookie数据并发送给服务端

    js获取cookie数据并发送给服务端 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

  6. js获取cookie中存储的值

    最近看了试卷题目发现自己会的十分的匮乏, 第一题就把自己难住了,知道有这个东西,但是实际上没有操作过. ========================================= cookie ...

  7. js获取cookie提取用户名asp.net+html

    JavaScript是运行在客户端的脚本,因此一般是不能够设置Session的,因为Session是运行在服务器端的. 而cookie是运行在客户端的,所以可以用JS来设置cookie. 假设有这样一 ...

  8. js封装Cookie操作 js 获取cookie js 设置cookie js 删除cookie

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code var CookieUtil = { // 设置cookie set : functi ...

  9. 用js获取cookie

    //获取cookiefunction cookie_email(cookie_name){ var cookiestr = document.cookie; if (cookiestr.length ...

随机推荐

  1. Linux nginx日志按天分割实例

    Linux nginx日志按天分割实例   nginx的日志有个小缺点,日志文件一直就是一个,不会自动地进行切割,如果访问量很大的话,将导致日志文件非常大,不便于管理这就需要我们自己来实现了,按日期每 ...

  2. react native get started run 模拟机报错解决

    参照 http://reactnative.cn/docs/0.30/getting-started.html#content 1)当执行 react-native run-android 这个环节的 ...

  3. ​'JAVAC' 不是内部或外部命令解决方法,记得要重启cmd

    我们在配置完环境变量后,在命令提示框中输入javac命令时,往往会提示javac不是内部或者外部命令时怎么办呢?我们一起来解决它吧! 我们配置完java环境变量之后,在命令行输入javac按下回车键, ...

  4. Retrofit 2.0使用

    最近在想能不能把之前项目里的网络请求改下 想通过Retrofit重构下,因为Retrofit完美兼容Rxjava后面会用到Rxjava 所以 开个坑写点 由于网上Retrofit 2.0的架构介绍很详 ...

  5. .NET日常总结

    属性: AccepButton:按钮在按回车键时执行(确定). CancleButton:按钮在按ESC时执行(取消). MinimizeBox:用于设置窗体上是否会出现最小化按钮. Maximize ...

  6. mysql 关键字于数据库字段于关键字冲突的问题

    如果数据库存储字段 为MySQL关键字,那么在查询或者其他操作时会出错.那么我们应该怎么办, 可能有些人会说,换个字段不就好了啊.当然这样也是可以的,完全没问题. 然而,如果是在无法对数据库进行修改和 ...

  7. HR函数学习02——分配组织单位

    REPORT ZLYHR01. "创建组织单元 成功 DATA:LS_OBJ TYPE OBJEC, LV_STU TYPE GDSTR-SVECT, LV_TIT TYPE CHAR20, ...

  8. Hibernate 检索策略

    概述 检索数据时的 2 个问题: –不浪费内存:当 Hibernate 从数据库中加载 Customer 对象时, 如果同时加载所有关联的 Order 对象, 而程序实际上仅仅需要访问 Custome ...

  9. 设计模式六大原则(5)—迪米特法则

    定义: 一个对象应该对其它的对象保持最少的了解.迪米特法则又称为最少知识法则,英文全称为Least Knowledge Principle ,简称为LKP. 个人理解: 迪米特法则主要目的是类间解耦, ...

  10. RFID Hacking④:使用ProxMark3 破解门禁

    文中提及的部分技术可能带有一定攻击性,仅供安全学习和教学用途,禁止非法使用! 0×00 前言 国际黑客大会Defcon传统之一:开锁!因为黑客认为锁也是一种安全挑战.我们在黑客题材电影.电视剧中也常常 ...