关于Ajax第三天

 目标
能够知道如何使用XMLHttpREquest发起Ajax请求
能够知道如何封装自己的Ajax函数
能够使用XMLHttpREquest Level 2中提供的新特性
能够知道jQuery中如何实现文件上传与loading效果
能够知道如何使用axios发起Ajax请求

1.XMLHttpREquest的基本使用

1.1 什么XMLHttpREquest

XMLHttpREquest(简称xhr)是浏览器提供的javascript对象,通过它,
可以请求服务器上的数据资源.之前所学的jQuery中的Ajax函数
xhr对象封装出来的    

1.2使用xhr发起GET请求

步骤
1创建xhr对象

2调用xhr.open()函数

3调用xhr.send()函数

4监听xhr.onreadystatechange事件

        //1创建xhr对象
        var xhr = new XMLHttpRequest()
        // 2调用xhr.open()函数  
        xhr.open('GET', 'http://www.liulongbin.top:3006/api/getbooks')
        // 3调用xhr.send()函数
        xhr.send()
        // 4监听xhr.onreadystatechange事件
        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4 && xhr.status === 200) {
                // 获取服务器响应 readyState有四个状态 4表示成功
                console.log(xhr.readyState);
            }

        }

readystate表示你发送ajax给服务器端是否成功
4代表服务器端成功接收

status表示服务器端收到你的ajax请求如何处理。
200代表服务器端处理ajax请求并且发送给你想要的数据

1.3 了解xhr对象的readyState属性

XMLHttpREquest对象的readyState属性,用来表示当前Ajax请求所处的状态.
每个Ajax请求必然处于以下状态中的一个:

值          状态        说明
0        UNSENT        XMLHttpREquest对象已被创建 但未调用poen方法
1        OPENDED        open()方法已经被调用
2        HEADERS_RECEIVED    send()方法已经被调用,响应头也已经被接收
3        LOADING        数据接收中,此时response属性中已经包含部分数据    
4        DONE        Ajax请求完成,这意味着数据传输已经彻底完成或失败

1.4 使用xhr发起带参数的GET请求

使用xhr对象发起带参数的GET请求时,只需在调用xhr.open期间,为URL地址指定参数


xhr.open('GET', 'http://www.liulongbin.top:3006/api/getbooks'?id=1)

这种在URL地址后面拼接的参数,叫做查询字符串. 

1.5 查询字符串

1. 什么是查询字符串

定义:查询字符串(URL参数)是指在URL的末尾加上用于向服务器发送信息的字符串(变量)

格式:将英文的?放在URL的末尾,然后加上参数=值,想加上多个参数的话,使用&符号进行分解
     以这个形式,可以将想要发送给服务器的数据添加到URL中


不带参数的URL地址
http://www.liulongbin.top:3006/api/getbooks
带一个参数的URL地址
http://www.liulongbin.top:3006/api/getbooks?id=1
带两个参数的URL地址
http://www.liulongbin.top:3006/api/getbooks?id=1&bookname=西游记

2.GET请求携带参数的本质

无论使用$.ajax(),还是使用$.get(),又或者直接使用xhr对象发送GET请求,当需要携带参数的时候
本质上,都是直接将参数以查询字符串的形式,追加到URL地址的后面,发送到服务器的

1.6 URL编码与解码

1.什么是URL编码

URL地址中,只允许出现英文相关的字母、标点符号、数字。
在URL地址中不允许出现中文字符

如果URL需要包含中文这样的字符,则必须对中文字符进行编码(转义)

URL编码的原则:
使用安全的字符(没有特殊用途或者特殊意义的可以打印字符)去表示哪些不安全的字符

通俗URL编码原则:使用英文字符去表示非英文字符

例子:

http://www.liulongbin.top:3006/api/getbooks?id=1&bookname=西游记
经过URL编码之后,URL地址变成了如下格式;
http://www.liulongbin.top:3006/api/getbooks?id=1&bookname=%E8%A5%BF%E6%B8%B8%E8%AE%B0

