Ajax 学习

文章目录

  • 1. 前置知识
    • 1.1 ajax 介绍
    • 1.2 XML 简介
  • 2. AJAX 学习
    • 2.1 AJAX基础学习
      • (1)AJAX的特点
      • (2)AJAX 初体验
      • (3)服务端响应json 数据
    • 2.2 IE 缓存问题
    • 2.3 请求超时和网络异常
    • 2.4 手动取消请求
    • 2.5 重复请求
    • 2.6 jQuery 中的AJAX
    • 2.7 axios 中的AJAX
    • 2.8 fetch() 发送AJAX
  • 3. 跨域
    • 3.1 同源策略
    • 3.2 如何解决跨域
      • (1)JSONP
      • (2)CORS

1. 前置知识

1.1 ajax 介绍

AJAX全称为Asynchronous JavaScript And XML,就是异步的JS和XML。
通过AJAX可以在浏览器中向服务器发送异步请求,最大的优势:无刷新获取数据
AJAX不是新的编程语言,而是一种将现有的标准组合在一起使用的新方式。

用处:

  • 懒加载
  • 页面滚动到底之后在进行刷新新的内容
  • 用户名已被其他用户设置
  • 小米商城网页上端下拉表单的内容显示

1.2 XML 简介

XML可扩展标记语言。
XML被设计用来传输和存储数据。
XML和HTML类似,不同的是HTML中都是预定义标签;XML中没有预定义标签,
全都是自定义标签,用来表示些数据。
比如说我有一个学生数据:
name=“孙悟空”;age=18; gender=“男”;
用XML表示:

 <student>
<name>孙悟空</name>
<age>18</age>
<gender></gender>
</student>

现在已经被json 取代了

json({
name:'孙悟空',
age:18,
gender:'男'
})

2. AJAX 学习

2.1 AJAX基础学习

(1)AJAX的特点

  1. AJAX的优点
  • 可以无需刷新页面而与服务器端进行通信;
  • 允许你根据用户事件来更新部分页面内容。
  1. AJAX的缺点
  • 没有浏览历史,不能回退
  • 存在跨域问题(同源)
  • SEO不友好

(2)AJAX 初体验

**readystate:**是xhr对象中的属性,有0,1,2,3,4五个属性值;

  • 0:xhr 对象还未初始化完成;
  • 1:open()调用完成
  • 2:send()调用完成
  • 3:返回部分响应结果
  • 4:服务已返回全部响应结果

onreadystatechange事件就是指readystate改变一次就触发一次事件

let btn = document.getElementsByTagName('button')[0]
        let result = document.getElementById('result')
        btn.onclick = () => {
            // 创建ajax 请求
            // 1. 创建xhr 对象
            const xhr = new XMLHttpRequest()

            // 2. 初始化 设置请求方法和url 
            xhr.open('GET','http://127.0.0.1:8000/server')
            
            // 3. 发送
            xhr.send()

            // 4. 事件绑定 处理服务端返回的结果
            xhr.onreadystatechange = ()=>{
                if(xhr.readyState === 4){
                    if(xhr.status >= 200 && xhr.status < 300){
                        // console.log(xhr.status);
                        // console.log(xhr.statusText);
                        // console.log(xhr.getAllResponseHeaders);// 获取全部响应头内容
                        // console.log(xhr.response);// 获取响应体内容

                        result.innerHTML = xhr.response
                    }
                }
            }
        }

在这里插入图片描述

  1. get()
 // 2. 初始化 设置请求方法和url 
            xhr.open('GET','http://127.0.0.1:8000/server')
  1. post()
 // 2. 初始化 设置请求方法和url 
            xhr.open('POST','http://127.0.0.1:8000/server')
  1. 设置请求头
xhr.setRequestHeader('name','cherry')

(3)服务端响应json 数据

