Ajax用法总结

news2024/9/19 12:39:12

目录

Ajax简介

Ajax使用

xhr内部五种状态

Ajax在IE浏览器上存在的缓存问题

如何发送post请求

如何取消Ajax请求

​编辑

jQuery封装的Ajax如何使用?

Ajax简介

Ajax全称为Asynchous Javascript And XML,即异步的JS和XML,通过Ajax可以在浏览器中向服务器发送异步请求,其最大的特点是实现:

页面无刷新获取数据

工作原理其实相当于在用户和服务器之间加上了一个中间层(Ajax引擎),使用户操作与服务器响应异步化;

它不是一个新的编程语言,而是一种将现有标准组合在一起使用的技术方案,但并不是一种新技术;它依赖的是现有的CSS/HTML/Javascript,而其中最核心的依赖是浏览器提供的XMLHttpRequest对象,是这个对象使得浏览器可以发出HTTP请求与接收HTTP响应。

优点:

  • Ajax无需刷新页面即可与服务器端进行通信
  • 可允许用户根据用户事件来更新部分页面内容

缺点:

  • 并没有浏览历史,不能回退(因为无刷新页面)
  • 存在跨域问题
  • SEO不友好

补充:

此处XML指可扩展标记语言,它和HTML类似,不同的是HTML中都是预定义标签,而XML中没有预定义标签,全都是自定义标签,用于表示一些数据(后逐步被json替代,但微信公众号等应用中还会用到)

    // 用XML表示person数据
    <person>
        <name>小明</name>
        <age>12</age>
    </person>

Ajax使用

利用XMLHttpRequest(以下简称xhr)发送Ajax请求,各个功能说明如下:

const xhr = new XMLHttpRequest()      // 创建XMLHttpRequest实例对象

xhr.open(method, url)    // 配置请求

xhr.setRequestHeader(key, value)      // 设置请求头(可选)

xhr.timeout  = 2000 //  请求超时时间

xhr.send()    //  发送请求, get请求不传body参数

xhr.onreadystatechange = () => {

        if (xhr.readyState === 4 && xhr.status === 200 ) {

                // 对响应的处理

        }

}  //  接收响应

xhr.onerror = ( )  => {

        // 对请求出错的处理

}

xhr.ontimeout = () => {

       // 对超时出错的处理

}

xhr.abort() // 取消请求

 示例:get携带params参数id请求name属性:

    <span></span>
    <script>
        const xhr = new XMLHttpRequest() // 创建XMLHttpRequest实例对象
        xhr.open('GET', 'http://localhost:9123/students/:id') // 携带params参数
        xhr.send()
        xhr.onreadystatechange = () => {
            if (xhr.readyState === 4 && xhr.status === 200 ) {
                const span = document.querySelector('span')
                span.innerHTML = xhr.response // 将接口返回数据放到span标签中
            }
        } //  接收响应
    </script>

xhr内部五种状态

xhr内部有五种状态,分别是0/1/2/3/4,经过了四次状态转变;

0:在xhr实例对new出来的那一刻状态即为0(初始状态);

1:在open()调用之后,状态变为1,此时可以修改请求头内容;

2:在send()调用之后,此处调用请求头报错;

3:已经返回一部分简单数据和响应头;

4:所有数据都已经返回回来;

Ajax在IE浏览器上存在的缓存问题

问题描述:在IE浏览器中,由于缓存机制的存在,A若发送相同的ajax get请求时(post请求无此问题),只会将第一次请求发送出去,剩余的多次会直接使用缓存中的数据;

如多次请求get接口http://localhost:8080/get_name,ie浏览器会默认将第一次得到的数据直接返回过去,不再请求服务器,但是如果该接口返回的数据在别处进行了修改后 ,即发生了改变后,此时再用缓存中的数据就不对了,所以要让ie浏览器在每次调用相同接口时,都要重新请求服务器,解决方法就是在接口地址上加上时间戳参数:'http://localhost:8080/get_name?t=' + Date.now()`

如何发送post请求

众所周知,发送post请求有三种携带参数方式,query、params以及请求体方式,其中请求体方式有两种参数方式----urlencoded以及json方式,这部分内容介绍可参见文章后面补充;一般情况下,使用post方式配合请求体传参;