2.如何对URL进行编码与解码

浏览器提供了URL编码与解码的API,分别是:
encodeURI()编码的函数

decodeURI()解码的函数


1.7 使用xhr发起POST请求

步骤:

1.创建xhr对象

2.调用xhr.open()函数

3.设置Content-Type属性(固定位置在在第三个)

4.调用xhr.send()函数,同时指定要发送的数据

5.监听xhr.onreadystatechange 事件
 

        // 1.创建xhr对象
        var xhr = new XMLHttpRequest()
        // 2.调用open函数
        xhr.open('POST', 'http://www.liulongbin.top:3006/api/adddbook')
        // 3.设置 Content-Type属性
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoed')
        // 4.调用send函数
        xhr.send('bookname=水浒传&author=施耐庵&publisher=上海图书出版社')
        // 5.监听事件
        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4 && xhr.status === 200) {
                console.log(xhr.responseText)
            }
        }

2.XML

1.什么是XML

XML的英文全称EXtensible Markup Language.即可扩能扩展标记语言
XML和HTML也是一种标记语言

<!DOCTYPE html>            <note>
<html lang="en">        <to>ls</to>
<head>                <from>zs</from>
<title>Document</title>        <heading>通知</heading>
</head>                <body>晚上开会</body>
</html>

    HTML                XML

2.XML和HTML的区别

XML和HTML虽然都是标记语言,但是两者之间没有任何关系

HTML被设计用来描述网页上的内容,是网页内容的载体

HTML被设计用来描述网页上的内容,是网页内容的载体

XML被设计用来传输和存储数据,是数据的载体


    传输网页内容
服务器--------------->电脑
        HTML


       传输数据
服务器<--------------->电脑
        XML

3. XML的缺点

<note>
  <to>ls</to>
  <from>zs</from>
  <heading>通知</heading>
  <body>晚上开会</body>
</note>

1.格式臃肿 和数据无关的代码多 体积大 传输效率低

2.在JS中解析XML比较麻烦

我的感觉:标签比数据还多


2.3JSON

1.什么是JSON

概念:JSON的英文全称JavaScript Object Notation,即JavaScript对象表示法。
JSON就是JavaScript对象和数组的字符串表示法,它使用文本表示一个JS对象或数组的信息
JSON的本质是字符串
     
作用:JSON是一种轻量级的文本数据交换格式,在作用上类似于XML,专门用于存储和传输数据
但是JSON比XML更小、更快、更易解析.

现状:JSON是在01年开始推广和使用的数据格式,到现在JSON成为了主流的数据交换格式

2.JSON的两种结构

JSON就是用字符串来表示Javascript的对象和数组。所有,JSON中包含对象和数组两种结构
通过两种结构的相互嵌套,可以表示各自复杂的数据结构

对象结构:在JSON中表示为{}括起来的内容.
数据结构为{key:value,key:value,....}的键值对结构。
key必须是使用英文的双引号包裹的字符串,
value的数据类型是数组、字符串、布尔值、null、数组、对象6种类型

{
  name:'zx',
  'age':20,
  'gender':'男'
  'address':undefined,
  'hobby':["吃饭","吃饭","吃饭"]
  'say':function(){

   }
}

数据结构:数据结构在JSON中表示为[]括起来的内容。数据结构为["java","JS",30,true]
数组中数据的类型可以是数组、字符串、布尔值、null、数组、对象、

3.JSON语法注意事项

1.属性名必须使用双引号包裹

2.字符串类型的值必须使用双引号包裹

3.JSON中不允许使用单引号表示字符串

4.JSON中不能写注释    

5.JSOn的最外层必须是对象或数组格式

6.不能使用undefined或函数作为JSON的值

JSON的作用:在计算机与网络之间存储和传输数据.

JSOn的本质:用字符串来表示Javascript对象数据或数组数据

