ajax完整封装使用

1,637 阅读5分钟

ajax笔记

一. 简介 ajax是什么

ajax 异步的js和xml,通过ajax可以向浏览器发送异步请求,无刷新获取数据

xml是什么

xml可扩展标记语言,被设计用来传输和存储数据

xml和html类似,不同的是html中都是预定义标签,而xml中没有预定义标签,

全都是自定义标签,用来表示一些数据

<student>

<name>小飞</name>

<age>20</age>

<gender>男</gender>

</student>

现在已经被json取代了

用json表示:

{"name":"小飞",“age”:20,"gender":"男"}

1.1 ajax的特点:

优点:

  1. 可以无需刷新页面与服务器进行通讯
  2. 允许你根据用户事件来更新部分页面内容

缺点

  1. 没有浏览历史
  2. 存在跨域问题
  3. seo不友好

http协议:超文本传输协议,协议详细规定了浏览器和万维网服务器之间互相通信的规则

1.2GET请求和POST请求

相同点:

都是将数据提交到远程服务器

不同点:

  1. 提交数据存储的位置不同

    get请求会把数据放到url后面,post请求会把数据放到请求头中

  2. 提交数据大小限制不同

    GET请求对数据有大小限制

    POST请求对数据没有大小限制

GET/POST应用场景

GET请求用于提交非敏感数据和小数据

POST请求用于提交敏感数据和大数据

二. ajax的五个步骤

1 创建一个异步对象
2 设置请求方式和请求地址
3 发送请求
4 监听状态变化
5 处理返回的结果

实例

var btn = document.querySelector("button");
btn.addEventListener("click",function(){
    //1 创建一个异步对象
    var xmlhttp = new XMLHttpRequest();

    //2 设置请求方式和请求地址
    /*method:请求的类型;GET 或 POST
    url:文件在服务器上的位置
    async:true(异步)或 false(同步)*/
    xmlhttp.open("GET","ajax-get.php",true);

    //3 发送请求
    xmlhttp.send();

    //4 监听状态变化
    //只要异步对象发生了变化就会调用这个回调函数 使用onreadystatechange
    xmlhttp.addEventListener("readystatechange",function (){
        /*readyState 存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。
        0: 请求未初始化
        1: 服务器连接已建立
        2: 请求已接收
        3: 请求处理中
        4: 请求已完成,且响应已就绪*/
        if(xmlhttp.readyState ===4){
            //判断 当http状态码在200到300之间 或者当http状态码等于304时 请求成功
            if(xmlhttp.status>=200&&xmlhttp.status<300||xmlhttp.status===304){
                //5 处理返回的结果
                console.log("接受到服务器发送的数据");
            }else{
                console.log("没有接受到服务器数据")
            }
        }
    })
})

创建异步对象时的兼容性处理方案

//兼容性处理 兼容ie56低版本浏览器
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}

针对ie浏览器低版本不自动更新数据的处理方案

xmlhttp.open("GET",url+'?t'+(new Date().getTime()),true); 
xmlhttp.open("GET",url+'?t'+(Math.random()),true); 

关于请求超时的处理方案

if (timeout){
    timer = setInterval(function (){
        console.log("请求超时")
        xmlhttp.abort();
        clearInterval(timer);
    },timeout)
}

GET请求单独传递参数,将参数从URL中抽离出来

  1. 以对象形式传递参数
  2. 接收参数之后转换为需要的格式
  3. 在设置请求方式和请求地址时,将字符串拼接到URL中
ajax("ajax-get.php",{
    "userName":"inj",
    "pwd":"123abc"
},3000,function (xhr){
    alert(xhr.responseText);
},function (xhr){
    alert("服务器返回数据失败");
});
//封装函数 将对象形式转换为 userName=inj&pwd=123abc形式
function transtr(obj){
    obj.t = new Date().getTime();
    var arr = [];
    for (key in obj){
        //URI中不可以出现中文 如果出现了中文则需要转码
        //转码使用encodeURIComponent方法
        //URI中只可以出现数字/字母/下划线/ASCII码
        arr.push(encodeURIComponent(key)+"="+encodeURIComponent(obj[key]));
    }
    return arr.join("&");
}
var str = transtr(obj);
xmlhttp.open("GET",url+'?='+str,true); //做兼容性处理