在Ajax中,若要用post方式,则要声明对应的请求头参数:

// 二选一
xhr.setRequestHeader('Content-type', 'application/json') // json方式传参
xhr.setRequestHeader('Content-type', 'application/x-www-form-rulencoded') // urlencoded方式传参

同时要在xhr.send()配置要传输的参数,要与请求头设置的方式对应;

// json方式
const person = {name: '小明', age: 12}
xhr.send(JSON.stringify(person))

// urlencoded方式
xhr.send('name=小明&age=12')

完整示例:post方式请求http://localhost:9123/students下的数据,并携带请求体参数name和age

<body>
    <span></span>
    <script>
        const xhr = new XMLHttpRequest() // 创建XMLHttpRequest实例对象
        xhr.open('POST', 'http://localhost:9123/students')
        xhr.responseType = 'json'
        const person = {name: '小明', age: 12}
        xhr.setRequestHeader('Content-type', 'application/json') // json方式传参
        // xhr.setRequestHeader('Content-type', 'application/x-www-form-rulencoded') // urlencoded方式传参
        xhr.onreadystatechange = () => {
            if (xhr.readyState === 4 && xhr.status === 200 ) {
                const span = document.querySelector('span')
                span.innerHTML = xhr.response
            }
        } //  接收响应
        xhr.send(person) // json格式
        // xhr.send('name=小明&age=12') // urlencoded
    </script>
</body>

如何取消Ajax请求

所谓取消,是指在发出Ajax请求后,通过用户交互(如点击取消按钮)取消刚刚发送的Ajax请求;

使用xhr.abort()即可;

如下示例展示如何在点击多次请求后,只保留最后一次接口请求:

<body>
    <span></span>
    <button id="btn">发送</button>
    <script>
        let xhr
        let isLoading
        const btn = document.querySelector('#btn')
        btn.onclick = () => {
            if (isLoading) {
                // 如果不是最后一次则取消
                xhr.abort()
            }
            xhr = new XMLHttpRequest() // 创建XMLHttpRequest实例对象
            xhr.onreadystatechange = () => {
                if (xhr.readyState === 4 && xhr.status === 200) {
                    // 若结果还未返回回来,则此处一直未执行
                    isLoading = false
                    const span = document.querySelector('span')
                    span.innerHTML = xhr.response
                }
            } //  接收响应
            xhr.open('GET', 'http://localhost:9123/students/1')
            xhr.responseText = 'json'
            xhr.send()
            isLoading = true
        }
    </script>
</body>

jQuery封装的Ajax如何使用?

jQuery对Ajax进行了封装,使得原生xhr方式更加简单,仅供了解:

代码中引入jQuery库后,全局中就会出现$和jQuery变量;

发送post请求简单形式:

$.post(url, [data], [callback], [type])

url: 请求的URL地址;

data: 请求携带的参数;

callback: 请求成功时的回调函数;

type: 设置请求返回的内容格式,如json、html、xml等

发送get请求简单形式:

 $.get(url, [data], [callback], [type])   参数含义与上相同

发送完整请求例子: 

<body>
    <button id="btn1">get</button>
    <button id="btn2">post</button>
    <span id="span"></span>
    <script>
        const btn1 = $('#btn1')
        const btn2 = $('#btn2')
        const span = $('#span')
        btn1.click(() => {
            $.ajax({
                url: 'http://localhost:9123/students/1', // 请求地址
                method: 'GET', // 请求方式
                // data: { id: '1' },
                dataType: 'json',
                timeout: 2000,
                success: (res, err, xhr) => {
                    console.log(res);
                    span.html(JSON.stringify(res)) 
                },
                err: (xhr) => {
                    console.log('失败了', xhr);
                }
            })
        })
         btn2.click(() => {
            $.ajax({
                url: 'http://localhost:9123/students', // 请求地址
                method: 'POST', // 请求方式
                data: { id: '1' , name: "apple"}, // 请求体参数
                dataType: 'json',
                timeout: 2000,
                success: (res, err, xhr) => {
                    console.log(res);
                    span.html(JSON.stringify(res)) 
                },
                err: (xhr) => {
                    console.log('失败了', xhr);
                }
            })
        })
    </script>
