浅谈ajax的使用

154 阅读4分钟

通过ajax提交表单采集到的数据步骤:

  1. 监听表单点击事件
  2. 阻止按钮默认的默认提交行为submit(button默认值是submit,会导致点一下页面闪一下,consile.log会出现一下又立刻消失)
  3. 基于axios发起请求
  4. 指定请求方式,请求地址
  5. 指定请求体数据

jQuery的serialize( )简介

jQuery的serialize( )函数能够一次性获取到表单中采集的数据,它的语法格式是$('表单元素选择器').serialize();注意:使用serialize()函数快速获取表单数据时,必须为每个表单域添加name属性,否则获取不到

jQuery特点:

  • 由于该方法是jQuery封装的,使用时必须引入jQuery文件。

  • 使用serialize(),各表单域必须有 name 属性

  • 使用该方法得到的结果是一个查询字符串结果:name=value&name=value

  • 该方法能够获取隐藏域的值

  • 该方法不能得到禁用状态的值

  • 该方法不能得到文件域中的文件学习,所以不能完成文件上传

    jQuery使用案例:

    // axios({
        //     url: 'url',
        //     method: 'post',
        //     data: $('#addForm').serialize()
        // }).then(result => {
            //     console.log(result);
            //     alert(result.data.message)
            //     init()
             // })
    ​
                //axios别名用法
                axios.post("/api/接口",
                    $('#addForm').serialize()
                ).then(result => {
                    console.log(result);
                    alert(result.data.message)
                    init()
                })
    

axios的请求方法别名(简化方式)

  • axios.get(url,{params:{键:值}},config).then((参数)=>{函数体})
  • axios.delete(url,{params:{键:值}},config).then((参数)=>{函数体})
  • axios.post(url,{键:值},config).then((参数)=>{函数体})
  • axios.put(url,{键:值},config).then((参数)=>{函数体})
  • axios.patch(url,{键:值},config).then((参数)=>{函数体})

全局配置请求根路径

在URL中,协议://域名:端口对应的部分叫做“请求根路径”

全局配置请求根路径的好处:

  • 提高项目可维护性,如果路径发生改变可以减少请求方式里URL的更新

语法是axios.defaults.baseURL='http://....',通常放到root.js里然后做引入,当请求接口时就不用写根路径,URL里只要直接写'/api/接口'就行

拦截器

拦截器interceptors用来全局拦截axios的每一次请求和响应

好处:可以把每个请求中,某些重复的业务性代码封装到拦截器中,提高复用性

例如使用拦截器实现加载中loading的效果:

//添加请求拦截器
axios.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    //显示效果
    loading.style.display = 'block'
    return config;
}, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
});
​
// 添加响应拦截器
axios.interceptors.response.use(function (response) {
    // 对响应数据做点什么
    //隐藏效果
    loading.style.display = 'none'
    return response;
}, function (error) {
    // 对响应错误做点什么
    //隐藏效果
    loading.style.display = 'none'
    return Promise.reject(error);
});

FormData介绍

FormData是一个浏览器对象,用于管理表单数据。IE10+支持;FormData的作用和jQuery中的serialize作用一样,用于快速收集表单数据。它会创建FormData会对象直接提交给接口。FormData+ajax技术可以实现文件上传功能。

//FormData使用步骤
//1.获取form标签的DOM对象
let form = document.querySelector('form')
//2.实例化FormData对象,传入form参数
let fd = new FormData(form)
//3.提交数据
//注意:提交的接口必须是接受FormData数据格式的,不然会报400错误,
//如果不接受可以把它转换成别的数据格式,例如遍历它的数据到空对象里,然后
//提交该对象。
axios.post('url',fd).then(resurl=>{console.log(result);})

FormData的API:

  1. delete ('key'); --向对象中删除数据
  2. append('key', 'value'); -- 向对象中追加数据
  3. set('key', 'value'); -- 修改对象中的数据
  4. get('key');-- 获取指定key的一项数据
  5. getAll('key');-- 获取指定key的全部数据
  6. forEach();-- 遍历对象中的数据

-- 从对象中删除数据 -- 获取指定key的一项数据

-- 获取指定key的全部数据 -- 遍历对象中的数据

FormData和serialize的区别:

共同点:

  • 都需要设置表单各项的name属性。
  • 都能快速收集表单数据
  • 都能够获取到隐藏域(<input type="hidden" />)的值
  • 都不能获取禁用状态(disabled)的值

不同点:

  • FormData属于原生的代码;serialiaze是jQuery封装的方法
  • FormData可以收集文件域(<input type="file"/>)的值,而serialize不能。如果有文件上传,则必须使用FormData。
  • 得到的结果的数据类型不一样(知道即可)

文件域

文件对象:

  • js中表示一个文件,也需要用到对象,也就是文件对象

  • 文件对象,是本地文件得一个表示

  • 文件对象不需要再见创建,可以通过文件域获取得到

    • 选择一个或多个文件
    • 根据文件域,找到它的files属性。files属性是一个伪数组,里面包含一个或多个文件对象。

文件对象作用:

  • 本地预览和追加到FormData实现文件上传:

    //获取提交文件按钮元素
    let inputfile = document.querySelector('#iptFile')
    ​
    inputfile.addEventListener('change', function () {
      //获取第一个文件对象
        let fileobj = inputfile.files[0]
        //创建formdata对象实例
        let fd = new FormData()
        //创建本地文件得预览URL
        let photourl = URL.createObjectURL(fileobj)
        //使用formdata方法添加文件数据
        fd.append('avatar', fileobj)
      
      //提交formdata文件数据到服务器
        axios.post('url', fd).then(result => {
          //添加成功就把本地图片的src改为该文件的本地URL
         document.querySelector('.thumb').src = photourl
                    console.log(result);
                })
            })
    

\