4.JSON和JS对象的关系

JSON是JS对象的字符串表示法,它使用文本表示一个JS的信息,本质是一个字符串

这是一个对象
var obj={a:"Hello",b:"World"}

这是一个JSON字符串,本质是一个字符串
var json='{"a":"Hello","b":"World"}'

5.JSON和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"}'

6.序列化和反序列化

把数据对象转换为字符串的过程,叫做序列化,例如:调用JSON.stringify()函数的操作

把字符串转换为数据对象的过程,叫做反序列化,例如:调用JSON.parse()函数的操作

3.封装自己的Ajax函数

3.1 要实现的效果

function itheima(options) {
    var xhr = new XMLHttpRequest()
    var qs = resolveData(options.data)
    // 传递过来的参数对象 转换为查询字符串

    xhr.onreadystatechange = function () {
        if (xhr.readyState === 4 && xhr.status === 200) {
            var result = JSON.parse(xhr.responseText)
            // 转换成JS对象
            options.success(result)
        }
    }
}

3.2定义option参数选项

itheima()函数是自定义的Ajax函数,它接收一个配置对象作为参数,配置对象中可以配置如下属性

method 请求的类型

url    请求的URL地址

data   请求携带的数据

success 请求成功之后的回调函数

3.3处理data参数

需要把data对象,转化成查询字符串的格式,从而提交给服务器,因此提前定义resolveData函数

处理data参数
@param需要发送到服务器的数据
@returns返回拼接好的查询字符串

function itheima(options) {
    var xhr = new XMLHttpRequest()
    var qs = resolveData(options.data)
    // 传递过来的参数对象 转换为查询字符串

    xhr.onreadystatechange = function () {
        if (xhr.readyState === 4 && xhr.status === 200) {
            var result = JSON.parse(xhr.responseText)
            // 转换成JS对象
            options.success(result)
        }
    }
}

3.4 定义itheima函数

在itheima()函数中,需要创建xhr对象,并监听

function itheima(options) {
    var xhr = new XMLHttpRequest()
    var qs = resolveData(options.data)
    // 传递过来的参数对象 转换为查询字符串

    xhr.onreadystatechange = function () {
        if (xhr.readyState === 4 && xhr.status === 200) {
            var result = JSON.parse(xhr.responseText)
            // 转换成JS对象
            options.success(result)
        }
    }
}

3.5 判断请求的类型

不同的请求类型,对于xhr对象的不同操作,因此需要对请求类型进行if..else的判断

    if (options.method.toUpperCase() === 'GET') {
        // toUpperCase() 字母变大写功能 method只有两个值GET POST
        // 发起GET请求
        xhr.open(options.method, options.url + '?' + qs)
        xhr.send()
    } else if (options.method.toUpperCase() === 'POST') {
        // 发起POST请求
        xhr.open(options.method, options.url)
        xhr.setRequestHeader('Content-type', 'application/-www-form-urlencoded')
        xhr.


4.XMLHttpREquest Level2的新特性

4.1认识XMLHttpRequest Level2

1.旧版XMLHttpREquest的缺点

1.只支持文本数据的传输,无法用来读取和上传文件

2.传送和接收数据时,没有进度信息,只能提示有没有完成

2.XMLHttpREquest Level2的新功能

1.可以设置HTTP请求的时限

2.可以使用FormData对象管理表单数据

3.可以上传文件

4.可以获得数据传输的进度信息

4.2设置HTTP请求时限

Ajax操作很耗时,无法预知要花多少时间.网络慢要等很久
XMLHttpRequest对象,增加了timeout属性,可以设置HTTP请求的时限:

xhr.timeout = 3000

过了3000毫秒 就自动停止HTTP请求.timeout事件用来指定回调函数:

xhr.ontimeout = function (event){
     alert("请求超时!")
}

4.3 FormData对象管理表单数据

Ajax操作往往用来提交表单数据.为了方便表单处理 
HTML 新增一个FormData对象 可以模拟表单操作

       

 // 1.创建FormData
        var fd = new FormData()
        // 2.调用append函数,向fd中追加数据
    // 2/FormData 添加表单项
        fd.append('uname', 'zs')
        fd.append('upwd', '123456')
    //创建XHR对象
        var xhr = new XMLHttpRequest()
    // 4.指定请求类型与URL地址
        xhr.open("POST", 'http://www.liulongbin.top:3006/api/formdata')
        xhr.send(fd)
    // 5.直接提交FormData对象 与提交网页表单是一样的
        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4 && xhr.status === 200) {
                console.log(JSON.parse(xhr.responseText));
            }
        }

