6.2、JSON
6.2.1、JSON概述JSON:JavaScript Object Notation(JavaScript 对象标记法),它是一种存储和交换数据的语法。
当数据在浏览器与服务器之间进行交换时,这些数据只能是文本,JSON 属于文本并且我们能够把任何 JavaScript 对象转换为 JSON,然后将 JSON 发送到服务器。我们也能把从服务器接收到的任何 JSON 转换为 JavaScript 对象。以这样的方式,我们能够把数据作为 JavaScript 对象来处理,无需复杂的解析和转译。
6.2.2、JSON语法
在json中,每一个数据项,都是由一个键值对(或者说是名值对)组成的,但是键必须是字符串,且由双引号包围,而值必须是以下数据类型之一:
字符串(在 JSON 中,字符串值必须由双引号编写)
数字
对象(JSON 对象)
数组
布尔
null
JSON 的值不可以是以下数据类型之一:
函数
日期
undefined
因为 JSON 语法由 JavaScript 对象标记法衍生而来,所以很少需要其它额外的软件来处理 JavaScript 中的 JSON。
通过 JavaScript,您能够创建对象并向其分配数据,就像这样:
var person = {"name": "zhangsan", "age": 62, "city": "BeiJing"}; console.log(person);
6.2.3、JSON数据类型
6.2.3.1、JSON 字符串
JSON 中的字符串必须用双引号包围。
{"name": "John"}
6.2.3.3、JSON 对象
JSON 中的值可以是对象,JSON 中作为值的对象必须遵守与 JSON 对象相同的规则。
{ "employee": {"name": "Bill Gates", "age": 62, "city": "Seattle"} }
6.2.3.4、JSON 数组
JSON 中的值可以是数组。
{ "employees": ["Bill", "Steve", "David"] }
6.2.3.5、JSON 布尔
JSON 中的值可以是 true/false。
{“sale”: true}
6.2.3.6、JSON null
JSON 中的值可以是 null。
{"middlename": null}
6.2.4、JSON字符串转JS对象
JSON.parse():可以将以JSON字符串转换为JS对象,它需要一个JSON字符串作为参数,会将该字符串转换为JS对象并返回
案例演示:
var jsonStr = '{"name":"孙悟空","age":18,"gender":"男"}'; var obj = JSON.parse(jsonStr); console.log(obj);
注意 :JSON这个对象在IE7及以下的浏览器中不支持,所以在这些浏览器中调用时会报错
6.2.5、JS对象转JSON字符串
JSON.stringify():可以将一个JS对象转换为JSON字符串,需要一个js对象作为参数,会返回一个JSON字符串案例演示:
var obj = {name: "猪八戒", age: 28, gender: "男"}; var jsonStr = JSON.stringify(obj); console.log(jsonStr);
注意 :JSON这个对象在IE7及以下的浏览器中不支持,所以在这些浏览器中调用时会报错
6.3、AJAX
6.3.1、AJAX概述
传统的web交互是用户触发一个http请求服务器,然后服务器收到之后,在做出响应到用户,并且返回一个新的页面,每当服务器处理客户端提交的请求时,客户都只能空闲等待,并且哪怕只是一次很小的交互、只需从服务器端得到很简单的一个数据,都要返回一个完整的HTML页,而用户每次都要浪费时间和带宽去重新读取整个页面。这个做法浪费了许多带宽,由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间,这导致了用户界面的响应比本地应用慢得多。
AJAX 的出现,刚好解决了传统方法的缺陷,AJAX 是一种用于创建快速动态网页的技术,通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新,这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
6.3.2、AJAX的XMLHttpRequest对象
JAX 的核心是 XMLHttpRequest 对象。 所有现代浏览器都支持 XMLHttpRequest 对象。
XMLHttpRequest 对象用于幕后同服务器交换数据,这意味着可以更新网页的部分,而不需要重新加载整个页面。
所有现代浏览器(Chrom、IE7+、Firefox、Safari 以及 Opera)都有内建的 XMLHttpRequest 对象。
创建 XMLHttpRequest 的语法是:
variable = new XMLHttpRequest();
老版本的 Internet Explorer(IE5 和 IE6)使用 ActiveX 对象:
variable = new ActiveXObject("Microsoft.XMLHTTP");
为了应对所有浏览器,包括 IE5 和 IE6,请检查浏览器是否支持 XMLHttpRequest 对象。如果支持,创建 XMLHttpRequest 对象,如果不支持,则创建 ActiveX 对象:
var xhttp; if (window.XMLHttpRequest) { xhttp = new XMLHttpRequest(); } else { // code for IE6, IE5 xhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
但是需要注意的是,出于安全原因,现代浏览器不允许跨域访问,这意味着尝试加载的网页和 XML 文件都必须位于相同服务器上。
6.3.3、AJAX的XMLHttpRequ
est对象方法
6.3.4、AJAX的XMLHttpRequest对象属性
6.3.5、AJAX的GET请求
工程结构:
users.json
[ {"name":"孙悟空","age":18,"gender":"男"}, {"name":"猪八戒","age":19,"gender":"男"}, {"name":"唐僧","age":20,"gender":"男"}, {"name":"沙和尚","age":21,"gender":"男"} ]
index.html
//步骤一:创建异步对象 var ajax = new XMLHttpRequest(); //步骤二:设置请求的url参数,参数一是请求的类型,参数二是请求的url ajax.open("get", "users.json"); //步骤三:发送请求 ajax.send(); //步骤四:注册事件 onreadystatechange 状态改变就会调用 ajax.onreadystatechange = function () { if (ajax.readyState == 4 && ajax.status == 200) { //步骤五:如果能够进到这个判断,说明数据完美的回来了,并且请求的页面是存在的 console.log(ajax.responseText);//输入响应的内容 } };
控制台:
6.3.6、AJAX的POST请求
工程结构:
users.json
[ {"name":"孙悟空","age":18,"gender":"男"}, {"name":"猪八戒","age":19,"gender":"男"}, {"name":"唐僧","age":20,"gender":"男"}, {"name":"沙和尚","age":21,"gender":"男"} ]
index.html
//步骤一:创建异步对象 var ajax = new XMLHttpRequest(); //步骤二:设置请求的类型及url,注意:post请求一定要添加请求头才行不然会报错 ajax.open("post", "users.json"); ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); //步骤三:发送请求 ajax.send(); //步骤四:注册事件 onreadystatechange 状态改变就会调用 ajax.onreadystatechange = function () { //步骤五:如果能够进到这个判断,说明数据完美的回来了,并且请求的页面是存在的 if (ajax.readyState == 4 && ajax.status == 200) { console.log(ajax.responseText);//输入响应的内容 } };
控制台:
6.3.7、AJAX的请求整合
工程结构:
users.json
[ {"name":"孙悟空","age":18,"gender":"男"}, {"name":"猪八戒","age":19,"gender":"男"}, {"name":"唐僧","age":20,"gender":"男"}, {"name":"沙和尚","age":21,"gender":"男"} ]
index.html
var Ajax = { get: function (url, fn) { var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.onreadystatechange = function () { if (xhr.readyState == 4 && xhr.status == 200 || xhr.status == 304) { fn.call(this, xhr.responseText); } }; xhr.send(); }, post: function (url, data, fn) { var xhr = new XMLHttpRequest(); xhr.open("POST", url, true); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.onreadystatechange = function () { if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 304)) { fn.call(this, xhr.responseText); } }; xhr.send(data); } }; // 演示GET请求 Ajax.get("users.json", function (response) { console.log(response); }); // 演示POST请求 Ajax.post("users.json", "", function (response) { console.log(response); });
控制台:
6.4、Cookie
6.4.1、Cookie概述
Cookie 是一些数据,存储于你电脑上的文本文件中,当 web 服务器向浏览器发送 web 页面时,在连接关闭后,服务端不会记录用户的信息,Cookie 的作用就是用于解决 “如何记录客户端的用户信息”:
当用户访问 web 页面时,它的名字可以记录在 cookie 中。
在用户下一次访问该页面时,可以在 cookie 中读取用户访问记录。
Cookie 以名/值对形式存储,如下所示:
username=zhangsan
当浏览器从服务器上请求 web 页面时, 属于该页面的 cookie 会被添加到该请求中,服务端通过这种方式来获取用户的信息。
JavaScript 可以使用 document.cookie 属性来创建 、读取、及删除 Cookie
6.4.2、Cookie创建
JavaScript 中,创建 cookie 如下所示:
document.cookie = "username=zhangsan";
您还可以为 cookie 添加一个过期时间(以 UTC 或 GMT 时间)。默认情况下,cookie 在浏览器关闭时删除。
document.cookie = "username=zhangsan; expires=Thu, 18 Dec 2043 12:00:00 GMT";
您可以使用 path 参数告诉浏览器 cookie 的路径。默认情况下,cookie 属于当前页面。
document.cookie = "username=zhangsan; expires=Thu, 18 Dec 2043 12:00:00 GMT; path=/";
6.4.3、Cookie读取
JavaScript 中,读取 cookie 如下所示:
document.cookie 将以字符串的方式返回所有的 cookie,类型格式: cookie1=value; cookie2=value;cookie3=value;
document.cookie = "username=zhangsan"; var cookies = document.cookie; console.log(cookies); • 1 • 2 • 3
6.4.4、Cookie修改
JavaScript 中,修改 cookie 如下所示:
使用 document.cookie 将旧的 cookie 将被覆盖就是修改。
document.cookie = "username=zhangsan"; document.cookie = "username=lisi"; var cookies = document.cookie; console.log(cookies);
6.4.5、Cookie删除
JavaScript 中,删除 cookie 如下所示:
删除 cookie 非常简单,您只需要设置 expires 参数为以前的时间即可,如下所示,设置为 Thu, 01 Jan 1970 00:00:00 GMT:
document.cookie = "username=zhangsan"; document.cookie = "username=; expires=Thu, 01 Jan 1970 00:00:00 GMT"; var cookies = document.cookie; console.log(cookies);
6.4.6、Cookie值设置函数
/** * Cookie值设置函数 * @param cname cookie名称 * @param cvalue cookie值 * @param exdays 过期天数 */ function setCookie(cname, cvalue, exdays) { var d = new Date(); d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000)); var expires = "expires=" + d.toGMTString(); document.cookie = cname + "=" + cvalue + "; " + expires; }
6.4.7、Cookie值获取函数
/** * Cookie值获取函数 * @param cname cookie名称 * @returns {string} */ function getCookie(cname) { var name = cname + "="; var ca = document.cookie.split(';'); for (var i = 0; i < ca.length; i++) { var c = ca[i].trim(); if (c.indexOf(name) == 0) return c.substring(name.length, c.length); } return ""; }
6.5、WebStorage
6.5.1、WebStorage概述
WebStorage是HTML5中本地存储的解决方案之一,在HTML5的WebStorage概念引入之前除去IE User Data、Flash Cookie、Google Gears等看名字就不靠谱的解决方案,浏览器兼容的本地存储方案只有使用Cookie。有同学可能会问,既然有了Cookie本地存储,为什么还要引入WebStorage的概念?那就要说一说Cookie的缺陷了:
数据大小:作为存储容器,Cookie的大小限制在4KB左右这是非常坑爹的,尤其对于现在复杂的业务逻辑需求,4KB的容量除了存储一些配置字段还简单单值信息,对于绝大部分开发者来说真的不知指望什么了。
安全性问题:由于在HTTP请求中的Cookie是明文传递的(HTTPS不是),带来的安全性问题还是很大的。
网络负担:我们知道Cookie会被附加在每个HTTP请求中,在HttpRequest和HttpResponse的header中都是要被传输的,所以无形中增加了一些不必要的流量损失。
虽然WebStorage是HTML5新增的本地存储解决方案之一,但并不是为了取代Cookie而制定的标准,Cookie作为HTTP协议的一部分用来处理客户端和服务器通信是不可或缺的,session正是依赖于实现的客户端状态保持。WebStorage的意图在于解决本来不应该Cookie做,却不得不用Cookie的本地存储的应用场景。
6.5.2、WebStorage分类
Web Storage又分为两种: sessionStorage 和localStorage ,即这两个是Storage的一个实例。从字面意思就可以很清楚的看出来,sessionStorage将数据保存在session中,浏览器关闭也就没了;而localStorage则一直将数据保存在客户端本地; 不管是sessionStorage,还是localStorage,使用的API都相同。
localStorage和sessionStorage只能存储字符串类型,对于复杂的对象可以使用ECMAScript提供的JSON对象的stringify和parse来处理,低版本IE可以使用json2.js
6.5.3、localStorage方法
对象介绍:
localStorage在本地永久性存储数据,除非显式将其删除或清空。
常见方法:
保存单个数据:localStorage.setItem(key,value);
读取单个数据:localStorage.getItem(key);
删除单个数据:localStorage.removeItem(key);
删除所有数据:localStorage.clear();
获取某个索引的key:localStorage.key(index);
案例演示:
// 保存数据 localStorage.setItem("username", "zhangsan"); // 读取单个数据 console.log(localStorage.getItem("username")); console.log("==============="); // 删除单个数据 localStorage.removeItem("username"); console.log(localStorage.getItem("username")); console.log("==============="); // 保存两个数据 localStorage.setItem("age", 18); localStorage.setItem("sex", "男"); console.log("age=" + localStorage.getItem("age")); console.log("sex=" + localStorage.getItem("sex")); console.log("==============="); // 使用for-in循环来迭代localStorage中的键值对、属性和方法: for (var key in localStorage) { console.log(key + "=" + localStorage[key]); } console.log("==============="); // 使用for循环来迭代localStorage中的键值对: for (var i = 0; i < localStorage.length; i++) { var key = localStorage.key(i); var value = localStorage.getItem(key); console.log(key + "=" + value); } console.log("==============="); // 删除所有数据 localStorage.clear();
控制台:
6.5.4、sessionStorage方法
对象介绍:
sessionStorage对象存储特定于某个对话的数据,也就是它的生命周期为当前窗口或标签页,一旦窗口或标签页被永久关闭了,那么所有通过sessionStorage存储的数据也就被清空了。存储在sessionStorage中的数据可以跨越页面刷新而存在,同时如果浏览器支持,浏览器崩溃并重启之后依然可以使用(注意:Firefox和Weblit都支持,IE则不行)。
因为sessionStorage对象绑定于某个服务器会话,所以当文件在本地运行的时候是不可用的。存储在sessionStorage中的数据只能由最初给对象存储数据的页面访问到,所以对多页面应用有限制。
不同浏览器写入数据方法略有不同。Firefox和Webkit实现了同步写入,所以添加到存储空间中的数据是立刻被提交的。而IE的实现则是异步写入数据,所以在设置数据和将数据实际写入磁盘之间可能有一些延迟。
常见方法:
保存单个数据:sessionStorage.setItem(key,value);
读取单个数据:sessionStorage.getItem(key);
删除单个数据:sessionStorage.removeItem(key);
删除所有数据:sessionStorage.clear();
获取某个索引的key:sessionStorage.key(index);
案例演示:
// 保存数据 sessionStorage.setItem("username", "zhangsan"); // 读取单个数据 console.log(sessionStorage.getItem("username")); console.log("==============="); // 删除单个数据 sessionStorage.removeItem("username"); console.log(sessionStorage.getItem("username")); console.log("==============="); // 保存两个数据 sessionStorage.setItem("age", 18); sessionStorage.setItem("sex", "男"); console.log("age=" + sessionStorage.getItem("age")); console.log("sex=" + sessionStorage.getItem("sex")); console.log("==============="); // 使用for-in循环来迭代sessionStorage中的键值对、属性和方法: for (var key in sessionStorage) { console.log(key + "=" + sessionStorage[key]); } console.log("==============="); // 使用for循环来迭代sessionStorage中的键值对: for (var i = 0; i < sessionStorage.length; i++) { var key = sessionStorage.key(i); var value = sessionStorage.getItem(key); console.log(key + "=" + value); } console.log("==============="); // 删除所有数据 sessionStorage.clear();
控制台: