6、JS-AJAX
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
6.3、AJAX
6.3.1、AJAX概述
传统的web交互是用户触发一个http请求服务器然后服务器收到之后在做出响应到用户并且返回一个新的页面每当服务器处理客户端提交的请求时客户都只能空闲等待并且哪怕只是一次很小的交互、只需从服务器端得到很简单的一个数据都要返回一个完整的HTML页而用户每次都要浪费时间和带宽去重新读取整个页面。这个做法浪费了许多带宽由于每次应用的交互都需要向服务器发送请求应用的响应时间就依赖于服务器的响应时间这导致了用户界面的响应比本地应用慢得多。
AJAX 的出现,刚好解决了传统方法的缺陷AJAX 是一种用于创建快速动态网页的技术通过在后台与服务器进行少量数据交换AJAX 可以使网页实现异步更新这意味着可以在不重新加载整个网页的情况下对网页的某部分进行更新。
6.3.2、AJAX的XMLHttpRequest对象
AJAX 的核心是 XMLHttpRequest 对象。 所有现代浏览器都支持 XMLHttpRequest 对象。
XMLHttpRequest 对象用于幕后同服务器交换数据这意味着可以更新网页的部分而不需要重新加载整个页面。
所有现代浏览器Chrom、IE7+、Firefox、Safari 以及 Opera都有内建的 XMLHttpRequest 对象。
创建 XMLHttpRequest 的语法是
variable = new XMLHttpRequest();
老版本的 Internet ExplorerIE5 和 IE6使用 ActiveX 对象
variable = new ActiveXObject("Microsoft.XMLHTTP");
为了应对所有浏览器包括 IE5 和 IE6请检查浏览器是否支持 XMLHttpRequest 对象。如果支持创建 XMLHttpRequest 对象如果不支持则创建 ActiveX 对象 但是需要注意的是出于安全原因现代浏览器不允许跨域访问这意味着尝试加载的网页和 XML 文件都必须位于相同服务器上。
6.3.3、AJAX的XMLHttpRequest对象方法
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);
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();
获取某个索引的keylocalStorage.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();
获取某个索引的keysessionStorage.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();
控制台
6.6、Closure
6.6.1、闭包引入
需求信息点击某个按钮提示"点击的是第n个按钮"
第一种解决方法将btn所对应的下标保存在btn上
var btns = document.getElementsByTagName('button');
//将btn所对应的下标保存在btn上
for (var i = 0, length = btns.length; i < length; i++) {
var btn = btns[i];
btn.index = i;
btn.onclick = function () {
alert('第' + (this.index + 1) + '个');
}
}
第二种解决方法利用闭包延长局部变量的生命周期
var btns = document.getElementsByTagName('button');
// 利用闭包延长局部变量的生命周期
for (var i = 0, length = btns.length; i < length; i++) {
(function (j) {
var btn = btns[j];
btn.onclick = function () {
alert('第' + (j + 1) + '个');
}
})(i);
}
6.6.2、闭包概念
如何产生闭包?
当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量(函数)时就产生了闭包
什么才是闭包
理解一闭包是嵌套的内部函数(绝大部分人认为)
理解二包含被引用变量(函数)的对象(极少部分人认为)
闭包的作用
它的最大用处有两个一个是可以读取函数内部的变量另一个就是让这些变量的值始终保持在内存中
6.6.3、闭包演示
function fun1() {
var a = 2;
function subFun() {
a++;
console.log(a);
}
return subFun;
}
var f1 = fun1();
f1();
f1();
console.log("===============");
function fun2() {
var a = 2;
function subFun() {
a--;
console.log(a);
}
return subFun;
}
var f2 = fun2();
f2();
f2();
console.log("===============");
6.6.4、闭包生命周期
生命周期
产生在嵌套内部函数定义执行完时就产生了(不是在调用)
死亡在嵌套的内部函数成为垃圾对象时就死亡了
演示说明
function fn1() {
//此时闭包就已经产生了(函数提升, 内部函数对象已经创建了)
var a = 2;
function fn2() {
a++;
console.log(a);
}
return fn2;
}
var f = fn1();
f(); // 3
f(); // 4
f = null; //闭包死亡(包含闭包的函数对象成为垃圾对象)
6.6.5、闭包应用
闭包应用 定义JS模块
具有特定功能的js文件
将所有的数据和功能都封装在一个函数内部(私有的)
只向外暴露一个包含n个方法的对象或函数
模块的使用者只需要通过模块暴露的对象调用方法来实现对应的功能
案例演示
第一种格式myModule.js
function myModule() {
//私有数据
var msg = 'Hello, World';
//操作数据的函数
function doSomething() {
console.log('doSomething() ' + msg.toUpperCase());
}
function doOtherthing() {
console.log('doOtherthing() ' + msg.toLowerCase());
}
//向外暴露对象(给外部使用的方法)
return {
doSomething: doSomething,
doOtherthing: doOtherthing
}
}
第一种使用index.html
var module = myModule();
module.doSomething();
module.doOtherthing();
第二种格式myModule.js
(function (window) {
//私有数据
var msg = 'Hello, World';
//操作数据的函数
function doSomething() {
console.log('doSomething() ' + msg.toUpperCase());
}
function doOtherthing() {
console.log('doOtherthing() ' + msg.toLowerCase());
}
//向外暴露对象(给外部使用的方法)
window.myModule = {
doSomething: doSomething,
doOtherthing: doOtherthing
}
})(window);
第二种使用index.html
myModule.doSomething();
myModule.doOtherthing();