Ajax基础知识及封装

什么是Ajax

AJAX 是在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术。

get请求

oBtn.onclick = function (ev1) {
        // 1.创建一个异步对象
        var xmlhttp=new XMLHttpRequest();
        // 2.设置请求方式和请求地址
        /*
        method:请求的类型;GET 或 POST
        url:文件在服务器上的位置,也可为txt文件
        async:true(异步)或 false(同步)
        */
        xmlhttp.open("GET", "04-ajax-get.php", true);
        // 3.发送请求
        xmlhttp.send();
        // 4.监听状态的变化
        xmlhttp.onreadystatechange = function (ev2) {
            /*
			这里为监听请求的状态,一共有四个状态,只需要通过最后一个,就可以判断请求是否成功
            0: 请求未初始化
            1: 服务器连接已建立
            2: 请求已接收
            3: 请求处理中
            4: 请求已完成,且响应已就绪
            */
            if(xmlhttp.readyState === 4){
                // 判断是否请求成功
					status为页面相应的状态码,在200-300之间或者304为正常,其他为异常,如:404
                if(xmlhttp.status >= 200 && xmlhttp.status < 300 ||
                    xmlhttp.status === 304){
                    // 5.处理返回的结果
                    console.log("接收到服务器返回的数据");
                }else{
                    console.log("没有接收到服务器返回的数据");
                }

            }
        }
    }

IE浏览器兼容处理

异步对象处理

	if (window.XMLHttpRequest)
	{// code for IE7+, Firefox, Chrome, Opera, Safari
	    xhr=new XMLHttpRequest();
	}
	else
	{// code for IE6, IE5
	    xhr=new ActiveXObject("Microsoft.XMLHTTP");
	}

URL处理

在IE浏览器中, 如果通过Ajax发送GET请求, 那么IE浏览器认为同一个URL只有一个结果。
可用Math.random()生成随机字符串,或者Date().getTime()生成时间戳,添加到URL结尾

   /*
	console.log(Math.random());
    console.log(new Date().getTime());
    */
    xhr.open("GET","05-ajax-get.txt?t="+(new Date().getTime()),true);

post请求

post请求与get类似,只在open和send两个方法中间添加

setRequestHeader(“Content-type”,“application/x-www-form-urlencoded”);

    oBtn.onclick = function (ev1) {
        var xhr;
        if (window.XMLHttpRequest)
        {// code for IE7+, Firefox, Chrome, Opera, Safari
            xhr=new XMLHttpRequest();
        }
        else
        {// code for IE6, IE5
            xhr=new ActiveXObject("Microsoft.XMLHTTP");
        }
        // var xhr = new XMLHttpRequest();
        xhr.open("POST","08-ajax-post.php",true);
        // 注意点: 以下代码必须放到open和send之间
        xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
        xhr.send("userName=zs&userPwd=321");
        xhr.onreadystatechange = function (ev2) {
            if(xhr.readyState === 4){
                if(xhr.status >= 200 && xhr.status < 300 ||
                xhr.status === 304){
                    // alert("请求成功");
                    alert(xhr.responseText);
                }else{
                    alert("请求失败");
                }
            }
        }
}

Ajax的封装与优化(参考jQuery中的ajax)

