Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种建立交互式、快速动态网页应用的技术。早期只有同步的方式,多个请求,只能顺序执行,只能等待执行。有了ajax异步技术,能够无需等待上一个请求执行完成,就能够直接发起请求。服务端返回后,ajax经过回调技术通知客户端程序,把响应的结果传递给用户事先写好的回调函数。经过在后台与服务器进行少许数据交换,Ajax 可使网页实现异步更新。这意味着能够在不从新加载整个网页的状况下,对网页进行局部更新,提高网页的效率,用户无需等待页面的刷新,嗖的一下内容就变化了。改变原有整个页面刷新,形成页面晃眼的现象。因此这项技术一出现,就获得业界的推崇。
关键字:异步、回调、局部刷新。javascript
XMLHttpRequest对象方法以下:
about() 中止当前的请求。
getAllResponseHeaders() 把HTTP请求的全部响应首部做为键/值对返回
getResponseHeader("header") 返回指定首部的串值
open("method","URL",[asyncFlag]) :创建对服务器的调用。method参数能够是GET、POST。url参数能够是相对URL或绝对URL。这个方法还包括可选的参数,是否异步(true或者false)。
send(content) 向服务器发送请求。send接收一个参数,即做为请求主体发送的数据。若是不须要经过请求主体发送数据,则必须传入null,由于这个参数对有些浏览器来讲是必须的。调用send()以后,请求就会分派到服务器。
setRequestHeader("header", "value"): 把指定首部设置为所提供的值。在设置任何首部以前必须先调用open()。设置header并和请求一块儿发送 ('post'方法必定要 )html
onreadystatechange:状态改变的事件触发器,每一个状态改变时都会触发这个事件处理器.
readyState: 请求的状态。有5个可取值:vue
responseText: 服务器的响应,返回数据的文本。
responseXML:服务器的响应,返回数据的兼容DOM的XML文档对象 ,这个对象能够解析为一个DOM对象。
status:服务器的HTTP状态码(如:404 = "文件末找到" 、200 ="成功" ,等等)
statusText: 服务器返回的状态文本信息 ,HTTP状态码的相应文本(OK或Not Found(未找到)等等。java
JSON(JavaScript Object Notation, JS 对象简谱) 起名不咋地,很是拗口,咱们就记住它是一种轻量级的数据交换格式便可。它基于 ECMAScript (js规范)的一个子集,采用彻底独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。是xml的终结者,成为主流开发方式(ajax异步请求,json返回)。
关键字:ES标准、JSON、XML
例京东网页获取一个商品信息:mysql
[{"cbf":"0","id":"J_100003717483","m":"10000.00","op":"2499.00","p":"2099.00"}]
结构特色:ios
技术栈:
javascript、jQuery、http协议(请求request、响应response)、Web中间件(tomcat)、mysql数据库,json传输。ajax
GET请求:sql
<script> //js当中排错的方式:断点(debugger),console.log,排除法 function doAjaxGet(){//这个方法运行与浏览器进程内部的主线程(main)中 debugger; //1.建立XHR对象(此对象时ajax技术应用的入口对象,发送异步请求,处理响应结果都是经过此对象实现) var xhr=new XMLHttpRequest(); //2.设置状态监听 xhr.onreadystatechange=function (){//事件监听函数(处理客户端与服务端经过过程产生的数据) if(xhr.readyState==4&&xhr.status==200){ //readyState的值0,1,2,3,4 //0,表示还未执行open方法 //1,表示已执行open方法但还未执行send方法 //2,表示已执行send方法 //3,表示客户端正在接收服务端响应的数据 //4,表示客户端已经完成响应数据的接收 //xhr.status==200表示服务端处理过程时OK的 var result=xhr.responseText;//获取服务端响应的文本数据 document.getElementById("resultId").innerHTML=result; } }; //3.创建与服务端的链接 xhr.open("GET","http://127.0.0.1/doAjaxGet",true);//true表明异步请求;false表明同步请求 //127.0.0.1 可能存在跨域问题 须要在控制层加注解@CrossOrigin //4.发送请求 xhr.send(null);//将请求交给ajax引擎 console.log("do other ....");//run main thread } </script>
POST请求:数据库
<script> function doSave(){//发送异步请求,检查name是否存在 //1.建立xhr对象(Ajax技术应用的入口) let xhr=new XMLHttpRequest(); //2.设置状态监听(不是必须的,可是假如要获取服务端响应的结果并进行处理就要进行状态监听) xhr.onreadystatechange=function (){ if (xhr.readyState==4&&xhr.status==200){ document.getElementById("result").innerHTML="<font color='red'>"+xhr.responseText+"</font>"; } }; //3.创建POST链接(POST请求传参数,不将参数拼接到url中) let name=document.forms[0].name.value;//获取表单中name对应的value属性值 let name1=document.forms[0].name.value;console.log("name",name); let url="http://localhost/doSave1"; xhr.open("POST",url,true); //post请求假如须要像服务端传递参数,则必须在open以后设置请求头 xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); //4.发送异步请求(经过send() 传参) // xhr.send("name="+name); xhr.send(`name=${name}&name1=${name1}`); // xxx?a=abc&b=bcd } </script>
js文件:编程
function doAjaxGet(url,params,callback){ debugger; //1.建立xhr对象(Ajax技术应用的入口) let xhr=new XMLHttpRequest(); //2.设置状态监听(不是必须的,可是假如要获取服务端响应的结果并进行处理就要进行状态监听) xhr.onreadystatechange=function (){ if (xhr.readyState==4&&xhr.status==200){ callback(xhr.responseText); } }; //3.创建Get链接(get请求传参数,要将参数拼接到url中) xhr.open("GET",`${url}?${params}`,true); //4.发送异步请求 xhr.send(null); }; function doAjaxPost(url,params,callback){//封装共性,提取特性(可能会常常变化的) debugger; //1.建立xhr对象(Ajax技术应用的入口) let xhr=new XMLHttpRequest(); //2.设置状态监听(不是必须的,可是假如要获取服务端响应的结果并进行处理就要进行状态监听) xhr.onreadystatechange=function (){ if (xhr.readyState==4&&xhr.status==200){ //callback是形参,接收一个函数,经过这个有参函数去回调这个函数中的具体函数体 callback(xhr.responseText);//处理响应响应数据 } }; //3.创建POST链接(POST请求传参数,不将参数拼接到url中) xhr.open("POST",url,true); //post请求假如须要像服务端传递参数,则必须在open以后设置请求头 xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); //4.发送异步请求(经过send() 传参) xhr.send(params/*{"name":'zh',"age":20}*/); };
引入js调用:
<script src="js/ajax.js"></script> <script> function doSave(){//发送异步请求,检查name是否存在 debugger; //1.定义请求url let url="http://localhost/doSave"; //2.定义请求参数 let name=document.forms[0].name.value; let params=`name=${name}`; //3.发送一部请求并处理响应结果 doAjaxPost( url, params, function (result){ document.getElementById("result").innerText=result; } //这一整个函数是一个参数,传递过去执行 ) }; function doCheck(){//发送异步请求,检查name是否存在 debugger; //1.顶以请求url let url="http://localhost/doCheck";//经过模板字符串``和${}表示拼接url //2.定义请求参数 let name=document.forms[0].name.value;//获取表单中name对应的value属性值 let params=`name=${name}`; // let params=`name=${name}&name1=${name1}`; //3.发送异步请求并处理响应结果 doAjaxGet(url,params,function (result){ document.getElementById("result").innerHTML=result; })//底层仍是借助XmlHttpRequest对象发送请求 } </script>
使用函数自调用,提供访问对象
(function (){ var ajax=function (){} ajax.prototype={ doGet:function (url,params,callback){ let xhr=new XMLHttpRequest(); xhr.onreadystatechange=function (){ if (xhr.readyState==4&&xhr.status==200){ callback(xhr.responseText); } }; xhr.open("GET",`${url}?${params}`,true); xhr.send(null); }, doPost:function(url,params,callback){ let xhr=new XMLHttpRequest(); xhr.onreadystatechange=function (){ if (xhr.readyState==4&&xhr.status==200){ callback(xhr.responseText); } }; xhr.open("POST",url,true); xhr.send(`${params}`); } } window.Ajax=new ajax() })()
调用js:
<script src="js/ajax2.0.js"></script> <script> function doSave(){//发送异步请求,检查name是否存在 debugger; //1.定义请求url let url="http://localhost/doSave"; //2.定义请求参数 let name=document.forms[0].name.value; let params=`name=${name}`; //3.发送一部请求并处理响应结果 Ajax.doPost(url, params, function (result){ document.getElementById("result").innerText=result; } //这一整个函数是一个参数,传递过去执行 ) }; function doCheck(){//发送异步请求,检查name是否存在 debugger; //1.顶以请求url let url="http://localhost/doCheck";//经过模板字符串``和${}表示拼接url //2.定义请求参数 let name=document.forms[0].name.value;//获取表单中name对应的value属性值 let params=`name=${name}`; // let params=`name=${name}&name1=${name1}`; //3.发送异步请求并处理响应结果 Ajax.doGet(url,params,function (result){ document.getElementById("result").innerHTML=result; })//底层仍是借助XmlHttpRequest对象发送请求 } </script>
<script> $(document).ready(function() { $.ajax({ type: "POST", url: "https://p.3.cn/prices/mgets", contentType: "application/json;charset=utf-8", data: { //拼接的参数 "skuIds": "J_100003717483" }, dataType: "jsonp", success: function(data) { //返回的结果 $('#rtnData').text("返回数据:" + JSON.stringify(data)); $('#itemId').text("商品编号:" + data[0].id); $('#itemPrice').html("商品价格:<span style='color:red'>" + data[0].p +"</span>"); }, error: function(data) { alert("提交失败" + JSON.stringify(data)); } }); }); </script>
<script src="js/vue.js"></script> <script src="js/axios.min.js"></script> <script type="text/javascript"> var config={ el:"#app", data:{ goodsList:[], }, mounted:function (){ this.selectAll(); }, methods:{ selectAll:function (){ var serverUrl="/goods/doGoodsUI"; axios.get(serverUrl).then(function (res) { this.vue.goodsList=res.data; }).catch(); }, deleteById:function (id){ var serverUrl="/goods/doDeleteById/"+id; axios.get(serverUrl).then(function (res) { window.alert(res.data); this.vue.selectAll(); }).catch(); }, }, }; var vue = new Vue(config); </script>
json请求返回就是json格式,而jsonp请求返回是fun(json)格式。
json字符串: { "id":"100","name":"tony","salary":"30000" }
js对象:{ "id":100,"name":"tony","salary":30000 }