xhr.onreadystatechange = ()=>{
                if(xhr.readyState === 4){
                    if(xhr.status >= 200 && xhr.status < 300){
                        // console.log(xhr.status);
                        // console.log(xhr.statusText);
                        // console.log(xhr.getAllResponseHeaders);// 获取全部响应头内容
                        // console.log(xhr.response);// 获取响应体内容

                        result.innerHTML = xhr.response
                    }
                }
            }

2.2 IE 缓存问题

IE 浏览器存在一个问题:就是某个网站第二次刷新时会将缓存中的内容拿过来,也就是如果第一次刷新后我们更新了形影提数据,那么该网站在ie浏览器中呈现时将不会得到刷新后的内容,对于这种问题我们可以使用时间戳来实现。

xhr.open('post','http://127.0.0.1:8000/ie?t='+Date.now())

2.3 请求超时和网络异常

const xhr = new XMLHttpRequest()
            // 超时设置
            xhr.timeout = 2000// ms 2s之后无结果响应就不在向下执行
            xhr.ontimeout=()=>{
                alert('网络异常')
            }
            xhr.onerror=()=>{
                alert('网络连接异常')
            }

2.4 手动取消请求

上小节我们尝试了自动取消请求,这节来学习手动取消请求。

let btn =document.querySelectorAll('button')
        let xhr = null
        btn[0].onclick=()=>{
            xhr = new XMLHttpRequest()
            xhr.open('GET','http://127.0.0.1:8000/delay')
            xhr.send()
        }
        btn[1].onclick=()=>{
            xhr = new XMLHttpRequest()
           xhr.abort()
        }

2.5 重复请求

上个请求未响应就发送下个请求,服务器就需要频繁去处理,我们一般设置先去查询是否有相似的请求发送,如果有就先关闭上次请求,再发送新的请求。

let btn = document.querySelectorAll('button')
        let xhr = null

        // 标识变量
        let isSending = false

        btn[0].onclick = () => {
            if(isSending) x.abort()
            xhr = new XMLHttpRequest()

            isSending = true

            xhr.open('GET', 'http://127.0.0.1:8000/delay')
            xhr.send()

            xhr.onreadystatechange=()=>{
                if(xhr.readyState === 4){
                   isSending=false
                }
            }
        }
        btn[1].onclick = () => {
            xhr.abort()
        }

2.6 jQuery 中的AJAX

$('button').eq(0).click(()=>{
            $.get('http://127.0.0.1:8000/jquery',{a:100,b:20},(data)=>{
                console.log(JSON.parse(data));// data指的是响应体
            },'json')
            // 第二个参数设置的是请求参数
            // 第四个参数设置的是响应格式
        })

        $('button').eq(1).click(()=>{
            $.post('http://127.0.0.1:8000/jquery',{a:100,b:20},(data)=>{
                console.log(data);// data指的是响应体
            })
        })
        
// 自定义程度强时使用ajax()     
$('button').eq(2).click(()=>{
            $.ajax({
                url:'http://127.0.0.1:8000/delay',
                data:{a:100,b:20},// 请求参数
                type:'GET',// type/method 都可以
                // 响应体结果
                dataType:'json',
                // 成功的回调
                success:(data)=>{
                    console.log(data);
                },
                timeout:2000,// ms 超时时间
                error:()=>{
                    console.log('出错了');
                },
                // 请求头信息
                headers:{
                    d:100,
                    b:20
                }
            })
        })

2.7 axios 中的AJAX

