什么是Ajax AJAX 是在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术。
get请求 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 oBtn.onclick = function (ev1 ) { var xmlhttp=new XMLHttpRequest(); xmlhttp.open("GET" , "04-ajax-get.php" , true ); xmlhttp.send(); xmlhttp.onreadystatechange = function (ev2 ) { if (xmlhttp.readyState === 4 ){ status为页面相应的状态码,在200 -300 之间或者304 为正常,其他为异常,如:404 if (xmlhttp.status >= 200 && xmlhttp.status < 300 || xmlhttp.status === 304 ){ console .log("接收到服务器返回的数据" ); }else { console .log("没有接收到服务器返回的数据" ); } } } }
IE浏览器兼容处理 异步对象处理 1 2 3 4 5 6 7 8 if (window .XMLHttpRequest){ xhr=new XMLHttpRequest(); } else { xhr=new ActiveXObject("Microsoft.XMLHTTP" ); }
URL处理 在IE浏览器中, 如果通过Ajax发送GET请求, 那么IE浏览器认为同一个URL只有一个结果。 可用Math.random()
生成随机字符串,或者Date().getTime()
生成时间戳,添加到URL结尾
1 2 3 4 5 xhr.open("GET" ,"05-ajax-get.txt?t=" +(new Date ().getTime()),true );
post请求 post请求与get类似,只在open和send两个方法中间添加
setRequestHeader(“Content-type”,”application/x-www-form-urlencoded”);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 oBtn.onclick = function (ev1 ) { var xhr; if (window .XMLHttpRequest) { xhr=new XMLHttpRequest(); } else { xhr=new ActiveXObject("Microsoft.XMLHTTP" ); } xhr.open("POST" ,"08-ajax-post.php" ,true ); xhr.setRequestHeader("Content-type" ,"application/x-www-form-urlencoded" ); xhr.send("userName=zs&userPwd=321" ); xhr.onreadystatechange = function (ev2 ) { if (xhr.readyState === 4 ){ if (xhr.status >= 200 && xhr.status < 300 || xhr.status === 304 ){ alert(xhr.responseText); }else { alert("请求失败" ); } } } }
Ajax的封装与优化(参考jQuery中的ajax) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 function obj2str (data ) { data = data || {}; data.t = new Date ().getTime(); var res = []; for (var key in data){ res.push(encodeURIComponent (key)+"=" +encodeURIComponent (data[key])); } return res.join("&" ); } function ajax (option ) { var str = obj2str(option.data); var xmlhttp, timer; if (window .XMLHttpRequest) { xmlhttp=new XMLHttpRequest(); } else { xmlhttp=new ActiveXObject("Microsoft.XMLHTTP" ); } if (option.type.toLowerCase() === "get" ){ xmlhttp.open(option.type, option.url+"?" +str, true ); xmlhttp.send(); }else { xmlhttp.open(option.type, option.url,true ); xmlhttp.setRequestHeader("Content-type" ,"application/x-www-form-urlencoded" ); xmlhttp.send(str); } xmlhttp.onreadystatechange = function (ev2 ) { if (xmlhttp.readyState === 4 ){ clearInterval (timer); if (xmlhttp.status >= 200 && xmlhttp.status < 300 || xmlhttp.status === 304 ){ option.success(xmlhttp); }else { option.error(xmlhttp); } } } if (option.timeout){ timer = setInterval (function ( ) { console .log("中断请求" ); xmlhttp.abort(); clearInterval (timer); }, option.timeout); } }
调用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <title > 09-ajax-jquery</title > <script src ="myAjax2.js" > </script > <script > window .onload = function (ev ) { var oBtn = document .querySelector("button" ); oBtn.onclick = function (ev1 ) { ajax({ url:"04-ajax-get.php" , data:{ "userName" :"lnj" , "userPwd" :"123456" }, timeout: 3000, type:"post" , success: function (xhr ) { alert(xhr.responseText); }, error: function (xhr ) { alert("请求失败" ); } }); } } </script > </head > <body > <button > 发送请求</button > </body > </html >
Ajax数据格式的引用 Ajax-XML 使用responseXML;
获取XML数据,再用querySelector(“标签名”).innerHTML;
获取标签中的数据。
1 2 3 4 5 6 7 8 var name = self.getAttribute("name" );var res = xhr.responseXML;var title = res.querySelector(name+">title" ).innerHTML;var des = res.querySelector(name+">des" ).innerHTML;var image = res.querySelector(name+">image" ).innerHTML;oTitle.innerHTML = title; oDes.innerHTML = des; oImg.setAttribute("src" , image);
Ajax-JOSN 先通过responseText;
获得JSON的数据,存放在变量str中。再通过JSON.parse(str)
获得json对象。通过 对象.属性 可以分别取出属性中值。json可以直接创建.json文件,或者.txt文件,只要格式符合json数据的格式就行。
注意:在低版本的IE中, 不可以使用原生的JSON.parse方法, 但是可以使用json2.js这个框架来兼容。可上GitHub下载json2.js框架,将里面的json2.js文件引入到项目中即可。
要实现从JSON字符串转换为JS对象,使用 JSON.parse() 方法:
var obj = JSON.parse(‘{“a”: “Hello”, “b”: “World”}’); //结果是 {a:’Hello’, b: ‘World’}
要实现从JS对象转换为JSON字符串,使用 JSON.stringify() 方法:
var json = JSON.stringify({a: ‘Hello’, b: ‘World’}); //结果是 ‘{“a”: “Hello”, “b”: “World”}’
1 2 3 4 5 6 7 var name = self.getAttribute("name" );var str = xhr.responseText;var obj = JSON .parse(str); var subObj = obj[name]; oTitle.innerHTML = subObj.title; oDes.innerHTML = subObj.des; oImg.setAttribute("src" , subObj.image);
微博案例 不标准json数据的转换 非标准的JSON字符串: {error: 0, id: 1, time: 1526541587, acc: 0, ref: 0}
标准的JSON字符串: {"error": "0", "id": "1", "time": "1526541587", "acc": "0", "ref": "0"}
非标准JSON字符串会报以下错误:
VM179:1 Uncaught SyntaxError: Unexpected token e in JSON at position 1
可用eval();
方法转换,但是实际开发中不提倡。 注意:在转换json数组时需要手动在数组两边添加上括号()
1 var obj = eval ("(" +msg+")" );
常见jQuery的ajax的使用格式 1 2 3 4 5 6 7 8 9 10 11 $.ajax({ type:"get" , url:"weibo.php" , data:"act=acc&id=" +obj.id, success: function (msg ) { console .log(msg); }, error: function (xhr ) { alert(xhr.status); } });
parents()方法 通过parents(“元素id或名称”)
可以获取到当前元素的父元素。
1 var obj = $(this ).parents(".info" ).get(0 ).obj;
get(0) 表示查找到的第一个元素。
jQuery插件的添加 将文件名命名为jquery.自定义名称.js
书写格式:
1 2 3 4 5 6 7 8 ;(function ($, window ) { })(jQuery,window );
注意:在html文件中也要做引入
Cookie封装 Cookie说明 cookie生命周期: 默认情况下生命周期是一次会话(浏览器被关闭) 如果通过expires=
设置了过期时间, 并且过期时间没有过期, 那么下次打开浏览器还是存在 如果通过expires=
设置了过期时间, 并且过期时间已经过期了,那么会立即删除保存的数据
cookie注意点: cookie默认不会保存任何的数据 cookie不能一次性保存多条数据, 要想保存多条数据,只能一条一条的设置 cookie有大小和个数的限制 个数限制: 20~50 大小限制: 4KB左右
cookie作用范围: 同一个浏览器的同一个路径下访问 如果在同一个浏览器中, 默认情况下下一级路径就可以访问
path 如果在同一个浏览器中, 想让上一级目录也能访问保存的cookie, 那么需要添加一个path属性才可以;
1 document .cookie = "name=zs;path=/;" ;
例如: 保存到了www.it666.com/jQuery/Ajax/路径下 , 我们想在 www.it666.com/jQuery/Ajax/13-weibo/ , 和 www.it666.com/jQuery/ 路径下也能访问
1 document .cookie = "name=zs;path=/;domain=it666.com;" ;
综合格式:
1 document .cookie = "name=zs;path=/;domain=127.0.0.1;" ;
toGMTString()方法 toGMTString() 方法可根据格林威治时间 (GMT) 把 Date 对象转换为字符串,并返回结果。 返回值:dateObject 的字符串表示。此日期会在转换为字符串之前由本地时区转换为 GMT 时区。 提示:不赞成使用此方法。请使用 toUTCString() 取而代之!
1 2 var d = new Date ()document .write (d.toGMTString())
将cookie的处理方法封装成jQuery的插件 代码:jquery.cookie.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 ;(function ($, window ) { $.extend({ addCookie: function (key, value, day, path, domain ) { var index = window .location.pathname.lastIndexOf("/" ); var currentPath = window .location.pathname.slice(0 , index); path = path || currentPath; domain = domain || document .domain; if (!day){ document .cookie = key+"=" +value+";path=" +path+";domain=" +domain+";" ; }else { var date = new Date (); date.setDate(date.getDate() + day); document .cookie = key+"=" +value+";expires=" +date.toGMTString()+";path=" +path+";domain=" +domain+";" ; } }, getCookie: function (key ) { var res = document .cookie.split(";" ); for (var i = 0 ; i < res.length; i++){ var temp = res[i].split("=" ); if (temp[0 ].trim() === key){ return temp[1 ]; } } }, delCookie: function (key, path ) { addCookie(key, getCookie(key), -1 , path); } }); })(jQuery, window );
说明:
1 2 3 var index = window .location.pathname.lastIndexOf("/" ) var currentPath = window .location.pathname.slice(0 , index); domain = domain || document .domain;
hash 设置hash的值:
1 window .location.hash = 3 ;
种hash
1 var number = window .location.hash.substring(1 ) || 1 ;
这里通过substring(1),切割掉了hash值中处在第一个#,方便实际的使用。非运算(||)同上。 在实际开发中通常使用hash来作为页码的记忆和实现页面跳转。