XMLHttpRequest对象
概念:
Asynchronous Javascript And XML 不是一门语言 而是对现有技术的综合利用
介绍:
XMLHttpRequest属于浏览器的一种内置对象,主要是用于后台与服务器交互. 因为是异步所以可以实现对网页的部分更新 而不是刷新整个页面.在ajax编程中大量使用.
通过XMLHttpRequest构造函数用于初始化一个实例xhr对象,案例如下
let xhr = new XMLHttpRequest() //实例化一个xhr对象
XMLHttpRequest中的方法:
XMLHttpRequest.open('method',url,asnyc) :
初始化一个请求 method是请求方式 url 是请求的值 async 参数 默认是true 表示异步 如果说是同步的话 false(一般都是默认是true 不使用同步)
XMLHttpRequest.setRequestHeader():
设置http的请求的值 必须要在 open方法之后 send()之前
XMLHttpRequest.send():
发送请求。如果请求是异步的(默认),该方法将在请求发送后立即返回。
事件处理器(事件监听):
几乎所有的浏览器都支持onreadystatechange 后来也会出现一些别的方式比如 load (请求完成之后),error等事件. 设置监听的时候 绑定事件的方式除了使用on*** 进行监听之外,也可以使用addEventListener()进行监听XMLHttpRequest中的事件
事件:
xml.onreadystatechange:
XMLHttpRequest的readyState属性发生改变时触发 readystatechange事件的时候被调用。主要作用就是为了监听XMLHttpRequest对象的状态变化
readstate 属性有五个状态:
xhr.readyState = 0时,(未初始化)还没有调用send()方法
xhr.readyState = 1时,(载入)已调用send()方法,正在发送请求
xhr.readyState = 2时,(载入完成)send()方法执行完成,已经接收到全部响应内容
xhr.readyState = 3时,(交互)正在解析响应内容
xhr.readyState = 4时,(完成)响应内容解析完成,可以在客户端调用了
xml.onload:
请求完成的时候会触发的事件
xml.onloadend:
当请求结束时 无论请求成功还是失败都会被触发
xml.onerror:
请求遇到错误时触发
xml.ontimeout:
在预设时间内没有接收到响应是触发
AJAX
本质:
在http协议的基础上以异步的方式通过XMLHttpRequest对象以异步的方式与服务器进行通信
(XMLHttpRequest一般是使用异步的方式进行数据交互 ,也可以用同步的方式 只不过同步的效率比较低 所以异步就是ajax的最大的特点)
作用:
可以在页面不刷新的情况下,请求服务器 局部更新页面的数据
代码
let xhr = new XMLHttpRequest(); //设置一个XMLHttpRequest的对象,
xhr.open("post", "http://127.0.0.1:3002/getInfo"); //通过open方法设置请求方式 以及路由
xhr.setRequestHeader( //设置请求头信息 post请求需要设置content-type 不然参数不能正确传递
"Content-Type",
"application/x-www-form-urlencoded"
);
xhr.send(`username=${username}&password=${pwd}`); //发送数据
xhr.onload = function () { //给xhr对象设置好onload事件之后 this.reponse可以接收浏览器返回的信息
console.log(this.reponse); //this指的就是xhr这个对象 响应返回的是数据都在response这个属性里面
};
理解:
1.根据let xhr = new XMLHttpRequest()生成一个对象
2.通过这个对象使用open()方法 使用请求方式 以及请求的地址
xhr.open("post", "http://127.0.0.1:3002/getInfo");
3.xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded') 设置请求头
4.发送数据 xhr.send() 发送的数据有三种格式
字符串拼接的用&作为分隔符 对象 formdata的方式
5.数据发送后 通过 xhr.onload=function(){} 在函数内 通过this.reponse的方式获取到服务器返回的信息
补充:
FormData:
提供了一种表单数据的键值对的构造方式 可以通过XMLHttpRequest.send()方法发送
let formdata = new FormData(form) //form指的是表单的dom对象
可以获取表单中含有name的属性表单值 包括文件内容也会被编码包含进去 如果不含有name值 就获取不到 .
<form id="myForm" name="myForm"> // 表单
<div>
<label for="username">Enter name:</label>
<input type="text" id="username" name="username"> //username
</div>
<div>
<label for="useracc">Enter account number:</label>
<input type="text" id="useracc" name="useracc"> // useracc
</div>
<div>
<label for="userfile">Upload file:</label>
<input type="file" id="userfile" name="userfile"> //文件
</div>
<input type="submit" value="Submit!">
</form>
使用:
var myForm = document.getElementById('myForm'); //获取form的dom对象
formData = new FormData(myForm); // 使用dom对象
注意: 表单中输入的值 必须要有name的属性
formdata.append方式:
可以向formdata数据中添加上键值对的方式
formdata.append(name ,value ,filename)
name参数指的键值对的键
value对应的键值对的值
filename 传给服务器的文件名称 (一般文件上传的时候 会改变文件的命名方式 )
let formdata = new FormData()
formdata.append('username','congcong')
formdata.append('userpic',myFileInput.files[0],'chris.jpg')