A JAX

概念

一般情况下,前端和后台进行交互都需要页面跳转才能获取到新的数据,然后重新跳转到一个页面,将数据加载到 面上。这对资源的消耗很大,用户体验感也不是很好

所以js提供了一个不需要刷新页面就能加载后台数据的技术:AJAX

AJAX不刷新页面发送http请求,接收到服务器给客户端的数据

AJAX,全称 async javascript and XML,是一个异步执行的和后台交互的技术

例:

网易邮箱注

网易注

A JAX_数据

A JAX_ajax_02

A JAX_ajax_03A JAX_ajax_04当我们输入用户名,再输入下一项的时候,会有提示说输入的用户名是否可用,但是页面是没有刷新的

A JAX_ajax_05

A JAX_服务器_06A JAX_服务器_07

A JAX_ajax_08

A JAX_数据_09


京东的评论页


京东分

A JAX_服务器_10

A JAX_数据_11

A JAX_数据_12A JAX_数据_13点击下一页的时候,评论列表的内容会改变,但是页面是没有刷新的

A JAX_服务器_14

A JAX_数据_15A JAX_服务器_16

A JAX_ajax_17

A JAX_ajax_18


还有百度的搜索。。

这都是ajax做的

ajax最大的特点:不刷新页面发送http

感知A JAX

三级联动并获取天气信息

A JAX的优势