// 配置之后 下面的get和post请求的路径会与之拼接
        axios.defaults.baseURl = 'http://127.0.0.1:8000'

        const btns = document.querySelectorAll('button')

        btns[0].onclick = () => {
            axios.get('/axios-server', {
                //Url
                params: {
                    id: 100,
                    cherry: 1
                },
                headers: {
                    name: 'cherry',
                    CharacterData: 'new bee'
                }
            }).then(value => {
                // axios 使用then() 返回响应体
                console.log(value);
            })
        }
        btns[1].onclick = () => {
            axios.post('/axios-server', {
                //请求体
                data: {
                    name: 'cherry',
                    CharacterData: 'new bee'
                }
            }, {
                //Url
                params: {
                    id: 100,
                    cherry: 1
                },
                //请求头
                headers: {
                    name: 'cherry',
                    CharacterData: 'new bee'
                }
            }).then(value => {
                // axios 使用then() 返回响应体
                console.log(value);
            })
        }

        // axios函数发送请求
        btns[2].onclick = () => {
            axios({
                method: 'post',
                url: '/axios-server',
                params: {
                    a: 100,
                    b: 200
                },
                headers: {
                    name: 'cherry',
                    purpose: '养好作息!认真学习'
                },
                data: {
                    name: 'cherry',
                    purpose: '养好作息!认真学习'
                }
            }).then(response => {
                console.log('养好作息!认真学习');
            })
        }

2.8 fetch() 发送AJAX

在这里插入图片描述

 let btn = document.querySelector('button')

        btn.onclick = () => {
            fetch('http://127.0.0.1:8000/fetch-server?cherry=NO.1',{
                method: 'POST',
                headers: {
                    name: 'cherry',
                    purpose: 'early to bed and early to up'
                },
                body: 'name=cherry&purpose=early to bed and early to up'  
            }).then(response => {
                return response.text()
                // return response.json()
            })
        }

3. 跨域

3.1 同源策略

同源策略(Same-Origin Policy)最早由Netscape公司提出,是浏览器的一种安全策略。
同源协议域名端口号必须完全相同。(当前页面和ajax 请求两者之间)

违背同源策略就是跨域。

3.2 如何解决跨域

(1)JSONP

JSONP是什么

JSONP(JSON with Padding),是一个非官方的跨域解决方案,纯粹凭借程序员的聪明
才智开发出来,只支持get请求

JSONP怎么工作的?

在网页有一些标签天生具有跨域能力,比如:< img>< link>< iframe>< script> 。
JSONP就是利用script标签的跨域能力来发送请求的。

原生JSONP的使用

  1. 动态的创建一个script标签
var script = document.createElement("script");
  1. 设置script的src,设置回调函数
script.src =  "http://localhost:3000/testAJAX?callback=abc";

检测用户名是否可用

    username:<input type="text" name="username" id="">
    <p></p>

    <script>
        const username = document.querySelector('input')
        const p= document.querySelector('p')

        function handle(data){
            p.innerHTML=data.msg
        }

        username.onblur = ()=>{
            let data = this.value
            let script = document.createElement('script')
            script.src = 'http://127.0.0.1:8000/checkUsername'
            document.body.appendChild(script)
        }
app.get('/checkUsername', (req, res) => {
    data = {
        name: 'cherry',
        msg:'NO USE'
    }
    str = JSON.stringify(data)
    // script 标签发请求时 send() 返回的内容应该是js 代码
    res.send(`handle(${str})`)
})

在这里插入图片描述

使用jQuery 发送JSONP 请求

 $('button').eq(0).click(() => {
            // 这个地方要注意 使用jsonp 发送请求 Url参数必须要有callback=? 固定语法 
            $.getJSON('http://127.0.0.1:8000/jsonpTest?callback=?', function (data) {
                $('#test') .html(`
                name:${data.name},<br>
                msg:${data.msg}
                `)
            })
        })

(2)CORS

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access control CORS

CORS是什么?

CORS(Cross–Origin Resource Sharing),跨域资源共享。CORS是官方的跨域解决方
案,它的特点是不需要在客户端做任何特殊的操作,完全在服务器中进行处理,支持
get和post请求。跨域资源共享标准新增了一组HTTP首部字段,允许服务器声明哪些
源站通过浏览器有权限访问哪些资源

CORS怎么工作的?

CORS是通过设置一个响应头来告诉浏览器,该请求允许跨域,浏览器收到该响应
以后就会对响应放行。

CORS的使用

主要是服务器端的设置:

