Ajax原理

客户端和服务器通信过程

  • 请求:客户端通过网络去找服务器要资源的过程
  • 响应:服务器把资源通过网络发送给客户端的过程

URL地址(统一资源定位符)

用来表示服务器上每一个资源的确切访问路径

一个url地址是由:协议,主机号,端口号,资源的存放路径组成

ajax技术特点: 

   在网页不刷新的情况下,请求数据

   作用:局部刷新

/ ajax技术特点:网页不刷新的情况 请求数据
        // 作用:局部刷新
        // 内置对象 XMLHttpRequest:负责发送ajax请求
        // 1.创建xhr对象
        let xhr = new XMLHttpRequest()
        //  2.设置请求方法method和地址url
        xhr.open('get', 'https://autumnfish.cn/api/joke')
        // 3.发送请求
        xhr.send()
        // 4.注册响应事件
        // 这个事情什么时候执行:服务器响应数据给我们就会执行
        // 时间长短取决于:网速(带宽,服务器,数据大小,天气因素等)
        xhr.onload = function () {
            console.log(xhr.responseText)
        }

ajax工作流程(原理)

  • 创建xhr对象
  • 设置请求方法和地址(如果是post 方法要设置请求头)
  • 发送请求
  • 注册响应事件
// 1.创建xhr对象
        let xhr = new XMLHttpRequest()
        //  2.设置请求方法method和地址url
        xhr.open('get', 'https://autumnfish.cn/api/joke')
        // 3.发送请求
        xhr.send()
        // 4.注册响应事件
        // 这个事情什么时候执行:服务器响应数据给我们就会执行
        // 时间长短取决于:网速(带宽,服务器,数据大小,天气因素等)
        xhr.onload = function () {
            console.log(xhr.responseText)
        }

 🔔拦截器:

 在请求响应被then或catch处理前拦截它们

axios拦截器执行流程:

  • axios发送请求
  • 执行请求拦截器(发送服务器之前执行)
  • 发送给服务器
  • 服务器响应请求
  • 执行响应拦截器(then方法之前执行)
  • 执行axios的then方法
// 添加请求拦截器
    axios.interceptors.request.use(function (config) {
      // 在发送请求之前做些什么
      // 显示拦截器
      document.querySelector('.loading-box').style.display = 'block'
      return config;  //把请求配置(路径,方法,地址)发送给服务器
    }, function (error) {
      // 对请求错误做些什么
      return Promise.reject(error); //如果请求错误,浏览器会爆红
    });

    // 添加响应拦截器
    axios.interceptors.response.use(function (response) {
      // 对响应数据做点什么
      // 隐藏能够拦截器
      document.querySelector('.loading-box').style.display = 'none'
      return response;//把响应数据给then方法的res
    }, function (error) {
      // 对响应错误做点什么
      return Promise.reject(error);//如果响应错误,浏览器会爆红
    });

🔔get和post区别

  • 传参方式不同:get在url里面拼接(请求行),post在请求体中发送
  • 传参速度不同:get传输快,post传输慢
  • 数据大小不同:get有大小限制,一般2~5MB,post没有大小限制(文本上传)
  • 安全性不同:get安全性低,post安全性高(登录,注册必须是post)
  // 1.get请求传参 :直接在url后面拼接参数
        // 格式:url?key=value
        // 2.post请求参数:需要做两件事情
        // (1)设置请求头,固定代码
        xhr.setRequestHeader('Content-Type','application/x-www-form-urlencode')
        // (2)参数在send方法里面拼接
        xhr.send('key=value')
        // 3.get与post区别:传参方式不同
        // get(url拼接)"url?key=value"
        // post(请求体):xhr.send(key=value)


        //(1).实例化ajax对象
        let xhr = new XMLHttpRequest()
        //(2).设置请求方法和地址
        xhr.open('post', '')
        //(3).设置请求头(post请求才需要设置)
        xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded')
        //(4).发送请求 : 参数格式  'key=value' 
        xhr.send('key=value')
        //(5).注册回调函数
        xhr.onload = function () {
            console.log(xhr.responseText)
        }

