Ajax 学习

news2024/11/18 11:16:57

文章目录

  • 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')
}

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

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

相关文章

使用DBeaver的第2天-使用sql导入数据

使用sql导入数据这块我会仔细的说一下 首先位置一定要放在库上&#xff08;实例&#xff09;&#xff0c;放在表上可不好使用哦 然后点击工具-再点击执行脚本 这样就执行成功了 但是如果你执行失败了&#xff0c;多半可能是因为本地没有部署mysql&#xff0c;记住只有本地有…

搜索引擎的设计与实现(四)

目录 6 系统测试 6.1测试重要性 6.2测试用例 结 论 参 考 文 献 前面内容请移步 搜索引擎的设计与实现&#xff08;三&#xff09; 免费源代码&毕业设计论文 搜索引擎的设计与实现 6 系统测试 6.1测试重要性 该项目是在本地服务器上进行运行和调试&#xff0c;…

BOM部分

一&#xff0c;概述 二&#xff0c;Windows对象常见的事件 1.窗口加载事件 上面那个是会等页面都加载完了&#xff0c;在进行函数的调用或者触发事件&#xff0c;如&#xff08;图像&#xff0c;文本&#xff0c;css&#xff0c;js等&#xff09;&#xff0c;所以那个声明可以…

IT行业找工作十面十败,不妨试试鸿蒙开发岗~

近期某脉上看到这样一则帖子&#xff0c;讨论的非常激烈&#xff01; 相信也有不少人有和他这情况类似&#xff0c;像他这种失业的状态&#xff0c;近两年大家或多或少都深有体验。由于互联网行业进过了十几年的快速发展&#xff0c;从2G→3G→4G→5G&#xff0c;在这个期间人们…

Linux基础之进程-进程状态

目录 一、进程状态 1.1 什么是进程状态 1.2 运行状态 1.2 阻塞状态 1.3 挂起状态 二、Linux操作系统上具体的进程状态 2.1 状态 2.2 R 和 S 状态的查看 2.3 后台进程和前台进程 2.4 休眠状态和深度休眠状态 一、进程状态 1.1 什么是进程状态 首先我们知道我们的操作系…

未来互联网:Web3的技术革新之路

引言 随着技术的不断发展和社会的日益数字化&#xff0c;互联网作为信息交流和社交媒介的重要平台已经成为我们生活中不可或缺的一部分。然而&#xff0c;传统的互联网架构在数据安全、隐私保护和去中心化等方面存在着诸多挑战。为了解决这些问题&#xff0c;Web3技术应运而生…

【js】获取媒体流实现拍照功能,摄像头切换

<script setup>import {onMounted,reactive,ref} from vueconst videoConstraints reactive({width: 500,height: 300});let picArr reactive([])let videoNode ref(null)let show ref(true)let stream reactive({})onMounted(async () > {// 获取视频流&#xf…

C++语法|深入理解 new 、delete

在开发过程中&#xff0c;非常重要的语法就有我们new和delete&#xff0c;周所周知在C中最为强大的能力就是对内存的控制&#xff0c;所以我们再怎么强调new和delete都不为过 文章目录 1.new和delete基本语法new和malloc的区别是什么&#xff1f;(1)开辟单个元素的内存差别(2)开…

Python专题:十三、日期和时间(2)

datetime 模块 today()函数 date类型 year month day

摊还分析

一、摊还分析 概念&#xff1a;是求数据结构中一个操作序列执行所有操作的平均时间&#xff0c;与平均复杂度不同&#xff0c;它不涉及输入概率&#xff0c;能够保证在最坏情况下操作的平均性能。 适用场景&#xff1a;用含 n 个操作的序列&#xff08;o1&#xff0c;o2&#x…

互联网轻量级框架整合之HibernateMyBatis

持久层框架 Hibernate 假设有个数据表&#xff0c;它有3个字段分别是id、rolename、note, 首先用IDEA构建一个maven项目Archetype选择org.apache.maven.archetypes:maven-archetype-quickstart即可&#xff0c;配置如下pom <project xmlns"http://maven.apache.org/…

ERROR: tensorboard 1.14.0 has requirement setuptools>=41.0.0(问题解决)

问题描述&#xff1a; ERROR: tensorboard 1.14.0 has requirement setuptools>41.0.0, but youll have setuptools 39.2.0 which is incompatible. 问题原因&#xff1a; setuptools 版本太低 解决方法&#xff1a;升级setuptools版本 pip install --upgrade setuptools…

Notepad8.1.9汉化中文版

下载地址&#xff1a;Notepad8.1.9.zip 一款优秀免费的源代码编辑器&#xff0c;支持语法高亮的开源纯文本编辑器&#xff0c;并且可以替代系统自带的记事本的功能。

40V/300mA快速瞬态低压差线性稳压器替代ADP7142

概述(替代ADP7142/LT1962/LT1521/LT3060) PCD4900 是一款 CMOS、低压差&#xff08;LDO&#xff09;线性稳压器&#xff0c;采用 1.9V 至 40V 电源供电&#xff0c;最大输出电流为 300 mA。这款高输入电压 LDO 适用于调节 36V 至 1.2V 供电的高性能模拟和混合信号电路。该器件…

iOS copy的正确姿势

参考文章 知识准备&#xff08;理解堆栈&#xff09; 堆区&#xff1a; 程序员管理 若程序员不释放&#xff0c;由os释放不同于数据结构中的堆&#xff0c;堆区的结构类似于数据结构中的链表栈区&#xff1a; 由编译器来管理 存放函数参数值&#xff0c;局部变量的值等结构类似…

C语言(指针)7

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

nestjs封装一个响应体

封装一个DTO // response.dto.tsimport {CallHandler,ExecutionContext,Injectable,NestInterceptor, } from "nestjs/common"; import { FastifyReply } from "fastify"; import { Observable } from "rxjs"; import { map } from "rxjs/…

苹果macOS无法给App麦克风授权解决办法

好久没有在电脑上录制课程了&#xff0c;有些东西还是录下来记忆深刻&#xff0c;却意外发现MAC系统升级后无法授权给第三方的App使用摄像头和麦克风&#xff0c;而录屏软件是需要开启麦克风和摄像头才能录制屏幕上的操作和声音&#xff0c;官方提示在第三方APP若有使用摄像头和…

echarts切换tab,图表设置宽度100%结果为100px

当外层div盒子设置宽度为100%时&#xff0c;可echarts渲染出来宽度只有100px&#xff0c;这种情况大多数echarts所在的div设置了display:none&#xff0c;获取不到外部盒子的宽度。 这里可以通过echarts源码获取宽度的行为来解释 究其原因就是出现在了图表设置了display:none…

【从零开始实现stm32无刷电机foc】【理论】【1/6 电机旋转本质】

目录 电机旋转需要什么样的力&#xff1f;怎么产生力矢量&#xff1f;怎么产生任意的线圈磁矢量&#xff1f; 电机旋转需要什么样的力&#xff1f; 电机切向存在受力&#xff0c;电机就会旋转。 进一步查看电机结构&#xff0c;分为转子和定子&#xff0c;大部分情况下&#…