router.get("/testAJAX", (req,res)=>{
    res.setHeader('Access-Control-Allow-Origin','*')
	res.send('hello')
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙 DevEcoStudio:用户名密码获取保存

【使用首选项实现用户名密码保存获取】 打开src/main/ets/entryability路径下的EntryAbility.ts文件 在 export default class EntryAbility extends UIAbility {onCreate(want, launchParam) {hilog.info(0x0000, testTag, %{public}s, Ability onCreate);下边添加内容&…

【JVM】调优工具

这里简单介绍一下各种调优用到的工具 一&#xff0c;环境准备 首先我们需要准备好Java环境&#xff0c;和win上的jdk环境&#xff08;图形化界面如jconsole只有jdk中有&#xff09;。 有这样一个类Prolem&#xff0c;每个线程都会带来100个垃圾对象&#xff0c;线程new完100…

智慧公厕,提升公共厕所管理效率的信息化变革

现代社会中&#xff0c;公共厕所的管理成为一个不可忽视的问题。随着城市化进程的加快&#xff0c;人们对公厕的需求日益增加&#xff0c;但公厕的管理却面临诸多困难。为了解决这一问题&#xff0c;智慧公厕应运而生&#xff0c;通过信息化的变革&#xff0c;提高公厕的管理效…

QT函数整理

目录 1. 适应高分辨率函数 1. 适应高分辨率函数 自动适应调整设备安装QT的UI分辨率&#xff1a; QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); 加载位置&#xff1a;

第四届辽宁省大学生程序设计竞赛

比赛经历&#xff1a;2024.5.14简单vp了一个小时只写出了签到题4个然后跑路了 补题&#xff1a;感觉其他题有点太抽象了主要补了一题&#xff0c;在区间问题中数据结构的使用 比赛链接[点我即可] 目录 A.欢迎来到辽宁省赛 B.胜率 F.隔板与水槽 H.取石子 L.区间与绝对值 …

第188题|幂级数的展开的常规方法(一)|武忠祥老师每日一题

解题思路&#xff1a;求幂级数有两种方法&#xff0c;一种是直接法&#xff0c;这里显然不太好求&#xff0c;还有一种是利用现有展开式展开&#xff0c;我们看到分母 可以分解因式成(x6)(x-1),进而拆解成一次式。拆解成一次式的目的是为了使用一下两个展开式。 第一步&#xf…

NARUTO 复现记录

1 环境配置 下载项目&#xff0c;一定要 git 下载全项目&#xff0c;下载完后要检查third_parities 里面的coslam和neural_slam_eval 文件全不全。 git clone --recursive https://github.com/oppo-us-research/NARUTO.git 环境配置 注意 bash scripts/installation/conda…

【哔哩哔哩下载】Bilidown,B站下载工具网站,永久免费使用NO.98

本文一共:448 个字,需要阅读:2 分钟,更新时间:2024年5 月14日,部分内容具有时效性,如有失效请留言,阅读量:0 输入B站视频网址就可以下载了 除了可以下载视频&#xff0c;还能获取弹幕、查看封面&#xff0c;如果你想解锁1080P画质&#xff0c;就需要扫码登录。 点击右下角的齿…

python “名称空间和作用域” 以及 “模块的导入和使用”

七、名称空间和作用域 可以简单理解为存放变量名和变量值之间绑定关系的地方。 1、名称空间 在 Python 中有各种各样的名称空间&#xff1a; 全局名称空间&#xff1a;每个程序的主要部分定义了全局的变量名和变量值的对应关系&#xff0c;这样就叫做全局名称空间 局部名称…

0508GoodsContent的Maven项目

0508GoodsContent的Maven项目包-CSDN博客 数据库字段 页面需求

OFDM802.11a的FPGA实现(十五)短训练序列:STS(含Matlab和verilog代码)

原文链接&#xff08;相关文章合集&#xff09;&#xff1a;OFDM 802.11a的xilinx FPGA实现 1.前言 在之前已经完成了data域数据的处理&#xff0c;在构建整个802.11a OFDM数据帧的时候&#xff0c;还剩下前导码和signal域的数据帧&#xff0c;这两部分的内容。 PLCP的前导部分…

八年前端开发之路中遇到的一些实用技巧分享——代码思路及通用场景

在开发中比较有用的代码思路 1. 链式编程2. 高阶函数应用-(添加数据并提供删除方法)3. 利用Promise链切入&#xff08;延迟执行&#xff09;4. 通过中间层来解决问题&#xff08;装饰者模式&#xff09;5. 单例模式 1. 链式编程 所谓链式编程即是函数调用后返回对象本身 let …

LoRA Land: 310个经微调的大语言模型可媲美GPT-4

摘要 低秩自适应 (LoRA) 已成为大语言模型 (LLM) 参数有效微调 (PEFT) 中最广泛采用的方法之一。LoRA 减少了可训练参数的数量和内存使用,同时达到了与全面微调相当的性能。该研究旨在评估在实际应用中训练和服务使用 LoRA 微调的 LLM 的可行性。首先,该研究测量了在 10 个基础…

搞什么副业可以月入过万?

月入过万的副业不是一件容易的事情&#xff0c;它需要你付出很多努力和时间。以下是一些可能能够实现月入过万的副业 1. 自媒体运营 通过开设自己的公众号、博客或YouTube频道&#xff0c;积累一定的粉丝和流量&#xff0c;然后通过广告、赞助、商品销售等方式赚取收入。 2. …

110份财务常用excel模板(个税、采购、报销、预算),超实用!

如果你还在为报表头疼&#xff0c;那你一定不能错过这篇干货满满的分享&#xff01; 个税报表 个人所得税&#xff0c;听起来就头大&#xff1f;别担心&#xff0c;掌握这些技巧&#xff0c;轻松搞定&#xff01; - 记录员工收入&#xff0c;确保数据准确无误 - 计算应纳税…

【Redis7】10大数据类型之Bitfield类型

文章目录 1. Bitfield简介2. BITFIELD key [GET type offset]3. BITFIELD key [SET type offset value]4. BITFIELD key [INCRBY type offset increment] 1. Bitfield简介 Bitfield(位域)命令可以将一个 Redis 字符串看作是一个由二进制位组成的数组&#xff0c; 并对这个数组…

Qwen-VL环境搭建推理测试

引子 这几天阿里的Qwen2.5大模型在大模型圈引起了轰动&#xff0c;号称地表最强中文大模型。前面几篇也写了QWen的微调等&#xff0c;视觉语言模型也写了一篇CogVLM&#xff0c;感兴趣的小伙伴可以移步Qwen1.5微调-CSDN博客。前面也写过一篇智谱AI的视觉大模型&#xff08;Cog…

c++编程(11)——string类的模拟实现

欢迎来到博主的专栏——c编程 博主ID&#xff1a;代码小豪 文章目录 前言string类的模拟实现string的成员对象构造、赋值、析构访问成员对象的接口访问字符串中的元素迭代器对字符序列的插入、删除元素操作mystring类的相关操作 mystring类的所有模拟实现以及测试案例 前言 本…

云服务器和主机的区别

在今天的数字化时代&#xff0c;对于个人和企业来说&#xff0c;选择适当的服务器托管解决方案至关重要。然而&#xff0c;很多人对于云服务器和传统主机之间的区别不太清楚。本文将为您提供一个详细的指南&#xff0c;帮助您理解云服务器与主机之间的区别&#xff0c;以便您能…

光耦 IS314W中文资料 IS314W引脚图及功能说明

IS314W是一款IGBT/MOSFET输出型光耦&#xff0c;由Isocom公司制造。它主要用于驱动用于电机控制和电源系统变频器的功率IGBT和MOSFET。以下是该产品的部分功能和参数&#xff1a; - 两个独立的光耦输出通道 - 轨对轨输出电压 - 最大峰值输出电流&#xff1a;1.0A - 最小峰值输…