原生AJAX

news2025/1/11 20:42:23

 👨‍💻个人主页:@微微的猪食小窝
欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
本文由 微微的猪食小窝 原创

 1、AJAX 简介

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

 如何创建一个原生的ajax 

上代码!!! 


//第一步  先城建一个ajax的核心 XMLHttpRequest
let xhr = new XMLHttpRequerst();
//第二步  使用open 创建请求 第一个参数是请求方式 第二个是请求的地址  第三个是同步或者异步
xhr.open('GET',"https://www.baidu.com",false)
//如果是post请求  必须要写请求头
xhr.setRequestHeader('') //设置请求头
//第三步  为xhr.onreadystatechange  设置监听事件
xhr.onreadystatechange = function(){
    if(xhr.readyState == 4) {
    if(xhr.status == 200){
    alert(xhr.responseTwxt)
//readyState  0 请求未初始化  刚刚实例化XMLHttpRequest
//readyState  1 客户端与服务器建立链接  调用open方法
//readyState  2 请求已经被接收
//readyState  3 请求正在处理中
//readyState  4 请求成功
            }
       }
}
// 第四步 发送请求数据  调用send 发送请求 如果不需要参数就写一个null
xhr.send(null)

携带参数的Ajax请求 

1、get请求

const xhr = new XMLHttpRequest()
// 参数拼接在url后面
xhr.open("GET","http://www.baidu.com?a=1&b=2")
xhr.send()

2、post请求

const xhr = new XMLHttpRequest()
xhr.open("GET","http://www.baidu.com")
// 参数作为send函数的实参传递
xhr.send("a=1&b=2")

 Ajax处理超时和网络异常

处理超时

const xhr = new XMLHttpRequest()
// 设置超时时间
xhr.timeout = 2000
// 设置超时后的回调
xhr.ontimeout = function(){
	alert('请求超时!')
}
xhr.open("GET","http://www.baidu.com")
xhr.send()

 处理网络异常

const xhr = new XMLHttpRequest()
// 设置出现网络异常后的回调函数
xhr.onerror = function(){
	alret("网络异常!")
}
xhr.open("GET","http://www.baidu.com")
xhr.send()

 取消请求

取消请求:abort()函数

<body>
    <button>发送请求</button>
    <button>取消请求</button>
</body>
<script>
	// 获取按钮
    const btns = document.getElementsByTagName('button')
    // 创建xhr对象
    let xhr = new XMLHttpRequest()
    // 绑定点击函数
    btns[0].onclick = function(){
        xhr.open('GET','http://127.0.0.1:8000/server')
        xhr.send("111")
    }
    btns[1].onclick = function(){
    	// 取消请求
        xhr.abort()
    }
</script>

2、Ajax的特点

优点

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

缺点

  • 没有浏览历史,不能回退
  • 存在跨域问题(同源)
  • SEO不友好,网页中的内容爬虫爬不到

3、http常见的状态码  

(代码上的200 就是状态码 表示成功)

  • 100—199  请求正在处理中
  • 200—299  一般都是表示成功 
  • 300—399  表示重定向
  • 400—499  资源找不到 客户端报错
  • 500—599  服务器内部报错

4、跨域问题


为什么会出现跨域
出现跨域问题是由于同源策略的限制

同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。

同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)。
 

什么是跨域

当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域。

5、解决跨域

jsonp

script标签天生具有跨域能力,通过向页面中添加一个新的script标签来向服务器发送请求,服务器返回一个函数调用,要返回的数据作为这个函数的实参。

 页面:

<body>
    <button>点击获取数据</button>
    <p></p>
    <script>
        // 获取button和p
        const btn = document.getElementsByTagName('button')[0]
        const p = document.getElementsByTagName('p')[0]

        // 声明handle函数
        function handle(data){
            p.innerHTML = data.msg
        }

        // 绑定单击事件
        btn.onclick = function(){
            // 创建一个新的script标签
            const script = document.createElement('script')
            // 设置src属性,即要请求的服务器地址
            script.src = 'http://127.0.0.1:9000/test'
            // 将新的script标签放入页面中,即发送请求
            document.body.appendChild(script)
        }
    </script>
</body>

 服务器:

// 引入express
const express = require('express')

// 创建应用对象
const app = express()

// 创建路由规则
app.all('/test',(request,response)=>{
    const data = {msg:'hello!'}
    let str = JSON.stringify(data)
    // 设置响应体,返回一个函数调用,将要返回的数据作为实参
    response.send(`handle(${str})`)
})

