ajax发送异步请求从入门到精通
来源:互联网 发布:淘宝销量为0敢买吗 编辑:程序博客网 时间:2024/05/19 19:42
ajax发送异步请求
一、什么是ajax
AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML),AJAX 是与服务器交换数据并更新部分网页的艺术,在不重新加载整个页面的情况下。
也就是说ajax和我们在浏览器地址栏,或者通过form表单发送请求一样,ajax也可以发送请求,但是二者有很大的不同,ajax不用刷新界面,发送异步请求。
也就是说ajax和我们在浏览器地址栏,或者通过form表单发送请求一样,ajax也可以发送请求,但是二者有很大的不同,ajax不用刷新界面,发送异步请求。
二、发送ajax get请求的步骤
① 创建异步对象
var xhr =new XMLHttpRequest();
② 设置URL
xhr.open('get',"index.php",true);// 参数1:发送请求方式// 参数2:请求的url地址// 参数3: 请求是同步还是异步。true为异步,默认为true
③ 发送请求
xhr.send();
④ ⑤ 监听事件-->处理响应
xhr.onreadystatechange = function () { // onreadystatechange 可以监听如下状态: //0:请求未初始化 1:服务器连接已经建立 2:请求已接收 3:请求处理中 4:请求已完成,且响应已就绪 //判断当前状态是否已经响应完毕,处理响应 if(xhr.readyState ==4){ // 排除访问可能出现的问题,通过服务器返回的状态码来排除,304代表访问缓存 if (xhr.status >=200 && xhr.status <300 ||xhr.status==304){ console.log("请求成功!"); } else { console.log("请求失败!"); } } }
三、处理ie 发送ajax的兼容问题
由于ie低版本浏览器中没有XMLHttpRequest对象,而是ActiveXObject对象
处理方式:
处理方式:
//处理兼容问题 var xhr; if(window.XMLHttpRequest){ xhr =new XMLHttpRequest(); } else { xhr = new ActiveXObject('Microsoft.XMLHTTP'); }
四、封装ajax的 get请求 (初级)
/*传参的格式 封装 将传入的对象,转为url 拼接的方式*/function json2Str(data) { //定义数组 var arr = []; //遍历传入的对象 for (var key in data){ //将json转为数组 arr.push(key+'='+data[key]); console.log(arr); } //将数组转为固定格式的字符串 return arr.join('&'); //取出数组中的每一项,然后用&符号连接 } function ajaxGet(url,data,success,error) { //封装get请求 var xhr; if (XMLHttpRequest){ xhr = new XMLHttpRequest(); } else { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } xhr.open("get",url+'?'+data,true); xhr.send(); xhr.onreadystatechange = function () { if (xhr.readyState ==4){ if (xhr.status >=200 && xhr.status <300 ||xhr.status ==304){ success(xhr.response); } else { error(xhr.status); } } } } ajaxGet('01-get.php',json2Str(data),function (res) { console.log(res); },function (code) { console.log("请求失败" + code); })
五、封装ajax的 get请求 (进阶)
处理ie中缓存和编码问题,
① 在ie浏览器下,如果发送一个相同url请求,它会通过本地缓存获取数据,即只有一个结果,不能获取到最新的数据
② 在ie中只能出现英文、数字、字母、下划线、ASIIC码,不能出现中文,韩文....它不会自动的进行编码,所有需要手动的编码
处理方案,对传入的参数进一步的进行处理
① 给传入的url添加一个随机因子,也可以通过加入时间戳的方式,这样不会出现相同的url请求
② 对传入的参数可能出现中文的地方进行 encodeURL编码
① 在ie浏览器下,如果发送一个相同url请求,它会通过本地缓存获取数据,即只有一个结果,不能获取到最新的数据
② 在ie中只能出现英文、数字、字母、下划线、ASIIC码,不能出现中文,韩文....它不会自动的进行编码,所有需要手动的编码
处理方案,对传入的参数进一步的进行处理
① 给传入的url添加一个随机因子,也可以通过加入时间戳的方式,这样不会出现相同的url请求
② 对传入的参数可能出现中文的地方进行 encodeURL编码
function json2Str(data) { //添加一个随机因子, 处理方式也可以是添加时间戳 data.r = Math.random(); //定义数组 var arr = []; //遍历传入的对象 for (var key in data){ //将json转为数组 arr.push(key+'='+encodeURI(data[key])); console.log(arr); } //将数组转为固定格式的字符串 return arr.join('&'); //取出数组中的每一项,然后用&符号连接 }
六、封装ajax的 post请求的步骤
//1 创建异步请求对象 var xhr; if(XMLHttpRequest){ xhr = new XMLHttpRequest(); } else { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } //2 设置url xhr.open('post','post.php',true); // 设置请求头,请求头的位置要放在open 和 send之间 xhr.setRequestHeader("Content-type",'application/x-www-form-urlencoded'); //3 发送请求 xhr.send("name=zhang&age=12"); //4 监听响应 -->处理响应数据 xhr.onreadystatechange = function () { if (xhr.readyState ==4){ if (xhr.status >=200 && xhr.status <300 || xhr.status==304){ console.log(xhr.responseText); } else { console.log(xhr.status); } } }
① 不是拼接到url中,参数必须通过send方 法传给服务器
② 设置请求头,请求头在open 和 send之间,这个位置是固定的 xhr.setRequestHeader("Content-type",'application/x-www-form-urlencoded');
② 设置请求头,请求头在open 和 send之间,这个位置是固定的 xhr.setRequestHeader("Content-type",'application/x-www-form-urlencoded');
七、封装ajax的 ajax请求(包括post 和 get)
//封装的ajax请求方法 function ajax(type,url,data,timeout,success,error) { var xhr; if(XMLHttpRequest){ xhr = new XMLHttpRequest(); } else { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } //处理参数 var str =json2Str(data); //2 设置url if (type =='get'){ xhr.open(type,url+'?'+str); xhr.send(); } else { xhr.open('post',url,true); // 设置请求头,请求头的位置要放在open 和 send之间 xhr.setRequestHeader("Content-type",'application/x-www-form-urlencoded'); //3 发送请求 xhr.send(str); } //4 监听响应 –>处理响应数据 xhr.onreadystatechange = function () { if (xhr.readyState ==4){ clearTimeout(timer); if (xhr.status >=200 && xhr.status <300 || xhr.status==304){ success(xhr.responseText); } else { error(xhr.status); } } } //超时处理 if(timeout){ var timer = setTimeout(function () { alert("请求超时"); xhr.abort();//中断请求 },timeout) } } // 参入数据包装 function json2Str(data) { //添加一个随机因子, 处理方式也可以是添加时间戳 data.r = Math.random(); //定义数组 var arr = []; //遍历传入的对象 for (var key in data){ //将json转为数组 arr.push(key+'='+encodeURI(data[key])); console.log(arr); } //将数组转为固定格式的字符串 return arr.join('&'); //取出数组中的每一项,然后用&符号连接 } var data = { "name":'zhang', "age":21 } //发送一个 ajax请求 ajax('post','01-get.php',data,2000,function (res) { console.log(res); },function (e) { console.log(e); })
此处封装两大改动:
① 将 post 和 get请求封装在一起,通过type 参数来指定类型
② 设置了请求的延时,当网络不好的情况下,不然用户一直等下去,采用的是定时器来设置的
问题:
通过这种方式,已经可以实现基本的ajax请求,但是它仍然存在很多缺陷:
① 使用这个方法的时候,我需要看封装的方法,这样才能知道要传入几个参数,而且参入参数的位置是什么,这样十分的不利于提高效率
② 容错性差,有的参数是必须传的参数,而有的参数可有可无,都没有对他们进行容错处理。
下面我们再一次封装这个方法来解决存在的这两个问题
八、封装ajax的 ajax请求(终极)
function json2str(json) { // 0.给json添加随机因子 json.t = Math.random(); // 1.将json转换为数组 var arr = []; for(var key in json){ arr.push(key+"="+encodeURIComponent(json[key])); } // 2.将数组转换为字符串返回 return arr.join("&"); } function ajax(options) { // 1.判断有没有传递option options = options || {}; // 2.判断有没有url if(!options.url){ //没传入url return ; } // 3.设置默认值 options.type = options.type || "get"; options.timeout = options.timeout || 0; options.data = options.data || {}; // 4.将参数转换为固定格式字符串 var str = json2str(options.data); // 1.创建异步对象 if(window.XMLHttpRequest){ var xhr = new XMLHttpRequest() }else{ var xhr = new ActiveXObject("Microsoft.XMLHTTP"); } if(options.type == "get"){ // 2.设置URL xhr.open(options.type, options.url+"?"+str, true); // 3.发送请求 xhr.send(); }else{ // 2.设置URL xhr.open(options.type, options.url, true); // 设置请求头 xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); // 3.发送请求 xhr.send(str); } // 4.注册事件 xhr.onreadystatechange = function () { // 5.处理返回数据 // 判断请求状态 if(xhr.readyState == 4){ clearTimeout(timer); // 判断HTTP状态 if(xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){ options.success(xhr.responseText); }else{ options.error(xhr.status); } } } // 6.超时处理 if(options.timeout){ var timer = setTimeout(function () { xhr.abort(); // 中断请求 }, options.timeout); } } //调用 ajax发送请求 ajax({ "type":"post", "url":'01-get.php', "data":{ "name":"zhangsan", "age":21 }, "timeout":0, "success":function (res) { console.log(res); }, "error":function (e) { console.log(e); } });
哈哈,花了几个小时,希望对大家有帮助!
阅读全文
0 0
- ajax发送异步请求从入门到精通
- Ajax从入门到精通
- Ajax从入门到精通
- Ajax从入门到精通
- ajax从入门到精通
- ajax从入门到精通
- Ajax从入门到精通!!!
- ajax从入门到精通
- [吐血推荐]Ajax从入门到精通!!
- ajax从入门到深入精通
- ajax从入门到深入精通
- AJAX发送异步请求
- ajax 发送异步请求
- 请求参数封装到JavaBean从入门到精通
- 从入门到精通
- JavaWeb从入门到精通(二)-http请求协议
- Ajax从入门到精通 已出版上市
- Google从入门到精通
- opencv实现图像的傅里叶变换
- 关于nginx fastcgi 配置的坑
- ajax请求,跨域问题,在Java客户端中解决
- Windows Server 2008开关机取消登录时要按Ctrl+Alt+Delete组合键登录的方法
- Java程序员们最常犯的10个错误
- ajax发送异步请求从入门到精通
- 系统移植的四大步骤
- python分词脚本 注意python对于中文的编码方式
- 无法连接到夜神模拟器解决办法
- 图解YV12和NV12以及I420色度采样格式
- 怎么样才能进入BAT公司的研发部门
- 4.9easyUI
- 仿新浪微博@功能 JS的实现 ——使用JQ At.js 和HTML5 contentEditable
- 改进的KMP