全面讲解原生js的AJAX请求以及写法封装

原生ajax写法-原生ajax请求-原生ajax实例


AJAX

下面是来自百度百科的理解:

Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技术。

说话的方式简单点:就是Browser和Server之间通信的一种方式,发送以及请求数据的一种方式。

在AJAX出现之前:用户每次与server进行一次交互都需要进入一个新的页面。例如用户点击下一页按钮,会直接跳转页面,用户明明只需要一部分的数据,确需要重新向server请求整个页面的数据,那么很多数据是重复的相同的,造成了不必要的带宽浪费,对server压力也大。

AJAX 出现之后:用户点击下一页按钮,发起AJAX请求,只需要获取第二页的数据,然后修改页面局部的视图,OVER。其最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。

AJAX优点:

1.无刷新更新数据。
无需重载整个页面,按需请求部分数据,节约带宽,减少服务器压力。
2.异步与服务器通信。
不会打断用户操作,有些用户只需要首屏的搜索功能,就不必等到页面全部加载完成。
提升浏览器渲染体验,用户会在server响应数据之前看到整个页面的大概框架以及结构。

其实目的也是为了体验好!体验好!体验好!

AJAX缺点:

1.浏览器的收藏功能在某些情况使用不便(用户想收藏第二页数据时)。浏览器的后退功能在某些情况使用不便(用户退回第一页时)。
2.AJAX的安全问题
AJAX相当于Browser和Server之间的一条通道,通过观察server的响应数据结构,在某些情况下回暴露出一些server的逻辑。黑客也可以模拟用户向Server发起请求,出现了诸如跨站点脚步攻击、SQL注入攻击等

Ajax原生js实现

最简单的实现方式:

var xhr = new XMLHttpRequest();
xhr.open('请求方式GET或者POST或者其他', 请求地址url, 是否开启异步async);
xhr.onreadystatechange = function() {
    // readyState == 4说明请求已完成
    if (xhr.readyState == 4 && xhr.status == 200) {
        console.log(xhr.responseText);
    }
}
if (method == 'POST') {
    //给指定的HTTP请求头赋值
    xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
}
xhr.send()

目前已经有很多的工具(类库实现了AJAX的封装),只会用当然不行,我们需要详细的理解它的属性内容

为了钱

XMLHttpRequest的属性

  • onreadystatechange:值为一个function,当readyState属性改变时会调用它

  • readyState:Http请求过程中的状态值,具体情况如下

状态值 描述
0 初始化状态。XMLHttpRequest 对象已创建或已被 abort() 方法重置。
1 open() 方法已调用,但是 send() 方法未调用。请求还没有被发送。
2 Send() 方法已调用,HTTP 请求已发送到 Web 服务器。未接收到响应。
3 所有响应头部都已经接收到。响应体开始接收但未完成。
4 HTTP 响应已经完全接收。
  • responseText:目前为止收到的响应体(不包括头部),或者如果还没有接收到数据的话,就是空字符串。

如果 readyState 小于 3,这个属性就是一个空字符串。当 readyState 为 3,这个属性返回目前已经接收的响应部分。如果 readyState 为 4,这个属性保存了完整的响应体。
如果响应包含了为响应体指定字符编码的头部,就使用该编码。否则,假定使用 Unicode UTF-8。

  • responseXML
    对请求的响应,解析为 XML 并作为 Document 对象返回。

  • status
    由服务器返回的 HTTP 状态代码,HTTP状态码整理。当 readyState 小于 3 的时候读取这一属性会导致一个异常。

  • statusText
    这个属性用名称而不是数字指定了请求的 HTTP 的状态代码。也就是说,当状态为 200 的时候它是 "OK",当状态为 404 的时候它是 "Not Found"。和 status 属性一样,当 readyState 小于 3 的时候读取这一属性会导致一个异常。

XMLHttpRequest的方法

  • open(method,url,async)
    初始化一个请求。
    注意: 在一个已经激活的request下(已经调用open()方法的request)再次调用这个方法相当于调用了abort()方法。