🔔 Ajax技术组成部分(异步的JS与XML)

     Asgnchronous   Javascript   And  XML

  • A:Asynchronons(异步)   :不会立即执行,而是过一会执行(定时器,Ajax,事件处理函数)
  • J:Javascript
  • A:And
  • X:XMLHttpRequset:负责发送ajax请求. XML作用与JSON一致,JSON没有出来之前的跨平台格式由xml处理


🔔onreadyStatechange事件和xml请求状态码

onreadstatechange事件:ajax状态发生变化的时候执行

onload事件:一次请求,只会执行一次

onreadystatechange事件:一次请求,会执:行多次

 xhr对象的状态码readState(ajax的状态码):

  • 0  :  创建xhr对象,请求未初始化
  • 1  :  执行open方法,链接已简历
  • 2  :  请求:请求已发送服务器
  • 3  :  处理: 服务器处理中
  • 4  :  响应 :服务器处理结束,响应数据

🔔AJax原理

ajax原理:本质就是给服务器发送请求报文

请求报文组成三部分:

  • 请求行:请求方法+请求地址
  • 请求头:浏览器告诉服务器数据是什么格式
  • 请求体:请求参数

响应报文组成三部分:

  • 响应行:服务器响应状态码
  • 响应头:服务器告诉浏览器响应的数据格式
  • 响应体:服务器响应数据

服务器常见的几种响应状态码:

  • 2xx:请求成功(200)
  • 3xx:重向(302:服务器重定向,服务器主动修改)
  • 4xx:浏览器问题   (404:url错误   400:参数错误   401:未认证 403:没有权限  405:请求方法错误 413:文件大小超出限制)
  • 5xx:服务器出问题

http协议:

 http协议是网络传输协议(协议:规定网络传输格式)

 http协议组成:请求报文(浏览器发送请求)+响应报文(服务器响应)


🔔上传文件流程:

  • 给file表单注册change事件
  • 获取用户选择的文件
  • 创建formData对象
  • 发送ajax请求

     fd会做两件事件:(1)修改请求头为文件请求头:mulipart/form-data   (2把图片转为二进制)

//(1).给file表单注册onchange事件 
    document.querySelector('#iptFile').addEventListener('change', function () {
      // console.log(this.files) (2) 获取用户选择的文件
      // console.log(this.files[0]); 数组 文件1   [文件1,文件2]
      // (3)创建formData对象
      const fd = new FormData()
      fd.append('avatar', this.files[0])
      // 发送ajax请求
      axios({
        url: 'http://www.liulongbin.top:3009/api/upload/avatar',
        method: 'post',
        data: fd
        // fd会做两件事件:(1)修改请求头为文件请求头:multipart/form-data (2)把图片转为二进制
      }).then(res => {
        //成功回调
        console.log(res)
        document.querySelector('img').src = `http://www.liulongbin.top:3009${res.data.url}`
      })
    })

🔔网页从输入到url输入到呈现工程

  1. DNS解析:把域名解析成ip地址
  2. TCP链接三次握手:建立 安全可靠的传输协议                                                                              2.1 TCP:一种传输控制协议                                                                                                        2.2 TCP作用:保证HTTP网络传输是 安全+可靠的(检测客户端 与 服务器的网卡是不是通的)    2.3 TCP三次握手:                                                                                                                             第一次:浏览器  -> 服务器                                                                                                           第二次:服务器  -> 浏览器                                                                                                           第三次:浏览器  ->  服务器                    
  3. HTTP请求:网络传输协议                                                                                                              3.1 浏览器发送请求                                                                                                                    3.2 服务器处理请求                                                                                                                    3.3 服务器响应请求         
  4. 服务器响应数据之后,渲染引擎开始渲染页面                                                                              4.1 解析html生成:dom树                                                                                                            4.2 解析css生成:样式树                                                                                                            4.3 dom树与样式树 合并得到渲染树                                                                                          4.4 呈现页面

 


 

 