不需要插件支持(一般浏览器且默认开 JavaScript即可A JAX_ajax_19

用户体验极佳(不刷新页面即可获取可更新的数据A JAX_ajax_20

Web程序的性能(在传递数据方面做到按需放松,不必整体提交A JAX_ajax_21

减轻服务器和带宽的负担(将服务器的一些操作转移到客户端A JAX_服务器_22

缺点:搜索引擎的支持度不够(因为搜索引擎爬 还不能理 JS引起变化数据的内容A JAX_ajax_23

A JAX的书写

  1. 创建ajax对象,相当于要打电话了,先要安装一部电var AJAX=new XMLHttpRequest(); //这种写法在ie下是不能兼容
  2. A JAX_数据_24

    A JAX_数据_25

    A JAX_ajax_26

    A JAX_服务器_27


  3. var AJAX = new ActiveXObject("Microsoft.XMLHTTP"); //兼容ie678 var AJAX = new ActiveXObject("Msxml2.XMLHTTP"); //更低版本ie
    兼容所有浏览器的兼容写
  4. 建立一个http请求,相当于打电话的时候开始拨AJAX.open(请求方式,请求地址,true);
  5. A JAX_ajax_28

    A JAX_数据_29

    A JAX_ajax_30

    A JAX_服务器_31


  6. 参数1:请求方式:get/post
    参数2:请求地
    参数3true是异步请求,false是同步请
  7. 监听ajax请求状态的改变,绑定事件的处理程序,等待对方接起电AJAX.onreadystatechange = function(){
  8. A JAX_数据_32

    A JAX_ajax_33

    A JAX_数据_34

    A JAX_服务器_35


  9. if (AJAX.readyState == 4 && AJAX.status == 200) {
    AJAX.responseText; //从服务器返回的文本信
    }
    };
    说明:
    onreadystatechange是状态改变事件,只要ajax状态发生改变就会触发这个事A JAX_数据_36
    readyStateajax对象请求的状态A JAX_服务器_37
    0:未初始化,对象已经建立,但是还未初始化,就是还未调用send
    1:已经初始化,但是还没有调用send
    2:发送数据,send方法已经调用,但是http头未
    3:数据接收中,已经接收部分数据,因为响应以及http头不全,这是通过responseText获取少部分数 会出现错
    4:请求完成,数据接收完毕,此时可以通过responseText获取完整的相应数
    responseText是接收服务器响应的字符串数据,如果是xml数据使用responseXML来接收,如果是json 据,其实也是使用字符串形式相应回来的,使用responseText接收以后,使用JSON.parse(str)str.parseJSON()转为json对象处A JAX_ajax_38
    AJAX状态码说
  10. A JAX_ajax_39

    A JAX_数据_40

    A JAX_服务器_41

    A JAX_ajax_42


  11. 1##:请求收到,继续处
    2##:操作成功收到,分析、接
    3##:完成此请求必须进一步处
  12. 发送请求,拨出号


function createAJAX(){

A JAX_数据_43

A JAX_服务器_44

A JAX_数据_45

A JAX_ajax_46


var AJAX = null;

if(window.XMLHttpRequest){

AJAX=new XMLHttpRequest();

}else if(window.ActiveXObject){

AJAX = new ActiveXObject("Microsoft.XMLHTTP");

}else{

alert("请升级浏览器");

}

return AJAX;

}


4##:请求包含一个错误语法或不能完

A JAX_服务器_47

A JAX_ajax_48

A JAX_数据_49

A JAX_服务器_50


5##:服务器执行一个完全有效请求失

100——客户必须继续发出请

101——客户要求服务器根据请求转换HTTP协议版

200——交易成

201——提示知道新文件的URL

202——接受和处理、但处理未完

203——返回信息不确定或不完

204——请求收到,但返回信息为

205——服务器完成了请求,用户代理必须复位当前已经浏览过的文

206——服务器已经完成了部分用户的GET

300——请求的资源可在多处得

301——删除请求数

302——在其他地址发现了请求数

303——建议客户访问其他URL或访问方

304——客户端已经执行了GET,但文件未变

305——请求的资源必须从服务器指定的地址得

306——前一版本HTTP中使用的代码,现行版本中不再使

307——申明请求的资源临时性删

400——错误请求,如语法错

401——请求授权失

402——保留有效ChargeTo头响

403——请求不允

404——没有发现文件、查询或URl

405——用户在Request-Line字段定义的方法不允

406——根据用户发送的Accept拖,请求资源不可访

407——类似401,用户必须首先在代理服务器上得到授

408——客户端没有在用户指定的饿时间内完成请

409——对当前资源状态,请求不能完

410——服务器上不再有此资源且无进一步的参考地

411——服务器拒绝用户定义的Content-Length属性请

412——一个或多个请求头字段在当前请求中错

413——请求的资源大于服务器允许的大

414——请求的资源URL长于服务器允许的长

415——请求资源不支持请求项目格

416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字417——服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请

500——服务器产生内部错

501——服务器不支持请求的函

502——服务器暂时不可用,有时是为了防止发生系统过

503——服务器过载或暂停维

504——关口过载,服务器使用另一个关口或服务来响应用户,等待时间设定值较

505——服务器不支持或拒绝支请求头中指定的HTTP

ajax.send(null);

A JAX_数据_51

A JAX_ajax_52

A JAX_ajax_53

A JAX_数据_54


如果是post求的话,需要在发送请求前,设置post请求头,模拟表单来传递数据给服务端(否则获取不到send 的参数

ajax.setRequestHeader('content-type', 'application/x-www-form-urlencoded')

A JAX_ajax_55

A JAX_服务器_56

A JAX_数据_57

A JAX_数据_58


send发送请求的时候要携带请求参数(键1=1&2=2

ajax.send('name=Jack&age=18&gender=')

A JAX_服务器_59

A JAX_服务器_60

A JAX_服务器_61

A JAX_服务器_62


请求示例

get请求

html代码

<body>

A JAX_数据_63

A JAX_数据_64


<div class="box"></div>

<button id="btn">获取当前时间</button>

</body>

<script type="text/javascript">

function createAjax(){

var Ajax = null;

if(window.XMLHttpRequest){

Ajax = new XMLHttpRequest();

}else if(window.ActiveXobject){

Ajax = new ActiveXObject("Microsoft.XMLHTTP");

}else{

alert("请升级浏览器");

return false;

}

return Ajax;

}

document.querySelector("#btn").notallow=function(){

var ajax = createAjax();

ajax.open("get","ajax.php",true);

ajax.onreadystatechange = function(){

if(ajax.status == 200 && ajax.readyState == 4){

document.querySelector(".box").innerText = ajax.responseText;

}

}

ajax.send(null);

}

</script>

php代码

date_default_timezone_set("PRC");

A JAX_数据_65

A JAX_数据_66


echo date("Y-m-d H:i:s",time());

post请求

html代码

<body>

A JAX_ajax_67

A JAX_服务器_68


<style>

ul{


list-style:none;

A JAX_数据_69

A JAX_服务器_70


padding: 0;

margin: 0;

}

</style>

<h1>获取省下的市</h1>

省份名称:<input type="text" name="province">

<button id="btn">获取</button>

<ul></ul>

</body>

<script type="text/javascript">

function createAjax(){

var Ajax = null;

if(window.XMLHttpRequest){

Ajax = new XMLHttpRequest();

}else if(window.ActiveXobject){

Ajax = new ActiveXobject("Microsoft.XMLHTTP");

}else{

alert("请升级浏览器");

return false;

}

return Ajax;

}

document.querySelector("#btn").notallow=function(){

var ajax = createAjax();

ajax.open("post","postAjax.php",true); ajax.notallow=function(){

if(ajax.status == 200 && ajax.readyState == 4){

var ul = document.querySelector("ul");

var arrText = ajax.responseText;

// console.log(typeof arrText); // string

var arr = JSON.parse(arrText);

ul.innerHTML = '';

for(var i=0;i<arr.length;i++){

var li = document.createElement("li"); li.innerText = arr[i]; ul.appendChild(li);

}

}

}

ajax.setRequestHeader("content-type","application/x-www-form-urlencoded"); var pname = document.querySelector("[name='province']").value.trim();

ajax.send("province="+pname);

}

</script>

php代码

$arr = [

A JAX_数据_71

A JAX_服务器_72


"山东"=>[

"济南",

"威海",


"郓城",

A JAX_数据_73

A JAX_ajax_74


"大明湖畔"

],

"河北"=>[

"石家庄",

"衡水",

"保定",

"张家口"

]

];

$pname = $_POST["province"];

foreach($arr as $k=>$v){

if($k==$pname){

echo json_encode($v);

}

}

接收的数据

接收不同数据类型(textxmljson

接收文A JAX_服务器_75

var response = ajax.responseText;

A JAX_服务器_76

A JAX_服务器_77


接收xmlA JAX_服务器_78

var xml = ajax.responseXML;

A JAX_服务器_79

A JAX_数据_80


接收jsonA JAX_数据_81

var json = ajax.responseText;

A JAX_服务器_82

A JAX_服务器_83


var obj = JSON.parse(json);

封装通用的ajax

function Ajax(obj){

A JAX_ajax_84

A JAX_ajax_85


var ajax = null;

if(window.XMLHttpRequest){

ajax = new XMLHttpRequest();

}else if(window.ActiveXobject){

ajax = new ActiveXobject("Microsoft.XMLHTTP");

}else{

alert("请升级浏览器");

return false;

}


obj.method = obj.method || "get"; //默认发送get

A JAX_ajax_86

A JAX_ajax_87


if(!obj.url){

throw new Error("请求地址不能为空");

}

if(Object.prototype.toString.call(obj.method) != "[object String]"){

throw new Error("请求地址必须是字符串");

}else if(obj.method != "get" && obj.method != "post"){

throw new Error("请求地址必须是get或者是post");

}

if(Object.prototype.toString.call(obj.url) != "[object String]"){

throw new Error("请求地址必须是字符串");

}

if(obj.async == "undefined"){

obj.async = true;

}

if(Object.prototype.toString.call(obj.async) != "[object Boolean]"){

throw new Error("是否异步的参数必须是布尔值");

}

if(obj.data != "undefined"){

if(Object.prototype.toString.call(obj.data) == "[object String]"){

if(obj.data.indexOf("&")>=0){

if(obj.method == "get"){

obj.url += "?"+obj.data;

}else if(obj.method == "post"){

var str = obj.data;

}

}else{

throw new Error("携带的参数格式不对,字符串必须是带'='符号的键值对");

}

}else if(Object.prototype.toString.call(obj.data) == "[object Object]"){

var str = '';

for(var attr in obj.data){

str += attr + "=" + obj.data[attr];

}

}else{

throw new Error("携带的参数格式不对,需要字符串或者对象");

}

}

if(obj.success == "undefined"){

obj.success = function(res){}

}

if(obj.error == "undefined"){

obj.error = function(){}

}

if(Object.prototype.toString.call(obj.success) != "[object Function]" || Object.prototype.toString.call(obj.error) != "[object Function]"){

throw new Error("回调函数必须是函数");

}

ajax.open(obj.method,obj.url,obj.async) ajax.notallow=function(){

if(ajax.readyState == 4){

if(ajax.status>=200 && ajax.status<300){

var res;


switch(obj.dataType){

A JAX_服务器_88

A JAX_ajax_89


case undefined:

case "json":

res = JSON.parse(ajax.responseText); break;

case "string":

res = ajax.responseText; break;

case "xml":

res = ajax.responseXML; break;

default:

throw new Error("期望的数据格式参数传入错误!");

}

obj.success(res);

}else{

obj.error();

}

}

}

if(obj.method=='post'){

ajax.setRequestHeader("content-type","application/x-www-form-urlencoded");

if(obj.data != undefined){

ajax.send(str); return;

}

}

ajax.send();

}

调用:

var pname = document.querySelector("[name='province']").value.trim();

A JAX_服务器_90

A JAX_服务器_91


var response = Ajax({

data:{province:pname},

url:"postAjax.php",

method:"post",

asyn:true,

success:function(res){

var arr = JSON.parse(res);

var ul = document.querySelector("ul");

ul.innerHTML = '';

for(var i=0;i<arr.length;i++){

var li = document.createElement("li"); li.innerText = arr[i]; ul.appendChild(li);

}

}

});

postman测试


postman使用

A JAX_ajax_92

A JAX_数据_93

A JAX_服务器_94A JAX_数据_95getpost的区别

A JAX_服务器_96

A JAX_ajax_97A JAX_ajax_98

A JAX_服务器_99

A JAX_ajax_100


  1. get请求的数据展示在地址栏,posthttp请求的请求主体
  2. get请求的数据长度有限制,post没有限制,除非在服务器设置限
  3. get请求的数据格式有限制,必须是url编码的,post的数据没有限
  4. get请求不如post
  5. get请求容易有缓存,post没有缓
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6