Ajax,即异步的JavaScript和XML(Asynchronous JavaScript and XML),是一种无需从新加载整个网页的状况下,更新部分网页的技术ajax
通常包括三步数据库
须要注意的是,Ajax须要与服务器通讯,所以须要用服务器启动,而不是直接在浏览器中打开页面编程
这里使用Wampserver64来访问,下载地址(提取码:gixc)和使用说明(提取码:u3lw)见连接json
XMLHttpRequest是Ajax的核心,一种支持异步请求的技术跨域
能够向服务器提出请求并处理响应,不阻塞用户,在页面加载后进行页面的局部更新数组
这一对象由于在不一样浏览器中支持方式不一样,因此须要考虑兼容性浏览器
1 //Ajax第一步,建立XMLHttpRequest对象 2 //封装通用的xhr,兼容各个版本 3 function createXHR(){ 4 //判断浏览器是否将XMLHttpRequest做为本地对象实现,针对firefox、opera等 5 if(typeof XMLHttpRequest != 'undefined'){ 6 return new XMLHttpRequest(); 7 } 8 else if(typeof ActiveXObject != 'undefined'){ 9 //将全部可能出现的ActiveXObject版本放在一个数组里 10 var xhrArr = ['Microsoft.XMLHTTP','MSXML2.XMLHTTP.6.0','MSXML2.XMLHTTP.5.0','MSXML2.XMLHTTP.4.0','MSXML2.XMLHTTP.3.0','MSXML2.XMLHTTP.2.0']; 11 //遍历建立XMLHttpRequest对象 12 var len = xhrArr.length; 13 var xhr; 14 for(var i=0;i<len;i++){ 15 try{ 16 //建立XMLHttpRequest对象 17 xhr = new ActiveXObject(xhrArr[i]); 18 //遇到支持的版本号就退出 19 break; 20 } 21 //若是当前循环的版本号不支持,捕获错误可是没有操做 22 catch(ex){ 23 24 } 25 } 26 return xhr; 27 } 28 else{ 29 throw new Error('No XHR object available!'); 30 } 31 }
也能够不用考虑过多的版本号,直接分IE和非IE来建立XMLHttpRequest缓存
1 var xmlhttp; 2 if(window.XMLHttpRequest){ 3 //针对IE7+、Firefox、Chrome、Opera、Safari 4 xmlhttp = new XMLHttpRequest(); 5 } 6 else{ 7 //针对IE六、IE5 8 xmlhttp = new ActiveXObject('Microsoft.XMLHTTP'); 9 }
用XMLHttpRequest对象的open方法来建立(注意是建立而不是发送)安全
该方法初始化请求,准备发送同一个域中使用相同协议和端口的URL发送请求,不然会由于安全缘由报错服务器
其中包括三个参数
分get和post两种
get速度快,大部分状况下均可使用
post在如下三种状况下是get没法替代的:
文件在服务器上位置,open方法中惟一必须传入的参数
这里的文件能够为任何类型的/服务器脚本文件
一个布尔值,默认为true(异步),也可设置false(同步)
用函数监测XMLHttpRequest的readystatechange属性变化状况
其中readyState属性值为4时,表示异步响应内容解析完成,能够在客户端调用
status属性值在[200,300)时,表示异步调用(交易)成功
status属性值为304时,表示请求资源没有被修改,能够用浏览器缓存(即以前用过异步相同内容并且成功了,该内容在缓存中)
1 //响应XMLHttpRequest对象状态变化的函数 2 //onreadystatechange在readystatechange属性变化时触发 3 xhr.onreadystatechange = function(){ 4 //异步响应内容解析完成,能够在客户端调用 5 if(xhr.readyState === 4){ 6 //异步调用(交易)成功,或者请求资源没有被修改,能够用浏览器缓存(即以前用过异步并且成功了) 7 if((xhr.status >=200 && xhr.status<300) || xhr.status === 304){ 8 //返回服务器数据 9 } 10 } 11 }
用send方法向服务器发送请求
其中当建立请求(open方法)的请求方法为post时,才可传入字符串/对象,不然值只可传入null
在post前,须要先用setRequestHeader方法添加HTTP头(固定写法,以下),而后才能发送数据
1 xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded');
在收到响应后,XMLHttpRequest的四个属性会被填充,能够从responseText/responseXML来得到从服务器进程返回的数据
其中responseText是字符串形式(使用较多),responseXML是DOM兼容的文档数据对象
获取服务器端返回的数据后,能够把该数据添加到当前HTML中
添加的方法包括DOM操做、字符串拼接等
即JavaScript对象表示法(JavaScript object notation),一种数据交换的文本格式,并非编程语言
JSON能够支持JavaScript中的基本类型、数组、对象
基本类型中,字符串必须用双引号表示,数值必须用十进制表示,不能用NaN和Infinity,不支持undefined
对象中,键名必须放在双引号中,对象的末尾没有分号,且同一个对象中不可出现两个同名属性
数组/对象中最后一个成员后不可加逗号
把JSON字符串转化成对象
语法为JSON.parse(JSON字符串)
JavaScript中的eval方法与其相似,可是也能够执行不符合JSON格式的代码,所以尽量少用
把一个值转成符合JSON格式的字符串,并能够被JSON.parse()方法还原
语法为JSON.stringify(原生JavaScript值)
主要使用的是$.ajax()方法
内部包括五个参数:请求地址、请求方式、同步异步、数据格式以及请求成功的回调
1 $.ajax({ 2 url:"./server/slider.json", 3 type:"post", 4 async:true, 5 dataType:"json", 6 success:function(imgData){ 7 jQurenderDataToDom(imgData); 8 //这一步是请求成功以后的渲染数据的函数 9 } 10 })
从一个域名网页请求另外一个域名资源,也就是只要协议、域名、端口三者其一有不一样,就是跨域
其中域名、协议、端口均相同时,被称做同源
跨域资源共享(CORS)、JSONP(经常使用)、修改document.domain、使用window.name
即填充式JSON(JSON with padding),一种跨域解决方案
JSONP包括回调函数(响应到来时页面中调用的函数,由用户提供)和数据(传入回调函数中的JSON数据,由服务器返回)
JSONP是利用了在页面上能够引入不一样域上的js脚本文件来实现的
1 //封装JSONP 2 function getJSONP(url,callback){ 3 if(!url){ 4 return; 5 } 6 //声明数组用来随机生成函数名 7 var a = ['a','b','c','d','e','f','g','h','i','j'], 8 r1 = Math.floor(Math.random()*a.length), 9 r2 = Math.floor(Math.random()*a.length), 10 r3 = Math.floor(Math.random()*a.length), 11 name = 'getJSONP'+a[r1]+a[r2]+a[r3],//这里不用getJSONP打头也能够 12 cbname = 'getJSONP.'+name;//这里是未来服务端传回的getJSONP的属性值,必须以getJSONP打头 13 //判断url中是否含有? 14 if(url.indexOf('?') === -1){ 15 url += '?jsonp=' + cbname; 16 } 17 else{//在url地址的?参数后面再加一个新参数,所以用&隔开 18 url += '&jsonp' + cbname; 19 } 20 //动态建立script标签 21 var script = document.createElement('script'); 22 //定义被脚本文件执行的回调函数(最核心部分) 23 getJSONP[name] = function(data){ 24 try{ 25 callback && callback(); 26 } 27 catch(e){ 28 } 29 finally{ 30 //不管是否执行成功,删除getJSONP的属性以及回调函数,以释放内存空间 31 delete getJSONP[name]; 32 script.parentNode.removeChild(script); 33 } 34 } 35 //定义script的src,把这个新的script添加到head标签的最后 36 script.src = url; 37 document.getElementsByTagName('head')[0].appendChild(script); 38 }