</body>

jQuery默认传的请求体形式为urlencoded形式

上面post请求的简单版示例为:

 btn2.click(() => {
    $.post('http://localhost:9123/students', {id: 1}, (res)=> {
       console.log(res);
       span.html(JSON.stringify(res)) 
    })
 })

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/60707.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux进程的调度

目录 调度策略与调度类 实时调度策略 普通调度策略 调度类 sched_class有几种实现&#xff1a; 完全公平调度算法 调度队列与调度实体 调度类是如何工作的&#xff1f; 调度策略与调度类 在Linux里面&#xff0c;进程大概可以分成两种。 一种称为实时进程&#xff0c;…

Redis主从复制+哨兵模式

必读 redis的主从复制是单向的&#xff0c;只能有主节点到从节点&#xff0c;主节点以写为主从节点以读为主不能写入数据&#xff01;因为系统的80%的需求都是读的需求。 redis服务默认自己是主节点&#xff0c;一个主节点由一个或多个从节点&#xff0c;一个从节点只有一个主…

图信号处理论文

图信号处理并且非图神经网络的论文&#xff1a; Donget.al“GraphSignal Processingfor MachineLearning A Review and New Perspectives," ICASSP Tutorial, June 2021. Lorenzoet.al“Adaptiveleast mean squaresestimation ofgraph signals"IEEE Trans. Signal I…

Vue3 学习笔记 —— 破坏式更新、自定义指令 directive

目录 1. 什么叫破坏式更新&#xff1f; 2. Vue3 中的自定义指令 2.1 自定义指令的生命周期 2.1.1 Vue2 Vs Vue3 的自定义指令生命周期 2.1.2 自定义指令的生命周期中&#xff0c;接收的参数 2.2 定义一个自定义指令 2.2.1 在 setup 中定义自定义指令&#xff08;此处为 …

数据结构 树练习题

目录 判断 选择 判断 1.一棵有124个结点的完全二叉树&#xff0c;其 叶结点个数是确定的。 【答案】正确 【解析】完全二叉树 若设二叉树的深度为h 除第 h 层外 其它各层 1&#xff5e;(h-1) 的结点数都达到最大个数(即1~(h-1)层为一个满二叉树) 第 h 层所有的结点都连续集…

【C++】STL

文章目录回调函数&#xff1a;一、STL的诞生二、STL基本概念三、STL六大组件四、STL中容器&#xff0c;算法&#xff0c;迭代器回调函数&#xff1a; 函数被作为参数传递到另一个函数&#xff08;主要函数&#xff09;的那个函数就叫做 回调函数 一、STL的诞生 C的面向对象和…

DHTMLX Diagram JavaScript/HTML5 Pro Library:5.0

Diagram — JavaScript/HTML5 Diagram Library Ω578867473 破解版DHTMLX Diagram comprises a set of interactive HTML5 UI components such as organization charts, flowcharts, decision trees, block diagrams, mind maps, etc. Consisting of nodes and connectors, di…

i.MX 6ULL 驱动开发 二十八:网络设备

一、网络设备的系统框图 MAC&#xff1a;工作在网络模型的数据链路层&#xff0c;通过 RGMII 或 RMII 接口连接 PHY&#xff0c;MAC 控制器中的 MDIO 控制器提供 MDIO 接口&#xff0c;用于访问 PHY 寄存器。 PHY&#xff1a;工作在网络模型的物理层&#xff0c;是 IEEE802.3 …

SVN项目,提交Git保留之前提交记录

&#x1f4c3;目录跳转简介&#xff1a;1.创建文件2.命令下载:3.上传到远程git3.1 创建远程git工程3.2 添加一个新的远程 Git 仓库3.3 拉取远程master的数据合并3.3 推送远程git分支简介&#xff1a; 由于之前直接搞的项目是部署在自己搭建的SVN服务器上&#xff0c;平时创建的…

5. JVM调优工具详解及调优实战(这里有我的实战案例预制构件生产管理平台)

