前端Ajax-Day32
XMLHttpRequest:用于请求服务器上的资源。

使用XMLHttpRequest发起get请求:
① 创建xhr对象
② 调用xhr.open函数:请求类型和请求地址
③ 调用xhr.send函数
④ 监听xhr.onreadystatechange事件
// 创建xhr对象 let xhr = new XMLHttpRequest(); // 调用open函数 xhr.open('GET', 'http://www.liulongbin.top:3006/api/getbooks'); // 调用send函数 xhr.send(); // 监听onreadystatechange事件 xhr.onreadystatechange = function() { if(xhr.readyState === 4 && xhr.status === 200) { // 获取服务器响应数据 console.log(xhr.responseText); } }
xhr对象的readyState属性:表示当前ajax请求的状态

使用xhr发起带参数的请求:在open方法内的url属性里写入?和指定参数,若有多个参数则使用&进行连接。

查询字符串:

GET请求携带参数的本质:将参数以查询字符串的形式追加到url后

URL编码:使用英文字符表示非英文字符。

encodeURI进行编码,decodeURI进行解码。

使用xhr发起post请求:
① 创建xhr对象
② 调用xhr.open函数
③ 设置Content-Type属性:setRequestHeader('Content-Type','application/x-www-form-urlencoded')
④ 调用xhr.send函数,将数据以查询字符串的方式发送给服务器
⑤ 监听xhr.onreadystatechange事件
// 创建xhr对象 let xhr = new XMLHttpRequest(); // 调用open函数 xhr.open('POST', 'http://www.liulongbin.top:3006/api/addbook'); // 设置Content-Type属性 xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); // 调用send函数,指定发送数据 xhr.send('bookname=水浒传&author=施耐庵&publisher=上海图书出版社'); // 监听onreadystatechange事件 xhr.onreadystatechange = function() { if(xhr.readyState === 4 && xhr.status === 200) { console.log(xhr.responseText); } }
数据交换格式:服务器端和客户端进行数据传输和交换的格式。

XML:可扩展标记语言,与HTML类似


JSON:JavaScript对象和数组的字符串表示法。

JSON的两种结构:对象和数组
对象结构:{key:value},key必须是以双引号包裹的字符串。

数组结构:

注意事项:

JSON和对象的关系:JSON就是对象的字符串表示法。

JSON和对象的互相转化:
JSON.parse()函数:将JSON字符串转化为对象
JSON.stringify()函数:将对象转化为JSON字符串
序列化:把数据对象转化为字符串的行为,叫做序列化。调用JSON.stringify()叫做JSON的序列化。
反序列化:把字符串转化为数据对象的行为,叫做反序列化。调用JSON.parse()叫做JSON的反序列化。
封装自定义Ajax函数:
/**
* 处理data参数
* @param{data} 需要发送到服务器的数据
* @returns{string} 返回拼接好的查询字符串
*/
function resolveData(data) {
const arr = [];
for (let k in data) {
arr.push(k + '=' + data[k]);
}
return arr.join('&');
}
// 处理成功的回调函数和与服务器连接
function ajax(options) {
let xhr = new XMLHttpRequest();
// 拼接查询字符串
let qs = resolveData(options.data);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
// 服务器返回数据反序列化为对象,再利用success实现回调
let res = JSON.parse(xhr.responseText);
options.success(res);
}
}
// 判断类型
let type = options.method.toUpperCase();
if (type === 'GET') {
xhr.open(type, options.url + '?' + qs);
xhr.send();
} else if (type === 'POST') {
xhr.open(type, options.url);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send(qs);
}
}
XMLHttpRequest Level2新特性:


① 设置http请求时限:timeout属性进行设置。

② 使用FormData管理表单数据:

通过FormData直接获取表单的属性,类似jQuery中的serialize函数快速获取。

③ 上传文件:
1.定义UI结构

2.验证是否选择了文件

3.向FormData中追加文件

4.使用xhr发起上传文件的请求(必须使用post)

5.监听onreadystate事件

④ 获取数据传输的进度信息:xhr.upload.onprogress事件
先判断是否可以计算上传长度:lengthComputable
再计算进度=Math.ceil((e.load / e.total) * 100):e.loaded为已传输字节,e.total为总需的字节。

使用jQuery实现上传文件:
$('#btnUpload').on('click', () => {
const files = $('#file1')[0].files;
if (files.length <= 0) return alert('未选择文件!');
const fd = new FormData();
fd.append('avatar', files);
$.ajax({
method: 'POST',
url: 'http://www.liulongbin.top:3006/api/upload/avatar',
data: fd,
contentType: false,
processData: false,
success: res => console.log(res)
})
})
jQuery实现loading效果:ajaxStart(callback)函数


axios:网络数据请求的库

axios发起get请求:axios.get(url, {params: {data}}).then(callback)
then回调函数的data属性才是服务器端返回的数据!!

axios发起post请求:axios.post(url, {data}).then(callback)

axios类似jQuery中的$.ajax的函数:axios()
get请求参数属性名为params,post属性名为data。



同源:
如果两个页面的协议、域名和端口都相同,则两个页面同源。

同源策略:浏览器提供的安全性功能。

跨域:与同源恰好相反
出现跨域原因:浏览器的同源策略不允许非同源的URL之间进行资源交互。
浏览器允许发起跨域请求,但是跨域请求回的数据会被浏览器的同源策略所拦截!


JSONP:解决浏览器的跨域访问问题。通过script标签的src属性,请求跨域的数据接口。

script标签的src属性,以查询字符串的方式告诉服务器调用的函数和参数,默认是get请求。


jQuery中的JSONP:如果使用$.ajax函数发起JSONP请求,必须指定dataType为jsonp。查询字符串中不需要加callback,jQuery会自动生成。

使用jsonp属性修改发送到服务端的参数名称,jsonpCallback属性修改回调函数名称。
节流和防抖的区别:
防抖:如果事件被频繁触发,防抖只能保证最后一次事件生效,前面的N次触发都会失效(回城被打断,只会从头开始继续回城)
节流:如果事件被频繁触发,节流只会减少事件触发的频率,节流会有选择性的执行一部分事件(技能在cd,继续使用需要等待)

浙公网安备 33010602011771号