Ajax

Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创立交互式、疾速动静网页利用的技术。晚期只有同步的形式,多个申请,只能程序执行,只能期待执行。有了ajax异步技术,能够无需期待上一个申请执行实现,就能够间接发动申请。服务端返回后,ajax通过回调技术告诉客户端程序,把响应的后果传递给用户当时写好的回调函数。通过在后盾与服务器进行大量数据交换,Ajax 能够使网页实现异步更新。这意味着能够在不从新加载整个网页的状况下,对网页进行部分更新,晋升网页的效率,用户无需期待页面的刷新,嗖的一下内容就变动了。扭转原有整个页面刷新,造成页面晃眼的景象。所以这项技术一呈现,就失去业界的推崇。
关键字:异步、回调、部分刷新。

XHR对象:

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'办法肯定要 )

XMLHttpRequest 对象属性形容:

onreadystatechange:状态扭转的事件触发器,每个状态扭转时都会触发这个事件处理器.
readyState:  申请的状态。有5个可取值:

  • 0: 未初始化。尚未调用open()办法。
  • 1:启动。曾经调用open()办法,但尚未调用send()办法。
  • 2:发送。曾经调用send()办法,readyState下面的值就是HEADERS_RECEIVED,曾经发送并且曾经接管到响应头和响应状态了
  • 3:接管。曾经接管到局部相应数据。
  • 4:实现。曾经接管到全副相应数据,而且曾经能够在客户端应用了。

responseText: 服务器的响应,返回数据的文本。
responseXML:服务器的响应,返回数据的兼容DOM的XML文档对象 ,这个对象能够解析为一个DOM对象。
status:服务器的HTTP状态码(如:404 = "文件末找到" 、200 ="胜利" ,等等)
statusText: 服务器返回的状态文本信息 ,HTTP状态码的相应文本(OK或Not Found(未找到)等等。

Json

JSON(JavaScript Object Notation, JS 对象简谱) 起名不咋地,十分拗口,咱们就记住它是一种轻量级的数据交换格局即可。它基于 ECMAScript (js标准)的一个子集,采纳齐全独立于编程语言的文本格式来存储和示意数据。简洁和清晰的层次结构使得 JSON 成为现实的数据交换语言。是xml的终结者,成为支流开发方式(ajax异步申请,json返回)。
关键字:ES规范、JSON、XML
例京东网页获取一个商品信息:

[{"cbf":"0","id":"J_100003717483","m":"10000.00","op":"2499.00","p":"2099.00"}]

构造特点:

  • 数组[]
  • 一条记录{},多条记录用逗号隔开 {},{},最初一条没有逗号
  • 键值对 "p":"2099.00",kv用双引号括,多个用逗号隔开,最初一个没有逗号

网页实现部分刷新


技术栈:
javascript、jQuery、http协定(申请request、响应response)、Web中间件(tomcat)、mysql数据库,json传输。

实现Ajax

原生js实现Ajax

  • 创立XHR对象
  • 设置状态监听
  • 建设与服务端的连贯
  • 发送申请

GET申请:

<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即可

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>

模仿jQuery封装

应用函数自调用,提供拜访对象

(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>

jQuery实现Ajax

<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>

Vue实现Ajax

<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和jsonp的区别

json申请返回就是json格局,而jsonp申请返回是fun(json)格局。

json和js对象的区别

json字符串: { "id":"100","name":"tony","salary":"30000" }
js对象:{ "id":100,"name":"tony","salary":30000 }

  • 含意不同,json是一种数据格式,js示意类的实例
  • 传输:json用于跨平台、跨网络传输,速度快;js不能传输
  • 展示:json键值对形式,值是字符串不能是对象办法函数;js值不肯定加双引号,值能够是对象、函数、字符串等
  • 转换:JSON.parse(jsonStr) JSON曾经作为浏览器内置对象,eval(json);JSON.stringify(obj)