美文网首页
原生JS封装jQuery的AJAX

原生JS封装jQuery的AJAX

作者: 祈念念念 | 来源:发表于2019-01-03 13:43 被阅读0次

title: 原生JS封装jQuery的AJAX
date: 2018-10-08 11:04:15
tags: [JavaScript]
categories: JavaScript


基本功能

设置请求request

第一步 let request = new XMLHttpRequest()
第一部分:
request.open('GET', '/xxx')
第二部分:(不能设置User-Agent,会报错)
request.setRequestHeader('Content-Type', 'x-www-form-urlencoded')
第四部分:
request.send('a=0&b=1')

获取响应response

第一部分:获取HTTP状态
request.status //200
request.statusText //OK

第二部分:获取响应header
request.getAllResponseHeaders() //获取第二部分所有内容
request.getResponseHeader('Content-Type') //获取Content-Type 的内容

第四部分:
request.responseText()


封装jQuery.ajax

初始版本

封装:

window.jQuery.ajax = function(options){
    let url = options.url
    let method = options.method
    let body = options.body
    let successFn = options.successFn
    let failFn = options.failFn
    let headers = options.headers

    let request = new XMLHttpRequest()
    request.open(method, url)  //初始化请求
    for(let key in headers){
        let value = headers[key]
        request.setRequestHeader(key, value)
    }
    request.onreadystatechange = () =>{
       if(request.readyState === 4){
           if(request.status >= 200 && request.status <= 300){
               successFn.call(undefined, request.responseText)
           }else if(request.status >= 400){
              failFn.call(undefined, request)
           }
       }
    }
    request.send(body)  //发送请求
}

window.$ = window.jQuery

调用:

myButton.addEventListener('click', (e) =>{
    window.jQuery.ajax({
        url: '/xxx', 
        method: 'post',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            'allen': '23'
        } ,
        body: 'a=0&b=1', 
        successFn: (x) => {console.log(x)}, 
        failFn: (x) => {
            console.log(x)
            console.log(x.statusText)
            console.log(x.responseText)  //请求失败也可以获取第四部分
        }
     })
})

此时代码很傻,下面来优化一下。


使用ES6语法解构赋值

ES6新语法之解构赋值,见MDN文档
优化后的代码:

window.jQuery.ajax = function({url, method, body, successFn, failFn, headers}){  //解构赋值语法
    let request = new XMLHttpRequest()
    request.open(method, url)  //初始化请求
    for(let key in headers){
        let value = headers[key]
        request.setRequestHeader(key, value)
    }
    request.onreadystatechange = () =>{
       if(request.readyState === 4){
           if(request.status >= 200 && request.status <= 300){
               successFn.call(undefined, request.responseText)
           }else if(request.status >= 400){
              failFn.call(undefined, request)
           }
       }
    }
    request.send(body)  //发送请求
}

使用promise优化

因为每个程序员的回调名不一样,你不看文档根本不知道这个库的函数名是什么,所以我们可以使用该方法不设置successFn、failFn这两个函数的函数名。
返回一个promise对象,传入的两个参数resolve、reject,分别代表成功时执行的内容和失败时执行的内容。

再次优化后的代码:

window.jQuery.ajax = function({url, method, body, headers}){
    return new Promise(function(resolve, reject){   // 这行代码要记住
        let request = new XMLHttpRequest()
        request.open(method, url)  //初始化请求
        for(let key in headers){
            let value = headers[key]
            request.setRequestHeader(key, value)
        }
        request.onreadystatechange = () =>{
           if(request.readyState === 4){
               if(request.status >= 200 && request.status <= 300){
                  resolve.call(undefined, request.responseText)
               }else if(request.status >= 400){
                  reject.call(undefined, request)
               }
           }
        }
        request.send(body)  //发送请求
    })
}

调用:

 window.jQuery.ajax({
        url: '/xxx',
        method: 'post',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            'allen': '23'
        }
    }).then(
        (responseText) => {
            console.log(responseText);
            return responseText;
        },
        (request) => {
            console.log('error'); return 'error'
        }
)

then返回也是promise对象,于是就有了链式操作。

jQuery本身的ajax方法

上面是我们模仿jQuery自己封装的ajax方法,下面来看看jQuery真正的ajax方法。
举例:

$.ajax({
    url:'/xxx',
    method: 'post',
    dataType:'x-www-form-urlencoded',
    data:'a=0&b=1',
    success:(responseText)=>{console.log(responseText)},
    error:(e)=>{console.log('error')}
})

$.ajax({
    url:'/xxx',
    method: 'post',
    dataType:'json',
    data:'a=0&b=1',
}).then(
    (responseText)=>{console.log(responseText)},
    (e)=>{console.log('error')}
)

相关文章

  • html5的ajax学习(三)

    一.原生的ajax封装 原生的ajax的调用 二.jquery的ajax 2.1 jquery的语法 三. fun...

  • js 原生ajax的封装

    概念 ajax是前端常用技术,今天用原生js封装了一个ajax函数,类似于jquery库的$.ajax()函数,大...

  • ajax总结

    1. Ajax 1.1 原生JavaScript封装Ajax 1.2 jquery ajax 及其 快捷方法 $....

  • [转]JS原生Ajax代码示例

    文章来源: JS原生Ajax和jQuery的Ajax与代码示例 -- 苏凯勇往直前 JS原生的Ajax其实就是围绕...

  • 实现一个AJAX

    AJAX是什么鬼 续篇 今天我们给AJAX封装一下 之前写了篇有关用原生JS写jQuery的博客下面是相关主要代码...

  • promise封装原生ajax、jqueryAjax、axios

    原生js的ajax封装+promise 将原生js的ajax请求单独封装成一个数据请求的模块, 需要的时候直接调用...

  • 原生JS封装jQuery的AJAX

    AJAX 的所有功能 客户端的JS发起请求(浏览器上的) 服务端的JS发送响应(Node.js上的) JS操作请求...

  • 原生JS封装jQuery的AJAX

    title: 原生JS封装jQuery的AJAXdate: 2018-10-08 11:04:15tags: [J...

  • 原生js ajax网络数据请求 XMLHttprequest、A

    再学封装ajax请求 原生JS,AJAX数据封装 兼容性处理 脚本: 请求操作:

  • jQuery

    jQuery简介 jQuery其实就是原生JS封装之后的一种方法。比起原生JS的操作要方便许多,原生JS的DOM操...

网友评论

      本文标题:原生JS封装jQuery的AJAX

      本文链接:https://www.haomeiwen.com/subject/mmatrqtx.html