赞
踩
传统网站中存在的问题:
Ajax: Asynchronous JavaScript And XML,异步JavaScript和XML技术
Ajax 详解:
Ajax 应用场景:
Ajax 运行原理:
Ajax 相当于浏览器发送请求与接收响应的代理人,以实现在不影响用户浏览页面的情况下,局部更新页面数据,从而提高用户体验
Ajax 执行机制:
XMLHttpRequest 对象:
XMLHttpRequest方法:
方法 | 描述 |
---|---|
abort() | 停止当前请求 |
getAllResponseHeaders() | 将所有HTTP请求的响应首部作为键/值对返回 |
getResponseHeader(‘header’) | 返回指定响应的首部信息 |
open(‘method’,‘URL’) | 建立对服务器的调用,方法通常是post或get,URL可以绝对路径或相对路径 |
send(content) | 向服务器发送请求,参数可以是null |
setRequestHeader(‘header’, ‘value’) | 设置HTTP请求的首部信息,可以向服务器传递参数,这个方法必须在open之后调用 |
XMLHttpRequest属性:
属性 | 描述 |
---|---|
Onreadystatechange | 每次状态改变所触发事件的事件处理程序 |
readyState | 获取Ajax对象状态码: 0 = 未初始化(uninitialized) ,1 = 正在加载(loading),2 = 加载完毕(loaded), 3 = 交互(interactive), 4 = 完成(complete) |
responseText | 从服务器进程返回的数据的字符串形式 |
responseXML | 从服务器进程返回的DOM兼容的文档数据对象 |
status | 从服务器返回的数字代码,如404(未找到)或200(就绪) |
statusText | 伴随状态码的字符串信息 |
Get请求:
//1、获得XMLHttpRequest对象,即ajax对象 var oRequest = getHttpRequest(); //获取用户在文本框输入的值并进行拼接 var userName = user_name.value; var userAge = user_age.value; var getStr = "user_name="+ userName +"&user_age="+ userAge ; //2、调用open方法,传递地址及请求方式 //中间的参数为具体的地址 (该地址需要带get方式的请求参数) oRequest.open('get' , 'http://localhost:3000/get?'+getStr , true); //3、设置请求-响应状态发生改变时的回调函数 (回调处理) oRequest.onreadystatechange = function(){ if (oRequest.readyState == 4&&oRequest.status==200){ //请求-响应成功完成 var result = oRequest.responseText; //将获取到的响应信息写入到页面中相应的id为message标签里 var msgdiv = document.getElementById("message"); msgdiv.innerHTML = result; } }; //4、向服务器发送异步调用请求 oRequest.send(); //可以用onload事件来代替onreadystatechange事件 即将上面3、4步的代码进行交换 /* //3、发送请求 oRequest.send(); //4、获取服务器端响应的数据 oRequest.onload = function () { //请求-响应成功完成 var result = oRequest.responseText; //将获取到的响应信息写入到页面中相应的id为message标签里 var msgdiv = document.getElementById("message"); msgdiv.innerHTML = result; }*/
Post请求:
//1、 获得XMLHttpRequest对象,即ajax对象 var oRequest = getHttpRequest(); //获取用户在文本框输入的值并进行拼接 var userName = user_name.value; var userAge = user_age.value; var postStr = "user_name="+ userName +"&user_age="+ userAge ; //2、调用open方法,传递地址及请求方式 //中间的参数为请求地址 (该地址不需要带请求参数) oRequest.open('POST' , 'http://localhost:3000/post' , true); //3、设置请求参数格式的类型(post参数必须要设置) oRequest.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); //4、设置请求-响应状态发生改变时的回调函数 (回调处理) oRequest.onreadystatechange = function(){ if (oRequest.readyState == 4&&oRequest.status==200){ var result = oRequest.responseText; //将获取到的响应信息写入到页面中相应的id为message标签里 var msgdiv = document.getElementById("message"); msgdiv.innerHTML = result; } }; //5、向服务器发送异步调用请求 oRequest.send(postStr); // 同理,用onload事件实现 /* //4、发送请求 oRequest.send(postStr); //5、获取服务器端响应的数据 oRequest.onload = function () { //请求-响应成功完成 var result = oRequest.responseText; //将获取到的响应信息写入到页面中相应的id为message标签里 var msgdiv = document.getElementById("message"); msgdiv.innerHTML = result; }*/
获取服务器端的响应:
onreadystatechange 事件: 当 Ajax 状态码发生变化时将自动触发该事件
onload事件: 通过监听onload事件,当Ajax对象接收完响应数据后触发该事件,从而获取服务器端的数据响应 (更推荐使用onload事件)
二者的区别:
服务器端响应的数据格式:
在真实的项目中,服务器端大多数情况下会以 JSON 对象作为响应数据的格式。当客户端拿到响应数据时,要将 JSON 数据和 HTML 字符串进行拼接,然后将拼接的结果展示在页面中。
在 http 请求与响应的过程中,无论是请求参数还是响应内容,如果是对象类型,最终都会被转换为对象字符串进行传输。
JSON.parse()
方法: 将 json 字符串转换为 json对象
客户端请求参数的格式(Content-Type):
JSON.stringify()
方法: 将 json对象转换为 json字符串注意: get 请求 是不能提交 json 对象数据格式的,传统网站的表单 提交也是不支持 json 对象数据格式的。
Ajax错误处理:
请求参数要考虑的问题:
1、请求参数位置的问题:将请求参数传递到ajax函数内部, 在函数内部根据请求方式的不同将请求参数放置在不同的位置
2、请求参数格式的问题:
application/x-www-form-urlencoded:
application/json:
传递对象数据类型对于函数的调用者更加友好
在函数内部对象数据类型转换为字符串数据类型更加方便
Ajax函数封装的代码:
function ajax(options) { // 存储的是默认值 var defaults = { type: 'get', url: '', data: {}, header: { 'Content-Type': 'application/x-www-form-urlencoded' }, success: function () { }, error: function () { } }; // 使用options对象中的属性覆盖defaults对象中的属性 Object.assign(defaults, options); // 创建ajax对象 var xhr = new XMLHttpRequest(); // 拼接请求参数的变量 var params = ''; // 循环用户传递进来的对象格式参数 for (var attr in defaults.data) { // 将参数转换为字符串格式 params += attr + '=' + defaults.data[attr] + '&'; } // 将参数最后面的&截取掉 // 将截取的结果重新赋值给params变量 params = params.substr(0, params.length - 1); // 判断请求方式 if (defaults.type == 'get') { defaults.url = defaults.url + '?' + params; } // 配置ajax对象 xhr.open(defaults.type, defaults.url); // 如果请求方式为post 需要判断参数类型 if (defaults.type == 'post') { // 用户希望的向服务器端传递的请求参数的类型 var contentType = defaults.header['Content-Type'] // 设置请求参数格式的类型 xhr.setRequestHeader('Content-Type', contentType); // 判断用户希望的请求参数格式的类型 // 如果类型为json if (contentType == 'application/json') { // 向服务器端传递json数据格式的参数 xhr.send(JSON.stringify(defaults.data)) } else { // 向服务器端传递普通类型的请求参数 xhr.send(params); } } else { // get的参数类型只能为普通类型 // 发送请求 xhr.send(); } // 监听xhr对象下面的onload事件 // 当xhr对象接收完响应数据后触发 xhr.onload = function () { // 获取响应头中的数据 var contentType = xhr.getResponseHeader('Content-Type'); // 服务器端返回的数据 var responseText = xhr.responseText; // 如果响应类型中包含applicaition/json if (contentType.includes('application/json')) { // 将json字符串转换为json对象 responseText = JSON.parse(responseText) } // 当http状态码等于200的时候 if (xhr.status == 200) { // 请求成功 调用处理成功情况的函数 defaults.success(responseText, xhr); } else { // 请求失败 调用处理失败情况的函数 defaults.error(responseText, xhr); } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。