网络-Ajax

news2024/11/26 15:32:55

文章目录

  • 前言
  • 一、Ajax
    • 优点:
    • 缺点:
  • 二、使用步骤
    • XNLHttpRequest对象
    • 完整代码
  • 总结


前言

本文主要记录Ajax技术的简介,以及用法。


一、Ajax

Ajax是一组用于在Web浏览器和Web服务器之间进行异步通信的Web开发技术。
它代表着Asynchronous JavaScript and XML(异步JavaScript和XML),尽管XML并不总是作为数据格式使用。
通过Ajax,Web应用程序可以在不重新加载整个页面的情况下更新页面的部分内容。这样可以实现更加交互和响应式的用户体验。
Ajax使用JavaScript发送请求到服务器并异步处理响应,而不会阻塞用户界面。
可以通过 JavaScript 和XNLHttpRequest对象来向服务器请求数据

Ajax可以用于执行各种任务,例如从服务器检索数据、提交表单数据和动态更新内容。
它通常用于现代Web应用程序中,用于创建自动完成搜索框、实时更新和无限滚动等交互功能。

优点:

  • 提高用户体验:通过减少页面重载和刷新,使得网站变得更加灵活和动态
  • 减轻服务器负载:可以有效减少服务器接收到的请求次数和需要响应的数据量,从而减轻服务器负担
  • 提高响应速度:可以异步获取数据并更新页面,从而提高响应速度
  • 增加交互:使页面变得可交互性

缺点:

  • 对搜索引擎优化(SEO)不友好,爬虫无法抓取Ajax中的内容与URL ===>考虑用SSR服务端渲染技术
  • 需要考虑安全性问题,数据和网络安全需要采取对应的措施

二、使用步骤

XNLHttpRequest对象

  • 创建对象xhr:
const xhr = new XMLHttpRequest()
  • open方法:接收三个参数分别是 请求方式、请求地址、是否异步:默认为true
 xhr.open('post','http://localhost:3000/api/post',true)
  • setRequestHeader方法:用于为请求的HTTP头设置值。
setRequestHeader("header", "value")
  • onreadystatechange方法:监听服务端返回的数据
xhr.onreadystatechange = () =>{
            console.log(xhr)
            if (xhr.readyState === 4 && xhr.status === 200) {
                console.log(xhr.responseText)
            }
        }

onreadystatechange

  • readyState属性:
    • 0:未初始化,XNLHttpRequest已经创建,但未调用open方法
    • 1:已打开,open方法已调用,send方法未调用
    • 2:已发送,send方法已调用,服务端接收到请求
    • 3:正在接收,服务器正在处理请求并返回数据
    • 4:完成,服务端已完成数据传输
  • status属性: 200成功 400参数错误 403没有权限 401token找不到 404未找到 500服务器错误
  • send方法:给服务端发送的数据
xhr.send(JSON.stringify({name:'smz'}))

send

  • abort方法:用于停止或放弃当前异步请求。必须在open方法后,无法恢复。
stop.addEventListener('click',()=>{
            xhr.abort()
        })
  • getResponseHeader方法:用于以字符串形式返回指定的HTTP头信息。
getResponseHeader("headerLabel")
  • getAllResponseHeaders方法:用于以字符串形式返回完整的HTTP头信息。
 getAllResponseHeaders()

获取请求头

  • 监听进度:

    给xhr对象添加一个progress事件,返回event

    event.loaded:当前进度
    event.total:总进度

 xhr.addEventListener('progress',(event)=>{
            console.log(event.loaded,event.total)
        })

进度
进度

  • 设置超时:xhr.timeout = 3000

  • 超时回调:监听timeout事件

 xhr.addEventListener('timeout',()=>{
            alert('请求超时')
        })

超时

  • 中断回调:监听abort事件
 xhr.addEventListener('abort',()=>{
            console.log('请求中断')
        })
  • 监听load事件:也可以监听请求是否成功,就不用判断readyState的值
 xhr.addEventListener('load',()=>{
            if (xhr.status === 200){
                console.log('请求成功,触发onload')
            }
        })