function obj2str(data) {
    /*
    {
        "userName":"jly",
        "userPwd":"123456",
        "t":"3712i9471329876498132"
    }
    */
    data = data || {}; // 如果没有传参, 为了添加随机因子,必须自己创建一个对象
    data.t = new Date().getTime();	// 添加时间戳属性
    var res = [];
    for(var key in data){
        // 在URL中是不可以出现中文的, 如果出现了中文需要转码
        // 可以调用encodeURIComponent方法转码
        // URL中只可以出现字母/数字/下划线/ASCII码
        res.push(encodeURIComponent(key)+"="+encodeURIComponent(data[key])); // [userName=lnj, userPwd=123456];
    }
    return res.join("&"); // userName=lnj&userPwd=123456
}
function ajax(option) {
    // 0.将对象转换为字符串
    var str = obj2str(option.data); // key=value&key=value;
    // 1.创建一个异步对象
    var xmlhttp, timer;
    if (window.XMLHttpRequest)
    {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    else
    {// code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    // 2.设置请求方式和请求地址
    /*
    method:请求的类型;GET 或 POST
    url:文件在服务器上的位置
    async:true(异步)或 false(同步)
    */
    if(option.type.toLowerCase() === "get"){
        xmlhttp.open(option.type, option.url+"?"+str, true);
        // 3.发送请求
        xmlhttp.send();
    }else{
        xmlhttp.open(option.type, option.url,true);
        // 注意点: 以下代码必须放到open和send之间
        xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
        xmlhttp.send(str);
    }

    // 4.监听状态的变化
    xmlhttp.onreadystatechange = function (ev2) {
        /*
        0: 请求未初始化
        1: 服务器连接已建立
        2: 请求已接收
        3: 请求处理中
        4: 请求已完成,且响应已就绪
        */
        if(xmlhttp.readyState === 4){
            clearInterval(timer);
            // 判断是否请求成功
            if(xmlhttp.status >= 200 && xmlhttp.status < 300 ||
                xmlhttp.status === 304){
                // 5.处理返回的结果
                // console.log("接收到服务器返回的数据");
                option.success(xmlhttp);
            }else{
                // console.log("没有接收到服务器返回的数据");
                option.error(xmlhttp);
            }
        }
    }
    // 判断外界是否传入了超时时间
    if(option.timeout){
        timer = setInterval(function () {
            console.log("中断请求");
            xmlhttp.abort();
            clearInterval(timer);
        }, option.timeout);
    }
}

调用:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>09-ajax-jquery</title>
    <!--<script src="js/jquery-1.12.4.js"></script>-->
    <script src="myAjax2.js"></script>
    <script>
        window.onload = function (ev) {

            var oBtn = document.querySelector("button");
            oBtn.onclick = function (ev1) {
                // $.ajax({
                //     url: "09-ajax-jquery.php",
                //     type: "get",
                //     data: "userName=lnj&userPwd=654321",
                //     success: function(msg){
                //         alert(msg );
                //     },
                //     error: function (xhr) {
                //         alert(xhr.status);
                //     }
                // });

                ajax({
                    url:"04-ajax-get.php",
                    data:{
                        "userName":"lnj",
                        "userPwd":"123456"
                    },
                    timeout: 3000,
                    type:"post",
                    success: function (xhr) {
                        alert(xhr.responseText);
                    },
                    error: function (xhr) {
                        alert("请求失败");
                    }
                });
            }
        }
    </script>
</head>
<body>
<button>发送请求</button>
</body>
</html>

Ajax数据格式的引用

Ajax-XML

使用responseXML;获取XML数据,再用querySelector(“标签名”).innerHTML;获取标签中的数据。

        var name = self.getAttribute("name");//得到所点击的按钮的名称属性
        var res = xhr.responseXML;
        var title = res.querySelector(name+">title").innerHTML;
        var des = res.querySelector(name+">des").innerHTML;
        var image = res.querySelector(name+">image").innerHTML;
        oTitle.innerHTML = title;//设置界面元素的值
        oDes.innerHTML = des;
        oImg.setAttribute("src", image); //设置图片路径

Ajax-JOSN

先通过responseText;获得JSON的数据,存放在变量str中。再通过JSON.parse(str)获得json对象。通过 对象.属性 可以分别取出属性中值。json可以直接创建.json文件,或者.txt文件,只要格式符合json数据的格式就行。

注意:在低版本的IE中, 不可以使用原生的JSON.parse方法, 但是可以使用json2.js这个框架来兼容。可上GitHub下载json2.js框架,将里面的json2.js文件引入到项目中即可。

  • 要实现从JSON字符串转换为JS对象,使用 JSON.parse() 方法:

var obj = JSON.parse(’{“a”: “Hello”, “b”: “World”}’);   //结果是 {a:‘Hello’, b: ‘World’}

  • 要实现从JS对象转换为JSON字符串,使用 JSON.stringify() 方法:

var json = JSON.stringify({a: ‘Hello’, b: ‘World’});   //结果是 ‘{“a”: “Hello”, “b”: “World”}’

        var name = self.getAttribute("name");//得到所点击的按钮的名称属性
        var str = xhr.responseText;
        var obj = JSON.parse(str); //获得json对象,可看成一个数组
        var subObj = obj[name];	//通过数组的下标找到下一级的数据
        oTitle.innerHTML = subObj.title;	//设置界面元素的值
        oDes.innerHTML = subObj.des;
        oImg.setAttribute("src", subObj.image);//设置图片路径

微博案例

不标准json数据的转换

非标准的JSON字符串: {error: 0, id: 1, time: 1526541587, acc: 0, ref: 0}
标准的JSON字符串: {"error": "0", "id": "1", "time": "1526541587", "acc": "0", "ref": "0"}
非标准JSON字符串会报以下错误:

VM179:1 Uncaught SyntaxError: Unexpected token e in JSON at position 1

可用eval();方法转换,但是实际开发中不提倡。
注意:在转换json数组时需要手动在数组两边添加上括号()

var obj = eval("("+msg+")");

常见jQuery的ajax的使用格式

        $.ajax({
            type:"get",
            url:"weibo.php",
            data:"act=acc&id="+obj.id,
            success: function (msg) {
                console.log(msg);
            },
            error: function (xhr) {
                alert(xhr.status);
            }
        });

parents()方法

通过parents(“元素id或名称”)可以获取到当前元素的父元素。

var obj = $(this).parents(".info").get(0).obj;

get(0)   表示查找到的第一个元素。

jQuery插件的添加

将文件名命名为jquery.自定义名称.js
书写格式:

;(function ($, window){
    // 这里写自定义的函数
    /**
     * 可通过$.extend添加方法,
     * 要将自定义的方法格式改为     函数名:function(){},
     * 注意:除最后一个,每个自定义的函数后都要加逗号,
     */
})(jQuery,window);

jQuery的插件添加

注意:在html文件中也要做引入

Cookie封装

Cookie说明

cookie生命周期:

默认情况下生命周期是一次会话(浏览器被关闭)
如果通过expires=设置了过期时间, 并且过期时间没有过期, 那么下次打开浏览器还是存在
如果通过expires=设置了过期时间, 并且过期时间已经过期了,那么会立即删除保存的数据

cookie注意点:

cookie默认不会保存任何的数据
cookie不能一次性保存多条数据, 要想保存多条数据,只能一条一条的设置
cookie有大小和个数的限制
个数限制: 20~50
大小限制: 4KB左右

cookie作用范围:

同一个浏览器的同一个路径下访问
如果在同一个浏览器中, 默认情况下下一级路径就可以访问

  • path
    如果在同一个浏览器中, 想让上一级目录也能访问保存的cookie, 那么需要添加一个path属性才可以;
document.cookie = "name=zs;path=/;";

例如:
保存到了www.it666.com/jQuery/Ajax/路径下,
我们想在 www.it666.com/jQuery/Ajax/13-weibo/,
和 www.it666.com/jQuery/ 路径下也能访问

  • domain
    例如:
    我们在www.it666.com下面保存了一个cookie,
    那么我们在edu.it666.com中是无法访问的
    如果想在edu.it666.com中也能访问, 那么我们需要再添加一个domain属性才可以;
document.cookie = "name=zs;path=/;domain=it666.com;";

综合格式:

document.cookie = "name=zs;path=/;domain=127.0.0.1;";

toGMTString()方法

toGMTString() 方法可根据格林威治时间 (GMT) 把 Date 对象转换为字符串,并返回结果。
返回值:dateObject 的字符串表示。此日期会在转换为字符串之前由本地时区转换为 GMT 时区。
提示:不赞成使用此方法。请使用 toUTCString() 取而代之!

var d = new Date()
document.write (d.toGMTString())

将cookie的处理方法封装成jQuery的插件

代码:jquery.cookie.js

;(function($, window){
  $.extend({
    //添加cookie方法:
    addCookie: function (key, value, day, path, domain){
      // 1.处理默认保存路径
      var index = window.location.pathname.lastIndexOf("/");
      var currentPath = window.location.pathname.slice(0, index);
      path = path || currentPath;
      // 2.处理默认保存的domain
      domain = domain || document.domain;
      // 3.处理默认的过期时间
      if(!day){
        document.cookie = key+"="+value+";path="+path+";domain="+domain+";";
      }else{
        var date = new Date();
        date.setDate(date.getDate() + day);
        document.cookie = key+"="+value+";expires="+date.toGMTString()+";path="+path+";domain="+domain+";";
      }
    },

    //获取cookie方法:
    getCookie: function (key){
      var res = document.cookie.split(";");
      for(var i = 0; i < res.length; i++){
        var temp = res[i].split("=");
        if(temp[0].trim() === key){
          return temp[1];
        }
      }
    },

    //删除cookie方法:
    delCookie: function (key, path){
      addCookie(key, getCookie(key), -1, path);
    }
  });
})(jQuery, window);

说明:

var index = window.location.pathname.lastIndexOf("/")   //通过“/”分割除去最后的文件名
var currentPath = window.location.pathname.slice(0, index);     //切割字符串
domain = domain || document.domain;     //非运算,如果有传入domain,即第一个为真,后面就不运行

hash

设置hash的值:

window.location.hash = 3;

种hash

var number = window.location.hash.substring(1) || 1;

这里通过substring(1),切割掉了hash值中处在第一个#,方便实际的使用。非运算(||)同上。
在实际开发中通常使用hash来作为页码的记忆和实现页面跳转。



我自己博客的链接:https://rainying.com/2019/12/06/Ajax基础知识及封装/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值