Ajax(全)
JSON
简介:JSON(JavaScript Object Notation)以纯文本结构组织所要传送的数据,数据内容包括字符串、数字、数组和对象等,由于JSON易读以及纯文本格式的特性,可以非常容易地与其他程序进行沟通与数据交换。
JSON 文件的文件类型是 ".json"
格式: JSON的数据结构通过大括号、中括号、逗号和冒号来组织数据,因此我们从这四种符号切入,带大家伙认识JSON数据。
“键:值” "key:value"
对象:大括号内代表的是“对象(object)”,对象代表的是一系列“键:值”的集合
数组: 中括号内代表的是“数组(array)”。数组内可以存放数字、文字、布尔值、数组、对象等变量,无论是同时存放同一种性质的变量,或是混合使用都可以,同样以逗号隔开每个变量。
然而与对象不同的地方,数组内以逗号隔开的部分无法放入“键:值”的格式。
遍历JSON: for in
JSON字符串转换为JSON对象:
JSON字符串: var str1 = '{ "name": "cxh", "sex": "man" }';
var obj = eval('(' + str + ')');//由JSON字符串转换为JSON对象
或者
var obj = JSON.parse(str); //由JSON字符串转换为JSON对象(常用)
将JSON对象转化为JSON字符串:
var last=JSON.stringify(obj); //将JSON对象转化为JSON字符
ajax
什么是ajax?是Asynchronous JavaScript+XML的简写。ajax技术核心是XMLHttpRequest对象(简称XHR)
IE7+、Firefox、Opera、Chrome和Safari都支持原生的XHR对象,在这些浏览器中创建XHR对象可以直接实例化XMLHttpRequest即可。
var xhr = new XMLHttpRequest();
alert(xhr);
XMLHttpRequest
我们与服务器通信的API就是XMLHttpRequest。
那么我们都需要那些步骤来通信呢,简单理解一共只有4步。
1、新建XMLHttpRequest对象
var request=new XMLHttpRequest();
IE 7以下 var request=new ActiveXObject("Microsoft.XMLHTTP");(兼容)
2、打开要发送的地址通道。
request.open(“GET”,地址,同步/异步);
3、给XMLHttpRequest对象增加侦听器,用来侦听各种情况,包括各种链接状态
request.addEventListener(“load”,侦听函数)发送数据给打开的地址,
4、如果没有要发送的内容直接send()
request.send();
open
Open方法的参数主要包括
DOMString method,
DOMString url,
optional boolean async,
optional DOMString user,
optional DOMString password
url地址是一个比较强大的内容,如果给服务器传参不需要加密的话,可以通过url来进行传参,通常传参的方法是http://地址:端口/文件名?参数1=值1&参数2=值2
http头部
HTTP客户程序(例如浏览器),向服务器发送请求的时候必须指明请求类型(一般是GET或者POST)。如有必要,客户程序还可以选择发送其他的请求头。大多数请求头并不是必需的,但Content-Length除外。对于POST请求来说Content-Length必须出现。请通过百度等搜索引擎搜索该内容学习。这部分内容在以后实际应用中有很多是需要使用的。xhr.setRequestHeader(“content-type”,”application/x-www-form-urlencoded”)
getResponseHeader获取头部指定的属性值
getAllResponseHeaders 获取所有头部属性
setRequestHeader 设置头部属性,必须在open以后,send以前写入
本地数据的加载问题:
所以通过修改json文件,网页不需要改变就能实现html改变颜色
更新包括两种一种是热更新、一种是冷更新
冷更新:每一次更新时,是将原来有的app都删了,然后从服务器上下最新的app,把最新的app重新安装
热更新:打开app时,是进度条,现在已下载多少更新多少,等更新完成之后
加载外部XML文件
var xhr=new XMLHttpRequest();//XMLHttpRequest最早期就是为了通讯XML文件的
xhr.addEventListener("load",loadHandler);
xhr.open("GET","./a.xml");
xhr.send();
function loadHandler(e){
console.log(xhr.responseXML);
}

那么加载进来有什么用呢?
获取的内容是对应的dom内容,所以可以在这个内容当中获取对应的数据,
例如获取num的结果
那么就是
xml=xhr.responseXML;
var num=xml.getElementsByTagName("num");
console.log(num);

可以获取第0项
xml=xhr.responseXML;
var num=xml.getElementsByTagName("num")[0];
console.log(num);

甚至可以获取它的数据
xml=xhr.responseXML;
var num=xml.getElementsByTagName("num")[0].textContext;
console.log(num);

如果想取到bk里的所有的man的数据
xml=xhr.responseXML;
var bk=xml.getElementsByTagName("bk")[0];
var bk=xml.querySelectorAll("man")//获取所有man