参数 描述
method HTTP请求方式:"GET", "POST", "PUT", "DELETE"等
url 请求路径
async 是否异步请求。值为布尔值,默认为true,如果值为false,则send()方法不会返回任何东西,直到接受到了服务器的返回数据。
  • abort()
    取消当前响应,关闭连接并且结束任何未决的网络活动。
    这个方法把 XMLHttpRequest 对象重置为 readyState 为 0 的状态,并且取消所有未决的网络活动。例如,如果请求用了太长时间,而且响应不再必要的时候,可以调用这个方法。

  • send(string)
    发送 HTTP 请求。只有POST方式才传参,参数类型为字符串。GET方式参数跟在url上

  • setRequestHeader(header,value)
    向一个打开但未发送的请求设置或添加一个 HTTP 请求(设置请求头)。
    注意:POST请求一般情况下需要设置请求头

request对象.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
参数 描述
header 设置的请求头名称
value 对应的请求头的值
  • getAllResponseHeaders()
    把 HTTP 响应头部作为未解析的字符串返回。
    如果 readyState 小于 3,这个方法返回 null。否则,它返回服务器发送的所有 HTTP 响应的头部。头部作为单个的字符串返回,一行一个头部。每行用换行符 "\r\n" 隔开。

  • getResponseHeader(name)
    返回指定的 HTTP 响应头部的值。其参数是要返回的 HTTP 响应头部的名称。可以使用任何大小写来制定这个头部名字,和响应头部的比较是不区分大小写的。
    该方法的返回值是指定的 HTTP 响应头部的值,如果没有接收到这个头部或者 readyState 小于 3 则为空字符串。如果接收到多个有指定名称的头部,这个头部的值被连接起来并返回,使用逗号和空格分隔开各个头部的值。

试着封装一下

以下是简化版,仅概述原理
使用闭包来防止变量污染

const $ = (function() {
    var name = 'jquery';
    return {
        ajax: function({
            type,
            url,
            data,
            isAsync,
            success
        }) {
            if (!url) {
                console.error('请输入请求地址')
                return;
            }

            var xhr = new XMLHttpRequest();

            // 处理data对象
            var query = [],
            queryData;
            for (var key in data) {
                // 默认encodeURIComponent一下
                query.push(encodeURIComponent(key) + '=' + encodeURIComponent(data[key]));
            }
            queryData = query.join('&');

            if (type == 'GET') {
                // get方式参数要跟在url上
                url = url + '?' + queryData
            }

            // 默认使用GET,默认异步
            xhr.open(type || 'GET', url, isAsync || true);
            xhr.onreadystatechange = function() {
                if (xhr.readyState == 4 && xhr.status == 200) {
                    // 有传入success回调就执行
                    success && success(xhr.responseText);
                }
            }

            if (type == 'POST') {
                //给指定的HTTP请求头赋值
                xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
                // 数组转成字符串
                xhr.send(queryData)
            } else {
                xhr.send()
            }

        }
    }
})();

//类似jquery的使用方式
$.ajax({
    type: 'POST',
    url: 'https://web-api.juejin.im/gptzllpbev',
    data: {
        name: '嘻嘻'
    },
    success: function(res) {
        console.log(res);
    }
})

参考文章:

w3school
AJAX入门

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,265评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,078评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,852评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,408评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,445评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,772评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,921评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,688评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,130评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,467评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,617评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,276评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,882评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,740评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,967评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,315评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,486评论 2 348

推荐阅读更多精彩内容

  •   2005 年,Jesse James Garrett 发表了一篇在线文章,题为“Ajax: A new App...
    霜天晓阅读 885评论 0 1
  • Ajax的基本概念及使用 同步&异步 同步:必须等待前面的任务完成,才能继续后面的任务; 异步:不受当前主要任务的...
    magic_pill阅读 1,942评论 0 5
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,449评论 1 45
  • Ajax 是什么? Ajax 即“Asynchronous Javascript And XML”(异步 Java...
    饥人谷_Leonardo阅读 772评论 0 0
  • 文—启闻宇 原创 然而,一切都和汉斯以前参加过的派对一样,豪宅豪车美女美酒上等好烟,这让他感到失望。 这时,汉斯身...
    弃籽阅读 476评论 0 9