请求成功

  • post请求:请求参数要放在send()中

完整代码

前端代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>
    <button id="send">发送请求</button>
    <button id="stop">中断请求</button>
    <div>进度条<span id="progress"></span></div>
    <input id="file" type="file">
</div>
</body>
<script>
    let btn = document.getElementById('send')
    let file = document.getElementById('file')
    btn.addEventListener('click',()=>{
        sendAjax()
    })
    //上传文件
    file.addEventListener('change',()=>{
        const formData = new FormData()
        formData.append('file',file.files[0]) // key值对应后端 upload.single('file')
        const xhr = new XMLHttpRequest()
        xhr.open('post','http://localhost:3000/api/upload',true)
        xhr.onreadystatechange = () =>{
            console.log(xhr)
            if (xhr.readyState === 4 && xhr.status === 200) {
                console.log(xhr.responseText)
            }
        }
        xhr.send(formData)
    })
    const sendAjax = () =>{
        const xhr = new XMLHttpRequest()
        // 三个参数,请求方式、请求地址、是否异步:默认为true
        //get
        // xhr.open('get','http://localhost:3000/api/txt?name=smz',true)
        //post
        xhr.open('post','http://localhost:3000/api/post',true)
        //设置请求头
        xhr.setRequestHeader('Content-Type','application/json')
        //设置超时
        xhr.timeout = 30000
        //超时回调
        xhr.addEventListener('timeout',()=>{
            alert('请求超时')
        })
        // 监听服务端返回的数据
        xhr.onreadystatechange = () =>{

            if (xhr.readyState === 4 && xhr.status === 200) {
                console.log(xhr.responseText)
            }
        }
        //监听进度
        xhr.addEventListener('progress',(event)=>{
            const progress = document.getElementById('progress')
            progress.innerText = `${(event.loaded/event.total*100).toFixed(2)}%`
            console.log(event.loaded,event.total)
            //响应头
            console.log(xhr.getAllResponseHeaders())
            console.log(xhr.getResponseHeader('content-type'))
        })
        //中断请求
        let stop = document.getElementById('stop')
        stop.addEventListener('click',()=>{
            xhr.abort()
        })
        //监听中断
        xhr.addEventListener('abort',()=>{
            console.log('请求中断')
        })
        //监听请求成功
        xhr.addEventListener('load',()=>{
            if (xhr.status === 200){
                console.log('请求成功,触发onload')
            }
        })
        // 给服务端发送的数据
        // xhr.send(null)
        //post
        xhr.send(JSON.stringify({name:'smz'}))
    }

</script>
</html>

后端代码:这里用的node

const express = require('express')
const app = express()
const multer = require('multer')

const single = multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, './upload')
    },
    filename: (req, file, cb) => {
        cb(null, Date.now() + file.originalname)
    }
})
const upload = multer({
    single
})

app.get('/api/txt',(req,res)=>{
    res.setHeader('Access-Control-Allow-Origin','*')
    const {name} = req.query // 函数名
    let text = ''
    for(let i=0;i<10000;i++){
        text += `${name}Ajax`
    }
    res.send( text)
})

app.use(express.json())
app.use(express.urlencoded({extended:true}))
// post请求
app.post('/api/post',(req,res)=>{
    res.setHeader('Access-Control-Allow-Origin','*')
    console.log(req.body)
    res.json({
        code:200,
        data:{
            name: req.body.name
        }
    })
})
// 预检请求放行
app.options('/api/*', (req,res) => {
    res.setHeader("Access-Control-Allow-Origin","*")
    res.setHeader("Access-Control-Allow-Headers", "*");
    res.end()
})

//传文件
app.post('/api/upload',upload.single('file'),(req,res)=>{
    console.log(req.file)
    res.setHeader('Access-Control-Allow-Origin','*')
    res.json({
        code:200
    })
})

app.listen(3000,()=>{
    console.log('server is running')
})

总结