FormData对象获取网页表单的值

    // 获取元素
        var form = document.querySelector('#forml')
        form.addEventListener('submit', function (e) {
        //阻止表单默认提交行为 因为要做Ajax的形式提交数据
            e.preventDefault()

            //创建FormData 快速获取form里的表单数据
            var fd = new FormData(form)

            var xhr = new XMLHttpRequest()
            xhr.open("POST", 'http://www.liulongbin.top:3006/api/formdata')
            xhr.send()

            xhr.onreadystatechange = function () {
                if (xhr.readyState === 4 && xhr.status === 200) {
                    console.log(JSON.parse(xhr.responseText));
                }
            }
        })

4.4 上传文件

新版XMLHttpRequest对象,不仅可以发送文本信息,还可以上传文件

步骤:
定义UI结构

验证是否选择了文件

向FormData中追加文件

使用xhr发起上传文件的请求

监听onreadystatechange事件

1.定义UI结构

    <!-- 文件选择框 -->
    <input type="file" name="" id="file1">
    <!-- 上传文件的按钮 -->
    <button id="btnUpload">上传文件</button>
    <br />
    <!-- img标签,来显示上传成功以后的图片 -->
    <img src="" alt="" id="img" width="800">

2.验证是否选择了文件

        // 获取文件上传
        var btnUpload = document.querySelector('#btnUpload')
        // 2.为按钮绑定单击事件处理函数
        btnUpload.addEventListener('click', function () {
            // 3.获取到用户选择的文件列表
            var files = document.querySelector('#file1').files
            if (files.length <= 0) {
                return alert('请选择要上传的文件')
            }
            console.log('用户选择了待上传的文件');
        })

3.向FormData中追加文件

            var fd = new FormData()
            // 将用户选择的文件,添加到FormData中
            fd.append('avatar', files[0])

4.使用xhr发起上传文件的请求

        创建xhr对象
            var xhr = new XMLHttpRequest()
        调用open 函数,指定请求类型与URL地址 其中,请求类型必须POST
            xhr.open('POST', 'http://www.liulongbin.top:3006/api/formdata')
            xhr.send(fd)

5.监听onreadystatechange事件

      xhr.onreadystatechange = function () {
                if (xhr.readyState === 4 && xhr.status === 200) {
                    var data = JSON.parse(xhr.responseText)
                    if (data.status === 200) { //上传文件成功
                        // 将服务器返回的图片地址 设为img标签的src 属性
                        document.querySelector('#img').src = 'http://www.liulongbin.top:3006' + data.url
                    } else {
                        // 上传失败
                        console.log('图片上传失败!' + data.message)
                    }
                }
            }


4.5显示文件上传进度

新版本的XMLHttpRequest对象,可以通过监听xhr.upload.onprogress事件,来获取文件的上传进度

语法格式如下:

 // 监听文件上传的进度
  xhr.upload.onprogress = function (e) {
    //e.lengthComputable 是一个布尔值 表示当前上传的资料是否具有可计算的长度
      if (e.lengthComputable) {
    // e.loaded 已传输的字节
     // e.total 需传输的总字节
           var procentComplete = Math.ceil(e.loaded / e.total) * 100
       }
   }

1.导入需要的库