使用POST请求和使用GET请求的不同

xmlhttp.open("POST","07-post.php",true);
//以下代码必须要放到open和send中间
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
//使用send传递参数
xmlhttp.send("userName=zs&userPwd=321");

三. 完整的ajax封装

function transdata(data) {
    //在转换之前先给data添加属性t 值为时间戳
    data.t = new Date().getTime();
    //把{'userName': 'ylf','userPwd': '123456'} 形式转换成 userName=ylf&userPwd=123456形式
    var arr = [];
    for (var key in data) {
        //使用for in遍历数组
        //将属性值:属性名形式转换为属性值=属性名形式  拼接到数组后面
        arr.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key]));
    }
    //使用join方法将数组转换为字符串形式 使用&作为分隔符
    return arr.join('&');
}

function ajax(option) {
    //定义异步对象和计时器
    var xhr, timer;
    //0 .使用自定义的transdata函数将传递过来的参数由{'userName': 'ylf','userPwd': '123456'} 形式转换成 userName=ylf&userPwd=123456形式
    var data = transdata(option.data);
    //1. 创建一个异步对象 兼容低版本ie浏览器
    if (window.XMLHttpRequest) {
        xhr = new XMLHttpRequest();
    } else {
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
    }
    //2. 设置请求方式和请求地址 
    if (option.type.toLowerCase() === "get") {
        //3. get设置请求方式 将需要传递的参数拼接到url后面 方便php读取
        xhr.open(option.type, option.url + "?" + data, true);
        //3. get发送请求
        xhr.send();
    } else {
        //3. 给post请求传参时open内容正常写 使用send方法传递参数
        xhr.open(option.type, option.url, true);
        xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        //3. post发送请求
        xhr.send(data);
    }
    //4. 监听异步对象状态变化
    xhr.onreadystatechange = function() {
        if (xhr.readyState === 4) {
            //请求完成之后停止计时器
            clearInterval(timer);
            //http状态码在200到300之间或者304时 说明网页正常响应
            if (xhr.status >= 200 && xhr.status <= 300 || xhr.status === 304) {
                //处理返回结果
                option.success(xhr);
            } else {
                //处理返回结果
                option.error(xhr);
            }
        }
    };
    //为了防止请求时间过长 我们创建一个计时器
    //判断是否传递了timeout参数
    if (option.timout) {
        timer = setInterval(function() {
            console.log("请求超时");
            //计时器到达时间之后我们停止请求 并打印请求超时
            xhr.abort();
            clearInterval(timer);
        }, option.timeout);
    };
}

使用封装好的ajax方法

ajax({
                type: "post",
                url: "04-ajax.php",
                data: {
                    "userName": "ylf",
                    "userPwd": "123123"
                },
                timeout: 3000,
                success: function(xhr) {
                    alert(xhr.responseText);
                },
                error: function(xhr) {
                    alert("请求失败");
                }
            })
        })

四. jquery中的ajax

$('#form').on('submit',function(e){
    e.preventDefault()
    $.ajax{(
    	url:'/register',
        type:'post',
        //获取表单提交的数据 serialize()
        data:$(this).serialize(),
        dataType:'json',
        success:function(data){},
        error:function(){}
    )}
})

jquery表单提交数据的内容使用serialize获取

五. xml和json

XML

XML 指可扩展标记语言(eXtensible Markup Language)。

XML 被设计用来传输和存储数据。

<?xml version:"1.0" encoding="UTF-8" ?>
<ylf>
    <name>严立飞</name>
    <age>18</age>
</ylf>

php调用xml

<?php
header("content-type:text/xml;charset=utf-8");
echo file_get_contents("info.xml");

JSON:

JavaScript Object Notation(JavaScript 对象表示法)

JSON 是存储和交换文本信息的语法,类似 XML。

JSON 比 XML 更小、更快,更易解析。

{
    "sites": [
    { "name":"菜鸟教程" , "url":"www.runoob.com" }, 
    { "name":"google" , "url":"www.google.com" }, 
    { "name":"微博" , "url":"www.weibo.com" }
    ]
}

php调用json

echo file_get_contents("08-ajax.json");

使用JSON.parse方法将json对象转换为js对象

JSON.parse(xhr.responseText)