var bk=xml.querySelectorAll("bk>man")//获取bk下的man

var bk=xml.querySelectorAll("bk>man")[0];//获取张三的数据

var bk=xml.querySelectorAll("bk>man")[0];
console.log(bn.getAttribute("name");//获取张三这条数据中的张三

加载html
同步和异步
http头部补充
send
发送json字符串
除了发送字符串数据之外,还可以发送其他类型的数据,包括:
1、void send(ArrayBuffer data);类型化数组
图片
2、void send(Blob data);二进制大对象,是一个可以存储二进制文件的容器。
可以上传blob文件,比如文件提交、上传图片等
举例:
var form=document.querySelector("form");
form.addEventListener("submit",submitHandler);
function submitHandler(e){
e.preventDefault();
var file==document.querySelector("[type=file]");
// console.log(file.files);//上传一张图片之后是一个二进制类型的blob数据,可以直接上传 给服务器
var xhr=new XMLHttpRequest();
xhr.open("POST","http://localhost:8000");
xhr.addEventListener("load",loadHandler);
xhr.send(file.files[0]);//这样将图片直接发送给服务器了
}
图片直接发送给服务器之后,那么nodejs 里data就不是字符串了,是二进制数据, 所以console.log(_data );

然后nodejs再根据上传数据的格式,将二进制数据转化成图片,然后进行保存
解析图片过程就不在这里介绍了
3、void send(Document data); 文档对象
服务器接收字符串‘
4、void send(DOMString? data); 文本数据
也可以将DOMString(例如div)发送给服务器
5、void send(FormData data); 数据对象,可以直接封装内容
举例:formData 发送表单数据
一个表单
表单 里的数据通过ajax执行,首先得让表单不发送,通过preventDefault,
如果想让它通过表单发送的话,得需要将input里面的值提出来,然后放在对象中,再将对象转化为字符串,然后发送给服务器,但是这种方式不好,现在通过formData来实现
把form表单塞到new formData当中,然后就能拿到一个数组,但是查找不到,所以对数组进行遍历
,获取到的数据不需要转化为对象或者字符串发出去,直接发送出去就可以。
这样就可以将整个表单出具一次性提交
当然,nodejs里面还需要解析formData,有点麻烦,就不在这里面介绍了
timeout
超时,因为各种因素导致数据前后端传递的延迟
设置超时等待,如果超过这个时间,就切断数据发送
var xhr=new XMLHttpRequest();
xhr.open("POST","http://localhost:8000");
xhr.addEventListener("load",loadHandler);//超时事件,如果触发超时等待就会执行这个操作
xhr.timeout=2000;//设置超时等待2秒
xhr.send("aaa");
function loadHandler(){
}
function timeOutHandler(e){
xhr.abort();//将原来的链接断掉,重新再创建并执行心得xhr的通信
}
readyState

UNSENT
XMLHttpRequest 代理已被创建, 但尚未调用 open() 方法。
OPENED
open() 方法已经被触发。在这个状态中,可以通过 setRequestHeader() 方法来设置请求的头部, 可以调用 send() 方法来发起请求。
HEADERS_RECEIVED
send() 方法已经被调用,响应头也已经被接收。
LOADING
响应体部分正在被接收。如果 responseType 属性是“text”或空字符串, responseText 将会在载入的过程中拥有部分响应数据。
DONE
请求操作已经完成。这意味着数据传输已经彻底完成或失败。
readystatechange
当一个文档的 readyState 属性发生更改时,readystatechange 事件会被触发。
状态主要分
1、 信息 100-101
2、成功 200-206
3、重定向 300-307
4、客户端错误 400-417
5、服务器错误 500-505
状态




第二种写法:写事件用onreadystatechange,很容易造成回调地狱,所以用Promise
Promise
语法:

补充:
abort() 方法将终止请求,如果该请求已被发出。当一个请求被终止,它的 readyState 属性将被置为0( UNSENT ),但是并不触发 readystatechange 事件。
事件:
loadstart
当程序开始加载时,loadstart 事件将被触发。也适用于 <img> 和 <video> 元素.
Progress
进度事件会被触发用来指示一个操作正在进行中。
total 总字节
error 当一个资源加载失败时会触发error事件。
load 当一个资源及其依赖资源已完成加载时,将触发load事件。
timeout 当进度由于预定时间到期而终止时,会触发timeout 事件
loadend 当一个资源加载进度停止时 (例如,在已经分派“错误”,“中止”或“加载”之后),触发loadend事件。这适用于例如 XMLHttpRequest调用, 以及<img>或<video>元素的内容。
total 总计数据
readystatechange 当一个文档的 readyState 属性发生更改时,readystatechange 事件会被触发。
浙公网安备 33010602011771号