2.监听上传进度的事件

            xhr.upload.onprogress = function (e) {
                if (e.lengthComputable) {
                    var procentComplete = Math.ceil(e.loaded / e.total) * 100
                    console.log(procentComplete);
                    // 动态设置进度条
                    $('#percent').attr('style', 'width:' + procentComplete + '%;').html(procentComplete + '%')
                //attr:改变宽度属性
        }
            }

3.监听上传完成的事件

            xhr.upload.onload = function () {
                $('#percent')
        //移除上传中的样式
        .removeClass()
        //添加上传完成的类样式
        .addClass('progress-bar progress-bar-success')
            }

5.1 jQuery实现文件上传

1.定义UI结构

    <script src="js/jquery.js"></script>
    <input type="file" name="" id="file1">
    <button id="btnUpload">上传文件</button>

2.验证是否选择了文件

      $(function () {
            $('#btnUpload').on('click', function () {
                // 将jQuery对象转换成DOM对象 并获取文件列表
                $('#file1')[0].files
                // 判断是否选择了文件
                if (files.length <= 0) {
                    return alert('请选择文件后再上传!')
                }
            })
        })

3.FormData中追加文件

//向FormData中追加文件

var fd= new FormData()

fd.append('avatar',files[0])

4.使用jQuery发起上传文件的请求

$.ajax({
                    method: 'POST',
                    url: 'http://www.liulongbin.top:3006/api/upload/avatar',
                    data: fd,
           //不修改Content-Type,使用FormData默认的Content-Type值
                    processData: false,
           //不对FormData中的数据进行rl编码,而是将FormData数据原样发给服务器
                    contentType: false,
                    success: function () {
                        console.log(res);
                    }
                })

5.2jQuery实现loading效果

1.ajaxStart(callback)

Ajax请求开始时,指向ajaxStart函数,可以再ajaxStart的callback中显示loading效果
如下:

//jQuery版本1.8起 该方法只能被附加到文档中

$(document).ajaxStart(function(){
    $("#loading").show()
})

//注意:
//$(document).ajaxStart()函数会监听当前文档内所有的ajax请求


6.axios    

6.1什么是axios

Axios是专注于网络数据请求的库

相比于原生的XMLHttpRequest对象,axios简单易用

相比于jQuery,axios更加轻量化,只专注于网络数据请求

6.2axios发起GET请求

axios发起GET请求的语法
具体示例
 

axios.get('url',{params:{/*参数*/}}).then(callback)

        document.querySelector('#btn1').addEventListener('click', function () {
            var url = 'http://www.liulongbin.top:3006/api/get'
            var paramsObj = { name: 'zs', age: 2. }
            axios.get(url, { params: paramsObj }).then(function (res) {
                //res.data才是服务器的数据
                console.log(res.data);
            })
        })

6.3axios发起POST请求

axios.post('url',{params:{/*参数*/}}).then(callback)

        document.querySelector('#btn1').addEventListener('click', function () {
            //请求的URL地址
            var url = 'http://www.liulongbin.top:3006/api/post'
            //请求的参数对象
            var dataObj = { address: '北京', location: '顺义' }
            //调用axios.post()发起POST请求
            axios.post(url, dataObj).then(function (res) {
                //res.data才是服务器返回的数据
                console.log(res.data);
            })
        })

6.4直接axios使用发起请求

axios也提供了类似于jQuery中$.ajax()的函数
如下;

axios({
    method:'请求类型',
    url:'请求地址',
    data:{/*POST数据*/},
    params:{/*GET参数*/}
}).then(callback)


1.直接使用axios发起GET请求

            axios({
                method: 'GET',
                url: 'url',
                params: paramsData
            }), then(function (res) {
                console.log(res.data);
            })


2.直接使用axios发起POST请求

            axios({
                method: 'POST',
                url: 'url',
                params: paramsData
            }), then(function (res) {
                console.log(res.data);
            })


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值