axios第三方库对Ajax做了一些封装,本文主要记录了Ajax的介绍与使用。

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

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

相关文章

如果在 Mac 上的 Safari 浏览器中无法打开网站

使用网络管理员提供的信息更改代理设置。个人建议DNS解析&#xff0c;设置多个例如114.114.114.114 8.8.8.8 8.8.4.4 如果打不开网站&#xff0c;请尝试这些建议。 在 Mac 上的 Safari 浏览器 App 中&#xff0c;检查页面无法打开时出现的信息。 这可能会建议解决问题的…

第 114 场 LeetCode 双周赛题解

A 收集元素的最少操作次数 模拟: 反序遍历数组&#xff0c;用一个集合存当前遍历过的不超过 k k k 的正数 class Solution { public:int minOperations(vector<int> &nums, int k) {unordered_set<int> vis;int n nums.size();int i n - 1;for (;; i--) {if…

nodejs+vue活鲜物流监控系统elementui

第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;技术背景 5 3.2.2经济可行性 6 3.2.3操作可行性&#xff1a; 6 3.3 项目设计目标与原则 6 3.4系统流程分析 7 3.4.1操作流程 7 3.4.2添加信息流程 8 3.4.3删除信息流程 9 第4章 系统设计 11 …

蓝桥等考Python组别十级003

第一部分&#xff1a;选择题 1、Python L10 &#xff08;15分&#xff09; 已知s Pencil&#xff0c;下列说法正确的是&#xff08; &#xff09;。 s[0]对应的字符是Ps[1]对应的字符是ns[-1]对应的字符是is[3]对应的字符是e 正确答案&#xff1a;A 2、Python L10 &am…

【OpenCV-Torch-dlib-ubuntu】Vm虚拟机linux环境摄像头调用方法与dilb模型探究

前言 随着金秋时节的来临&#xff0c;国庆和中秋的双重喜庆汇聚成一片温暖的节日氛围。在这个美好的时刻&#xff0c;我们有幸共同迎来一次长达8天的假期&#xff0c;为心灵充电&#xff0c;为身体放松&#xff0c;为未来充实自己。今年的国庆不仅仅是家国团聚的时刻&#xff…

SSL/TLS介绍以及wireshark抓包TLS Handshake报文

文章目录 1.概念1.1 SSL/TLS发展历史1.2 TLS两个阶段1.3 TLS报文头 2.TLS Handshake2.1 Handshake具体过程2.1.1 单向认证和双向认证2.1.2 复用TLS协商结果Session Identifier&#xff08;会话标识符&#xff09;Session Ticket&#xff08;会话票据&#xff09; 2.2 Handshake…

实验篇——根据群体经纬度提取环境数据(数据降维)

实验篇——根据群体经纬度提取环境数据&#xff08;数据降维&#xff09; 文章目录 前言一、先导二、R语言实现2.1. 分气温、降水、光照、风速、蒸汽压划分数据集2.2. 对每个数据集降维处理2.2.1. 气温2.2.2. 降水2.2.2. 光照2.2.3. 风速2.2.4. 蒸汽压2.2.5.定义一个函数&#…

【小沐学前端】Node.js实现UDP和Protobuf 通信(protobuf.js)

文章目录 1、简介1.1 node1.2 Protobuf 2、下载和安装2.1 node2.2 Protobuf 3、node 代码示例3.1 HTTP3.2 UDP单播3.4 UDP广播 4、Protobuf 代码示例4.1 例子:awesome.proto 结语 1、简介 1.1 node Node.js 是一个开源的、跨平台的 JavaScript 运行时环境。 Node.js 是一个开源…

基于 SpringBoot+Vue 的教室人事档案管理系统

1 简介 教师人事档案管理系统利用信息的合理管理&#xff0c;动态的、高效的、安全的实现了教师的各种需求&#xff0c;改变了传统的网上查看方式&#xff0c;使教师可以足不出户的在线查看最适合自己个人档案、奖惩信息、档案变动、培训报名或者新闻资讯。 1、教师后台功能模…