1. Jmap&#xff0c;Jstack&#xff0c;Jinfo命令详解 1.1 Jmap 此命令可以用来查看内存信息&#xff0c;实例个数以及占用内存大小 jps 先查看有哪些java程序 jmap -histo 16492 > ./log.txt jmap -heap 16492 查看堆的信息 查看堆年轻代老年代的使用情况 堆内存dum…

Matlab:tftb-0.2时频工具箱安装小记

Matlab&#xff1a;tftb-0.2时频工具箱安装小记一、安装过程记录1、解压缩&#xff1a;2、将解压缩后的文件夹复制到自己的Matlab安装目录工具箱下&#xff1b;3、打开Matlab设置路径&#xff1a;设置路径4、测试是否安装成功&#xff1a;5、小试牛刀叮嘟&#xff01;这里是小啊…

【ASE+python学习】-批量识别石墨烯团簇结构中的吡啶氮,并删除与其相连的氢

批量识别石墨烯团簇结构中的吡啶氮&#xff0c;并删除与其相连的氢文章背景任务内容程序实现思路实现代码建立标准结构中边缘碳与氢的位置差值标准数据集读入待修改结构&#xff0c;识别氮与氢位置差值是否存在标准数据集代码细节剖析文章背景 在科研工作中&#xff0c;我的工…

STM32系列(HAL库)——串口IAP

前言 IAP&#xff08;In Application Programming&#xff09;即在应用编程&#xff0c;IAP 是用户自己的程序在运行过程中对 User Flash 的部分区域进行烧写&#xff0c;目的是为了在产品发布后可以方便地通过预留的通信口对产 品中的固件程序进行更新升级。 设备具备IAP功能…

javaScript学习———变量概述 变量的使用 变量语法扩展 变量命名规范交换 变量案例

博主每篇博文的浪漫主义&#xff1a; 【东京girl秀场上那些甜度爆表的女孩子们。&#x1f496;】 https://www.bilibili.com/video/BV1pG411F7KT/?share_sourcecopy_web&vd_source385ba0043075be7c24c4aeb4aaa73352 东京girl秀场上那些甜度爆表的女孩子们。&#x1f496;…

计算机组成原理--------12.4---------开始

计算机硬件的基本组成 冯诺依曼计算机的特点 冯诺依曼首次提出“存储程序”概念 计算机由五大部件组成&#xff1a;I/O设备&#xff08;输入输出&#xff09;&#xff0c;存储器&#xff08;存放数据和程序&#xff09;&#xff0c;运算器&#xff08;算术运算、逻辑运算&…

[附源码]JAVA毕业设计科研项目审批管理系统(系统+LW)

[附源码]JAVA毕业设计科研项目审批管理系统&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目…

关于解释型语言和编译性语言的区别

关于博主每篇博文的浪漫主义 【初恋是整遍《手写的从前》】 https://www.bilibili.com/video/BV1JP411g7qF/?share_sourcecopy_web&vd_source385ba0043075be7c24c4aeb4aaa73352 初恋是整遍《手写的从前》能够知道解释性语言和编译型语言的特点能够知道标识符不能是关键字…

docker_重装mysql

1.docker ps 查看docker正在运行的容器 2.docker stop xxx 停止正在运行的mysql 3.docker pull mysql:5.7 docker拉取mysql指定版本的镜像 docker pull mysql docker拉取最新版本的镜像 4.docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD123456 mysql:…

PHP代码审计系列(一)

PHP代码审计系列&#xff08;一&#xff09; 本系列将收集多个PHP代码安全审计项目从易到难&#xff0c;并加入个人详细的源码解读。此系列将进行持续更新。 extract变量覆盖 源码如下 <?php$flagextractFlag.txt; extract($_GET);if(isset($shiyan)){ $contenttrim(f…

YOLO算法创新改进系列(项目汇总)

&#x1f680;&#x1f680;&#x1f680;——YOLO算法创新改进系列项目汇总——&#x1f384;&#x1f384;&#x1f384; &#x1f680; YOLO算法创新改进系列 &#xff08;项目汇总&#xff09;&#x1f384;&#x1f388; &#x1f340; 改进YOLOv5/YOLOv7——魔改YOLOv5/Y…