Ajax04

本文介绍了同步与异步的概念,重点讲解了formData对象在获取表单数据,特别是图片文件方面的应用。通过原生和jQuery发起formData请求的方式,并展示了图片预览的实现方法。此外,还探讨了跨页面数据传递的两种策略:利用localStorage和URL参数。


前言

本章学习内容:同步与异步的区别,原生fromData对象(获取表单数据),图片预览功能,跨页面传递参数。


1. 同步与异步

同步代码:并不是同时执行某些diamante,而是有顺序的执行
代码会严格按照从上到下的顺序执行,只有当前面的代码执行完毕之后,后面的代码才会执行

异步代码:如果程序中有耗时操作,并不会堵塞整个程序的执行
程序会将耗时操作放到异步线程池中去执行,主线程依旧可以正常运行其他同步代码
ajax请求就是异步代码,定时器

ajax请求默认就是异步的代码,但并不代表异步就永远是好的
如果当前有两个ajax请求,A请求的返回结果是B请求的参数

        //  如何将ajax请求改成同步代码: async: false
        console.log('这是一个寂寞的天');
        $.ajax(
            {   async: false,
                type:'get',
                url:'https://autumnfish.cn/api/cover/random',
                success: function (backData) {
                    console.log(backData);
                }
            }
        )
        console.log('下着有些伤心的雨');
    })

2. formData

前面学过快速获得表单域中的数据可以用.serialize()方法,但是这个方法只适合于获取字符串数据,无法获取图片数据

利用formData数据结构来获取表单数据(可以获得图片文件)
利用 new FormData(原生的form对象)

    <form action="">
      姓名: <input type="text" name="heroname" id="" /><br /><br />
      技能: <input type="text" name="heroskill" id="" /><br /><br />
      头像: <input type="file" name="heroicon" id="" /><br /><br />
      <button id="btn" type="submit">点我完成新增</button>
    </form>
    js------------------------
            // 1. 快速获得表单域中的数据
            // serialize(): 获得字符串参数数据 key=value&key=value
            let data = $('form').serialize();
            // 但是: 以上方法只能获得字符串数据,无法获得图片数据
            // console.log(data);

            // 2. 利用formData数据结构来获得表单数据
            // 利用new FormData(原生的form对象)
            let fd = new FormData(document.querySelector('form'));

            // 此时所有的表单数据,都存在fd对象中
            // 但是fd对象是无法直接打印显示的
            // console.log(fd);

            // 3. 利用get方法来获取内部
            console.log(fd.get('heroname'));
            console.log(fd.get('heroskill'));
            console.log(fd.get('heroicon'));

注意: new formData(),必须传入一个原生的form对象;formData实例化的fd对象会得到表单所有的数据,但是需要用.get(属性名)来查看。
有图片就用formData,只有字符串就用serialize。

2.1 原生代码发起formDate请求

   <form action="">
        姓名: <input type="text" name="name" id="" /><br /><br />
        技能: <input type="text" name="skill" id="" /><br /><br />
        头像: <input type="file" name="icon" id="" /><br /><br />
        <!-- 表单控件的name值,必须与服务器接口的参数一致 -->
        <button id="btn" type="submit">点我完成新增</button>
      </form>
      //js------------------------------
    document.querySelector('#btn').addEventListener('click',function (e) {
        e = window.event || e;
        e.preventDefault();

        // 1. 利用formData获得表单数据
        let fd = new FormData(document.querySelector('form'));

        // console.log(fd.get('name'));
        // console.log(fd.get('skill'));
        // console.log(fd.get('icon'));

        // 2. 发起原生ajax请求
        let xhr = new XMLHttpRequest();
        xhr.open('post','http://localhost:4399/hero/add');

        // 注意: 一般的原生post请求,必须要设置请求头,指定数据编码方式
        // 但是,如果是利用formData编码的数据,则不需要设置请求头
        // xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
        
        xhr.onload = function () {
            console.log(xhr.response);
        }

        // 3. 直接利用send方法传入fd结构数据即可
        xhr.send(fd);

    })

注意:表单中的name值,必须和服务器接口的参数一致
原生请求如果是传入的参数是一个formData对象,不用设置请求头!

2.2 利用jQ发起formData请求

    $(function(){
        $('#btn').on('click',function (e) {
            e.preventDefault();

            let fd = new FormData(document.querySelector('form'));

            $.ajax(
                {
                    type:'post',
                    url:'http://localhost:4399/hero/add',
                    data: fd,// 直接传入fd对象即可
                    // 如果使用jQ方式发起formData数据请求,则需要关闭两个默认属性:false
                    contentType: false,
                    processData: false,
                    success: function (backData) {
                        console.log(backData);
                    }
                }
            )
        })
    })

jQ的post请求已经在内部设置好了请求头,所以需要将两个参数设为false;contentType: false, processData: false。

3. 图片预览

原理:监听上传文件按钮(input type=file)的change事件,发生改变时

  1. 通过原生属性files来获取文件数据
  2. 利用URL对象转成url路径
  3. 把路径传给img的src属性
    $(function(){
        // 实现图片上传预览功能
        // 1. 监听上传按钮是否发生改变: change
        $('input').on('change', function () {
            // 2. 获得当前上传的图片文件数据
            // 通过原生属性files来获得文件数据
            let picData = this.files[0];

            // 3. 将获得图片文件数据转换url路径
            // 利用URL对象来转成路径
            let picUrl = URL.createObjectURL(picData);

            // 4. 将路径设置img标签即可
            $('img').attr('src', picUrl);
        })
    })

4. 跨页面传递数据

需求:把页面a中的参数num=100传递到页面b

  1. 利用localStorage对象,a页面把通过localStorage.setItem(‘num’,100)把数据存到本地,b页面再通过localStorage.getItem(‘num’)取数据。
  2. 利用跳转路径传递参数,a页面在跳转路径的后面拼接?加要传的参数(num=100),跳转到b页面后 b页面的url后面也会有这个参数,通过window.location.href拿到url,再处理一下得到参数。
  3. 和方法二一样是用路径传递,只不过利用window.location.search可以直接得到?+后面的参数
    // 1.利用localStorage对象获取本地数据
    // console.log(localStorage.getItem('id'));

    // 2. 利用跳转路径传递参数
    // 此时需要的参数已经在url末端,那么要如何获得
    // let url = window.location.href;// 当前的路径

    // // 利用字符串方法,截取需要的字段
    // let index = url.indexOf('?');// 获得?此时的下标

    // // 利用字符串的截取方法
    // let res = url.substr(index+1);

    // // 利用字符串转数组的方法
    // let arr = res.split('=');
    // console.log(arr[1]);

    // 3. 利用location对象中的属性直接获得参数部分
    console.log(window.location.search);
    console.log(window.location.search.split('=')[1]);

复习一下:window.location.href获取完整的url地址,window.location.search获得?+后面的参数部分
indexOf(需要查找下标的字符串),substr(开始切割下标,切的个数),split(‘分隔符’)会转成数组。

案例-英雄检索
用户信息管理

总结

今日学习:formData对象获取form表单数据(含图片文件)
formData做参数发起ajax请求,(切记:原生post不用设置请求头,jQ post 需要把contentType和processData两个属性设为false)
同异步了解
跨页面传递参数,(路径传参)
图片预览:监听change事件–获取文件(this.files[0])–文件转换成url(URL.createObjectURL(文件))–替换img的src=转好的url

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值