// 监听端口,启动服务
app.listen(9000,()=>{
    console.log('服务已启动,正在监听9000...')
})

 

6、CORS


跨源资源共享 (CORS) (或通俗地译为跨域资源共享)是一种基于HTTP 头的机制,该机制通过允许服务器标示除了它自己以外的其它origin(域,协议和端口),这样浏览器可以访问加载这些资源。

跨源资源共享标准新增了一组 HTTP 首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。

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

设置CORS

app.all('/cors',(request,response)=>{
    // 设置响应头
    response.setHeader('Access-Control-Allow-Origin','*')
    response.send('hello,CORS')
})

 🌸欢迎关注我的博客:来和我一起成长吧
🥇往期精彩好文:

📢【CEAC 之《.NET程序设计工程师》】

📢【CEAC 之《企业信息化管理》】
📢【ASP.NET(C#) 面试总结面试题大全】

📢【Vue·高频前端面试题汇总】

你们的点赞👍 收藏⭐ 留言📝 关注✅
是我持续创作,输出优质内容的最大动力!
谢谢

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

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

相关文章

Vue3留言墙项目——主体部分静态、mock

文章目录主体头部主体关键部分小卡片组件创建mock数据以及使用主体头部 主体部分显示的内容&#xff0c;根据头部点击的是留言墙还是照片墙的按钮&#xff0c;显示不同的内容。 将照片墙和留言墙要渲染的数据抽取到一个js中&#xff0c;在导入的Main.vue&#xff08;主体页面&…

[go]汇编ASM简介

文章目录汇编(ASM)寄存器帧指针FP常见指令函数示例生成汇编Go汇编代码主要用于优化和与底层系统交互&#xff0c;并不会像其它的经典汇编代码那样独立运行。汇编(ASM) Go ASM是一种被Go编译器使用的特殊形式的汇编语言&#xff08;伪汇编&#xff09;&#xff0c;它基于Plan9输…

记录一次Powerjob踩的坑(Failed to deserialize message)

一. 问题描述: 在本地开发环境, server端和worker都运行正常. 但是发布到SIT环境(容器)的时候, 服务端却监测不到worker(worker可以找到服务端) 二. 问题表现: 1.服务端看不到Worker信息 2. 服务端日志信息 : Failed to deserialize message from [akka://oms111.111.111…

ECMAScript modules规范示例详解

引言 很多编程语言都有模块这一概念&#xff0c;JavaScript 也不例外&#xff0c;但在 ECMAScript 2015 规范发布之前&#xff0c;JavaScript 没有语言层面的模块语法。模块实际上是一种代码重用机制&#xff0c;要实现代码重用&#xff0c;将不同的功能划分到不同的文件中是必…

pycharm安装并加载编译器,设置背景图片,手把手详细操作

pycharm安装并加载编译器&#xff0c;设置背景图片&#xff0c;手把手详细操作 pycharm社区版&#xff08;免费&#xff09;下载官网 双击安装包&#xff0c;选择安装路径 勾选这两个&#xff0c;其实全不勾也没事 下一步默认就行&#xff0c;点install 安装完成后&#xf…

mimikatz抓取密码实战

必须下载最新版本 Releases gentilkiwi/mimikatz GitHubhttps://github.com/gentilkiwi/mimikatz/releases 有32和64之分&#xff0c;systeminfo查看自己版本 首先我们用后门得到权限&#xff0c;在用getsystem提权&#xff0c;因为mimikatz要system权限&#xff0c;getuid…

Python基础-1-环境搭建(初体验)

一&#xff1a;开发环境 Linux-5.15.0&#xff08;Ubuntu22.04&#xff09; 二&#xff1a;安装Python3 1、安装&#xff1a;sudo apt-get install python3 2、版本查询&#xff1a; python3 --version python3进入python解释器也可查询对应版本&#xff0c;按CtrlD或执行…

力扣(LeetCode)20. 有效的括号(C++)

栈模拟 一次遍历字符串 sss &#xff0c; 遇到左括号则入栈&#xff0c;遇到右括号则匹配栈顶。如果右括号匹配成功 &#xff0c; 栈顶元素弹栈 &#xff0c; 匹配不成功 &#xff0c; 则 returnfalsereturn\ \ falsereturn false 。 提示 : 当遍历完所有字符&#xff0c;记…

【计算机网络】扩展以太网方法总结

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录物理层扩展以太网链路层扩展以太网网桥网桥分类透明网桥源路由网桥多接口网桥----以太网交换机直通式交换机存储转发式交换机冲突域与广播域&#x1f343;博主昵称&#xff1a;一拳必胜客 &#x1f338;博主…

LinkedList详解

介绍 众所周知ArrayList底层数据结构是数组&#xff0c;但是数组有个缺点&#xff0c;虽然查询快&#xff0c;但是增删改会慢因为数组是在连续的位置上面储存对象的应用。当我们删除某一个元素的时候在他后面的元素的索引都会左移&#xff0c;导致开销会很大。所以LinkedList应…

Linux系统下交叉编译工具的安装实现

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;如何使用Linux系统下的交叉编译工具链的方法。 目录 第一:交叉编译工具链基本简介 ​第二&#xff1a;交叉编译工具安装方法 ​第三&#xff1a;安装相关库 ​第四&#xff1a;交叉编译工具验证 第一:交叉编译工具链基…

0100 蓝桥杯真题03

import java.util.Scanner; /* * 题目描述 * 如下图所示&#xff0c;3 x 3 的格子中填写了一些整数。 --*---- |10* 1|52| --****-- |20|30* 1| *******-- | 1| 2| 3| ------ *我们沿着图中的星号线剪开&#xf…

【Redis-04】Redis两种持久化方式(RDB和AOF)

Redis是基于内存的数据结构服务器&#xff0c;保存了大量的键值对数据&#xff0c;所以持久化到磁盘是非常必要的&#xff0c;Redis提供了两种持久化的方式&#xff0c;分别是RDB和AOF。下面我们看下这两种持久化方式的具体实现原理。 1.RDB持久化 首先&#xff0c;RDB持久化方…

Mysql基础

Mysql基础1. 数据库相关概念1.1 数据库1.2 数据库管理系统1.3 常见的数据库管理系统1.4 SQL2. Mysql的安装2.1 MySQL数据模型3. SQL概述3.1 SQL简介3.2 通用语法3.3 SQL分类4. DDL:操作数据库4.1 数据库的显示讲解4.2 查询4.3 创建数据库4.4 删除数据库4.5 使用数据库4.6 小结5…

linux Qt编译自己的动态库(.so),详细全流程

本篇记录Qt编译动态库全流程 1. 建立工程 首先&#xff0c;打开Qt&#xff0c;新建C Library 工程 点击choose之后&#xff0c;输入项目名称为Example&#xff0c;一直下一步即可 生成的项目里边有三个文件&#xff0c;分别是example.h, Example_global.h, example.cpp exam…

数据结构之:递归思想

&#xff08;一&#xff09;递归概念 将复杂问题 递推分解为最简问题 然后将结果回归的过程 Windows - Linux Linux Linux is not Unix 使用方法&#xff1a; 自己调用自己&#xff08;二&#xff09;斐波那契数列 兔子问题 有一对大兔子 每个月繁衍 一对小兔子&#xff08;一…

【Java 设计模式】UML 之类图

UML 之类图前言&#xff1a;什么是 UML &#xff1f;1 类图概念2 类的表示方式3 类与类之间关系的表示方式3.1 关联关系3.1.1 单向关联3.1.2 双向关联3.1.3 自关联3.2 聚合关系3.3 组合关系3.4 依赖关系3.5 继承关系3.6 实现关系前言&#xff1a;什么是 UML &#xff1f; 定义…

Linux 软件包下载加速工具:APT Proxy

本篇文章将继续介绍这个仅有 2MB 身材大小的 Linux 软件包缓存和加速工具&#xff1a;APT Proxy。 相比老牌的 apt cacher ng 而言&#xff0c;除了尺寸更小、内存占用更低&#xff08;10M以内&#xff09;、它还拥有无需配置&#xff0c;开箱即用等特点。 写在前面 年中的时…

!与~有什么区别

目录 将整型数据转换为二进制的函数 利用函数查看&#xff01;与~之后的数据有何不同 以一个非0数据作为例子 以0作为例子 我们都知道&#xff01;与~都是用于取反的。那么这两个有什么区别呢&#xff1f; 我们百度结果如下&#xff0c;很明显&#xff0c;八股文。我接下…

element-ui时间选择器(DatePicker )数据回显

系列文章目录 第一篇【element-ui】table表格底部合计自定义配置 目录 前言 一、element-ui时间选择器&#xff08;DatePicker &#xff09;是什么&#xff1f; DatePicker 日期选择器 二、返回数据格式 1.引入 总结 前言 需求&#xff1a;element-ui时间选择器&#…