闪存工作原理

前言 1、闪存类型 闪存有两种分类&#xff0c;NAND型闪存主要用于存储 2、MOS的特性 MOS管的三个引脚分别是Gate&#xff08;G&#xff09;、Source&#xff08;S&#xff09;和Drain&#xff08;D&#xff09;。Gate&#xff08;G&#xff09;引脚是晶闸管的控制引脚&…

Qt::图层框架-图片图层-序列图层-QGraphicsPixmapItem

二维矢量动画智能制作软件开发合集 链接&#xff1a;软件开发技术分享及记录合集 个人开发二维矢量动画智能制作软件界面如下&#xff1a; 目录 一、图片序列图层原理 二、图片序列图层代码实现 三、图片序列图层软件测试视频 结束语 一、图片序列图层原理 本软件的11种…

Sentinel学习(2)——sentinel的使用,引入依赖和配置 对消费者进行流控 对生产者进行熔断降级

前言 Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 本篇博客介绍sentinel的使用&#x…

后端各层的部署开发

目录 一、创建数据库 二、entity层 三、mapper层 四、service层 五、controller层 一、创建数据库 CREATE TABLE user (id bigint NOT NULL AUTO_INCREMENT COMMENT id,name varchar(10) DEFAULT NULL COMMENT 姓名,sex varchar(5) DEFAULT NULL COMMENT 性别,phone varcha…

NLP 03(LSTM)

一、LSTM LSTM (Long Short-Term Memory) 也称长短时记忆结构,它是传统RNN的变体,与经典RNN相比&#xff1a; 能够有效捕捉长序列之间的语义关联缓解梯度消失或爆炸现象 LSTM的结构更复杂,它的核心结构可以分为四个部分去解析: 遗忘门、输入门、细胞状态、输出门 LSTM内部结构…

如何在Qt中引入Network模块

2023年10月1日&#xff0c;周日凌晨 如果用的是CMake find_package(Qt6 COMPONENTS Network REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Network) 如果用的是qmake QT network

zemax光线光扇图

光线光扇图&#xff1a; 过光瞳Y轴的光束剖面&#xff0c;称为子午光扇&#xff1b; 过光瞳X轴的光束剖面&#xff0c;称为弧矢光扇。 可以显示作为光瞳坐标函数的光线像差。 对于视场内任意一点&#xff0c;取其子午面内的光线&#xff0c;以光线在光阑面上的透射点坐标为横…

IDEA 使用

目录 Git.gitignore 不上传取消idea自动 add file to git撤销commit的内容本地已经有一个开发完成的项目&#xff0c;这个时候想要上传到仓库中 Git .gitignore 不上传 在项目根目录下创建 .gitignore 文件夹&#xff0c;并添加内容&#xff1a; .gitignore取消idea自动 add…

毛玻璃态卡片悬停效果

效果展示 页面结构组成 页面的组成部分主要是卡片。其中卡片的组成部分主要是包括了图片和详情。 卡片的动效是鼠标悬停在卡片上时&#xff0c;图片会移动到左侧&#xff0c;并且图片是毛玻璃效果。所以我们在布局的时候图片会采用绝对布局。而详情则是基础布局。 CSS3 知识…

PS 切片工具 选择切片 切片存储

上文 PS 透视裁剪工具 中 我们简单讲述了透视裁剪工具 今天 我们来讲他后面的切片工具 首先 他的用途还是很多的 例如 你有一个很大的图片 其中包括 轮播 导航 主题内容 但他们都在一个图片上 你就可以用切片工具 将完整的图片切成多个部分 这里 我们选择了切片工具 光标也会…

Drift plus penalty 漂移加惩罚Part1——介绍和工作原理

文章目录 正文Methodology 方法论Origins and applications 起源和应用How it works 它是怎样工作的The stochastic optimization problem 随机优化问题Virtual queues 虚拟队列The drift-plus-penalty expression 漂移加惩罚表达式Drift-plus-penalty algorithmApproximate sc…