原生JS封装AJAX方法

ajax大家每天都在用,jquery库对ajax的封装也很完善、很好用,下面我们看一下它的内部原理,并手动封装一个自己的ajax库。

一、原理

原生Ajax的发送需要四步:

1) 创建Ajax对象: XMLHttpRequest

2) 设置请求参数: open(请求参数[get/post],url地址, 是否异步[true/false] )

3) 设置回调函数: onreadystateChange 用于处理返回的数据

4) 发送请求: send()

//TODO step1: 创建ajax对象var xhr = new XMLHttpRequest();//TODO step2: 设置请求参数xhr.open('get','01.php',true);//TODO step3: 设置回调xhr.onreadystatechange = function () {    //接收返回数据    console.log(xhr.responseText);//responseText 用于接收后台响应的文本}//TODO step4: 发送请求xhr.send();

登录后复制

二、封装

封装的核心思想就是把需要动态变化的部分当成参数,不变的部分就留在那里,在上面的代码中请求方式(get、post)、请求地址url、请求参数data、成功的回调success、失败回调error等,这些参数都是动态变化的;而创建Ajax对象 XMLHttprequest、事件监听onreadystatechange等是固定的,所以第一步我们要确定好封装的参数:

v url 请求地址

v data 请求数据

v type 请求类型

v success 成功回调

v error 失败回调

v beforeSend 发送前调用 return false 阻止发送

v complete ajax请求成功的回调, 无论什么时候都会执行

function ajax(option){    //用户配置option 默认配置init    var init = {        type:'get',        async:true,        url:'',        success: function () { },        error: function () { },        data:{},        beforeSend: function () {            console.log('发送前...');            return false;        }    };    //TODO step1: 合并参数    for(k in option){        init[k] = option[k];    }    //TODO step2: 参数转换    var params = '';    for(k in init.data){        params += '&'+k+'='+init.data[k];    }    var xhr = new XMLHttpRequest();    // type url    //TODO step3: 区分get和post,进行传参    var url = init.url+'?__='+new Date().getTime();    //TODO step4: 发送前    var flag = init.beforeSend();    if(!flag){        return;    }    if(init.type.toLowerCase() == 'get'){        url += params;        xhr.open(init.type,url,init.async);        xhr.send();    }else{        xhr.open(init.type,url,init.async);      xhr.setRequestHeader('content-type','application/x-www-form-urlencoded');        xhr.send(params.substr(1));    }    xhr.onreadystatechange = function () {        if(xhr.readyState == 4){            if(xhr.status == 200){                init.success(xhr.responseText);            }else{                //error                init.error();            }        }    }}

登录后复制

这里我们要注意的是get和post的传参方式位置不一样,get请求需要直接拼接在url地址后边,post请求需要在send方法里面传参,而且需要这是请求头setRequestHeader(‘content-type’,’application/x-www-form-urlencoded’),所以封装时要进行区分。

由于参数过多,用户不需要每次都传入很多参数,否则用起来会非常繁琐。所以我们采取默认参数的形式,用户不传入就是用默认值,传入就是用用户的参数。

三、使用示例

ajax({    url: 'test.json',    data:{test:123,age:456},    //type:'post',    success: function (res) {        console.log(res);    }});

登录后复制

以上就是原生JS封装AJAX方法的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2728713.html

(0)
上一篇 2025年3月7日 23:59:10
下一篇 2025年3月7日 10:06:22

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 如何利用js来控制下拉列表左右选择

    需求分析 在我们的分类管理中,我们要能够去修改我们的分类信息,当我们点击修改的时候,可以跳转到一个能编辑的页面,这里面能够修改分类的名称、分类的描述、以及分类的商品。 技术分析 ondblclick=”selectOne()”//双击事件m…

    2025年3月7日
    200
  • jQuery.Deferred() 详解

    一、什么是deferred对象? 开发网站的过程中,我们经常遇到某些耗时很长的javascript操作。其中,既有异步的操作(比如ajax读取服务器数据),也有同步的操作(比如遍历一个大型数组),它们都不是立即能得到结果的。 通常的做法是,…

    编程技术 2025年3月7日
    200
  • js不让电脑端浏览器缩放网页

    尝试过监控键盘和滚轮事件,阻止默认事件,在不同浏览器里表现不一    document.addEventListener(‘DOMContentLoaded’, function (event) {            //chrome浏…

    2025年3月7日
    200
  • js屏蔽pc端访问

    屏蔽PC端访问 //平台、设备和操作系统 var system ={ win : false, mac : false, xll : false }; //检测平台 var p = navigator.platform; system.wi…

    2025年3月7日
    200
  • 手写JS实现Promise

    promise概览 Promise是一个管理异步编程的方案,它是一个构造函数,每次使用可用new创建实例;它有三种状态:pending、fulfilled和rejected,这三种状态不会受外界影响,状态只能由pending变为fullfi…

    编程技术 2025年3月7日
    200
  • 如何使用JS控制下拉列表左右选择

    使用js控制下拉列表左右选择 需求分析 在我们的分类管理中,我们要能够去修改我们的分类信息,当我们一点修改的时候,跳转到一个可以编辑的页面,这里面能够修改分类的名称,分类的描述,以及分类的商品 推荐:《javascript基础教程》 技术分…

    2025年3月7日
    200
  • 文件上传组件WebUploader基本使用

    一、缘起 公司网站社区有图片上传功能,由于网站已经有些年头了,当时上传的时候根据客户端支不支持flash而分为两种逻辑。如果支持flash就使用SWFuploader这个上传组件进行文件上传,这种用户体验较好。如果不支持flash则使用普通…

    编程技术 2025年3月7日
    200
  • js实现页面跳转的方法

    js实现页面跳转的三种方法如下: 方法一: window.location.href=”jb51.jsp?backurl=”+window.location.href; 登录后复制 方法二: alert(“返回”);window.histo…

    2025年3月7日
    200
  • JS中数组的迭代方法:filter、reduce、every、some

    js中数组的迭代方法foreach、map、filter、reduce、every、some 在日常处理JS的数组过程中, 我们通常是采用for循环的方式来实现. 下面总结一些常用的除for循环之外的数组迭代方法. forEach (循环)…

    编程技术 2025年3月7日
    200
  • 利用js实现图片的轮播效果

    分析过程: 切换图片: nbsp;html>        Title     function changeImg() { alert(“123”) var img222 = document.getElementById(img1…

    2025年3月7日
    200

发表回复

登录后才能评论