Ajax 03.原生Ajax使用|FormData的使用

原生Ajax使用

XMLHttpRequest的基本使用

简称xhr

步骤:1.创建xhr对象

var xhr = new XMLHttpRequest();
  1. 调用xhr.open()函数

    如果希望设置get请求的请求参数,需要放置在open()参数2地址的最后位置

    书写格式为:地址?名=值&名=值&…

xhr.open('GET','http://www.liulongbin.top"3006/api/getbooks')
  1. 调用xhr.send()函数 ,发送请求,这一步是异步操作
xhr.send()

4.监听 xhr.onreadystatechange 事件

//readayState是xhr的属性,用来表示请求发送的状态
//取值为4代表下载完毕,确保为4才能使用响应的数据
//进一步检测:xhr.status 代表请求是否成功  200代表成功
xhr.onreadystatechange = function(){
    //4.1检测xhr.readyState取值和xhr.status取值
    if(xhr.readyState===4&&xhr.status===200){
//4.2 接收响应的数据即可
//-原生接收的响应是JSON格式,需要自己转换格式,如果是jQuery 会自动转换
        console.log(xhr.responseText);
    }
}

带有参数的get请求

  • 书写方式:
    • 在xhr.open()的参数2url后面书写参数内容
    • 名称:参数的形式成为查询字符串
    • 格式:?名=值&名=值…
      • 其中名= 值&名= 值…成为url编码格式,英文为urlencoded

URL编码与解码

  • URL地址中不允许出现中文,如果URL包含中文,中文部分会被编码转换

  • 浏览器会进行自动URL处理,无需操作

  • encodeURI()编码 decodeURI()解码

XMLHttpRequest的post请求

//1. 创建对象
var xhr = new XMLHttpRequest();
//2.调用open 
xhr.open('POST','http://www.liulongbin.top:3006/api/addbook')
//3. 设置Content -Type内容格式(固定写法)
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
//4.调用send()
xhr.send('bookname=老人与海&author=海明威');
//5.设置readystatechange事件,接收响应数据
xhr.onreadystatechange = function(){
    if(xhr.readyState===4&&xhr.status===200){
        console.log(xhr.responseText);
    }
}

get与post发送方式的区别

  • 请求参数的书写位置不同:

    • get请求方式:在xhr.open()的url后面使用?链接

    • post请求:在xhr.send()中书写

  • post请求需要设置Content-Type

JSON语法注意事项

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

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

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

  4. JSON中不能写注释

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

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

序列化与反序列化

把数据转换为字符串的过程,叫序列化,例如 JSON.stringify()

把字符串转换为数据对象过程,叫做反序列化,例如JSON.parse()

将对象数据转换为URL编码格式

//封装函数用于将对象转换为URL编码格式
function urlencoded(obj){
    var arr = [];
    for(var k in obj){
        arr.push(k+'='+obj[k])
}
    return arr.join("&")
}
//使用函数
var result = urlencoded({
    name:"jack",
    age:18,
    gender:"男"
})

XMLHttpRequest Level2 的新特性

旧版缺点:1. 只能传文本,无法用来读取和上传文件

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

XMLHttpRequest Level2 的新功能:

  1. 可以设置HTTP请求的时限
  2. 可以使用FormData对象管理表单数据(可以传文件和快速管理表单数据)
  3. 可以传文件
  4. 可以管理表单

设置HTTP请求时限

  • 设置方式:
    • 属性 xhr.timeout = 超时时间;//毫秒单位
    • 时间:xhr.ontimeout = function(){请求超时后,触发的事件};

FormData的使用

  • 作用:

    • 1.可以快速处理表单数据
    • 2.可以进行文件上传
  • 注意点:

    • 发送FormData需要使用POST请求方式
    • 不需要单独设置Content-Type
  • 使用方式:

    • 单独发送数据
//传文整个本域的文本数据
<body>
    <form id="testForm">
        <input type="text" name="username">
        <input type="password" name="password">
        <input type="submit" value="ajax提交">
    </form>
    <script>
        var testForm = document.getElementById("testForm");
        var fd = new FormData(testForm);
        fd.append("name", "张景瑜");
        fd.append("age", 20);
        // 创建xhr对象
        var xhr = new XMLHttpRequest();
        // 调用xhr.open()函数
        xhr.open("POST", 'http://www.liulongbin.top:3006/api/formdata')
        //调用xhr.send()函数,发送请求,这一步是异步操作
        xhr.send(fd);
        //监听 xhr.onreadystatechange  事件
        xhr.onreadystatechange = function () {

            if (xhr.readyState === 4 && xhr.status === 200) {
                console.log(xhr.responseText);
            }
        }
    </script>
</body>
  • 上传文件:

    • 1 准备结构(文件域)
    
    
    • 2 检测用户是否选择了文件
      • 对DOM对象形式的input[type = “file”]的files属性进行检测
        • 如果内部存储了任意的一个值,就说明选取了文件,否则就是没选
    • 3 使用FormData保存文件信息
      • 使用fd.append()添加即可
    • 4 通过ajax发送
    • 5 响应处理,展示服务端获取到的图片
<body>
    <input type="file" id="fileForm">
    <button type="button" id="btn">确认上传</button>
    <img src="" alt="" id="pic" style="width: 50px;height: 50px;">
    <script>
        var testForm = document.getElementById("fileForm");
        var btn = document.getElementById("btn")
        var pic = document.getElementById("pic")
        btn.onclick = function () {

            if (testForm.files.length == false) { alert("请上传文件"); return }
            var fd = new FormData();
            fd.append("avatar", fileForm.files[0]);
            var xhr = new XMLHttpRequest();
            // 调用xhr.open()函数
            xhr.open("POST", 'http://www.liulongbin.top:3006/api/upload/avatar');
            //调用xhr.send()函数,发送请求,这一步是异步操作
            xhr.send(fd);
            //监听 xhr.onreadystatechange  事件
            xhr.onreadystatechange = function () {

                if (xhr.readyState === 4 && xhr.status === 200) {
                    var res = JSON.parse(xhr.responseText);
                    console.log(res);
                    pic.src = 'http://www.liulongbin.top:3006' + res.url
                }
            }
        }
    </script>
</body>

jQuery使用FormData上传文件的注意点

  • 必须设置两个属性
    • contentType: false 不指定内容类型
    • processData: false 不进行数据处理

上传进度条功能

  • xhr.upload.onprogress 上传中实时触发的事件
    • 事件对象e的属性
      • e.lengthComputable 文件长度是否可计算
      • e.loaded 已上传大小
      • e.total 总大小
  • xhr.upload.onload 上传完毕时触发事件
  //上传进度监测
 xhr.upload.onprogress = function (e) {
      if (e.lengthComputable) {     
          //加载值比总需加载值的百分比
      var bili = e.loaded / e.total * 100 + "%";    document.getElementById('percent').style.width = bili;
 document.getElementById('percent').innerText = bili;} else {alert("文件不支持上传中的进度监测")}
}
   // 设置上传文件完成的事件(更改样式)
      xhr.upload.onload = function () {
       //采用bootstrap样式 document.getElementById('percent').className = 'progress-bar progress-bar-success';
      }

你可能感兴趣的:(Ajax)