🔔函数防抖

函数防抖就是在单位时间内,频繁触发事件,以最后一次为准

 (1)使用场景:输入框输入防抖

 (2)防抖实现核心思路:

  • 开启定时器
  • 每一次触发事件时,清除上一次的定时器(只要用户不断输入事件,之前的定时器就会被清除,不触发事件,定时器到了就会自动执行)
  //  函数防抖:在单位时间内,频繁触发事件,以最后一次为准
        //   (1)使用场景: 输入框输入防抖
        //   (2)防抖实现核心思路:
        //   1.开启定时器
        //   2.每一次触发事件时,清除上一次的定时器 
        //  *只要用户输入不断触发事件,之前的定时器都会被清除.不触发事件,定时器到了就会自动执行

        let timeId = null
        document.querySelector('.input').addEventListener('input', function () {
            // 每一次触发事件的时候,清除上一次的定时器
            clearTimeout(timeId)
            // 开启本次定时器,存储定时器ID
            timeId = setTimeout(() => {
                console.log(this.value)
            }, 300)
        })

🔔函数节流

函数节流就是单位时间内频繁触发事件 只执行一次

(1)节流场景:解决高频事件触发(滚动条,鼠标)

(2)节流实现核心思路: 

  • 开关控制节流阀
  • 触发事件的时候,把开关改成true,就执行事件.false不执行
  • 每一次触发事件的时候,把开关改成false,并且在定时器中修改为true
 /*
            函数节流:单位时间:单位时间内 频繁触发事件 只执行一次
            (1)节流场景:解决高频事件触发(滚动条,鼠标)
            (2)节流实现核心思路:  a.开关控制节流阀 
                                 b.触发事件的时候,把开关改成true,就执行事件,false不执行
                                 c.每一次触发事件的时候,把开关改为false,并且在定时器中修改为true 
    */
        let flag = true
        let i = 1
        window.onscroll = function () {
            if (flag) {
                flag = false
                console.log(`触发次数:${i++}`)
                // 开启节流定时器
                setTimeout(function () {
                    flag = true
                }, 200)
            }
        }

🔔函数防抖和节流的异同点:

相同点:都是减少事件触发的次数,从而提高页面的性能

不同点:场景不同

防抖:用户主动触发的事件(输入框输入,鼠标移入)

节流:事件本身高频率触发(滚动事件,鼠标移动)


前端访问方式

  1. 地址栏输入网址URL
  2. html的a标签href属性(不需要条件)
  3. Js中location,href=URL(需要条件)
  4. Ajax技术,网页不刷新的跳转,向服务器请求数据

使用Ajax请求数据的方式

  • get  从服务器获取数据
  • post 向服务器新增数据
  • delete 删除服务器上的数据
  • put 更新服务器上的数据(侧重于完整更新)
  • patch 更新服务器上的数据(侧重于部分更新)
button class="but1">发送请求</button>
    <button class="but2">发送post请求</button>
    <script src="../axios.js"></script>
    <script>
        /*  
         axios({
            url: '请求路径',
            method: 'get',
            data: { 'post请求参数'},
            params: { 'get请求参数'}
        }).then(res => {
            //成功回调
            console.log(res)
        })


            // axios注意点:res对象并不是服务器响应的原始数据,而是axios自己额外包装了 一些数据
            res.config:请求配置
            res。data:服务器真正响应的数据        
        */
        // get发送请求
        document.querySelector('.but1').addEventListener('click', function () {
            axios({
                url: 'https://autumnfish.cn/api/joke/list',
                method: "get",
                params: { num: 10 }
            }).then(res => {
                console.log(res)
            })
        })

        // post 请求
        document.querySelector('.but2').addEventListener('click', function () {
            axios({
                url: "http://ajax-base-api-t.itheima.net/api/login",
                method: "post",
                data: { username: "admin", password: "123456" }
            }).then(res => {
                console.log(res)
            })
        })

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值