百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

编写个人的Ajax:感受前端异步世界的魅力

nanshan 2025-03-19 14:58 13 浏览 0 评论

何为Ajax:


当今数字时代,互联网的发展让我们的网页愈发交互且动感十足。你是否曾想过这些令人惊艳的网页是如何实现的呢?答案之一就在于 Ajax(Asynchronous JavaScript and XML)技术。在本文中动手实现属于你自己的 Ajax 请求!

Ajax,这个听起来充满未知魔力的缩写,实际上代表了一种让网页实现异步数据交换的技术。通过 Ajax,我们能够在不刷新整个页面的情况下,动态地加载和更新数据,为用户提供更加流畅和即时的体验。

你是否曾想过,这些异步请求是如何工作的?只需一点前端魔法的指引,你也能够轻松掌握手写 Ajax 的技巧。

在本文中,我们将深入了解 Ajax 的工作原理,并通过实际动手的方式,逐步构建一个简单而强大的异步请求。

手写代码:

 // 兼容性·IE6.0以前 现在没什么必要 IE -> Edge
                const xhr =
                    XMLHttpRequest
                        ? new XMLHttpRequest()
                        : new ActiveXObject('Microsoft.XMLHTTP')
                xhr.open('GET', url, false)
                // 宏任务 事件
                xhr.onreadystatechange = function () {
                    if (xhr.readyState !== 4)
                        // 叼一下 表现一下 304 Not Modified 没有修改
                        if (xhr.status === 200 || xhr.status === 304) {
                            resolve(xhr.responseText);
                        } else {
                            rejecct(new Error(xhr.responseText))
                        }
                }
                xhr.send();
                // onreadyStateChange 
                // setTimeout(() => {
                //     resolve('gigi')
                // }, 1000)
            })
        };

在这段代码中,主要完成了使用 XMLHttpRequest 对象进行同步(xhr.open('GET', url, false))Ajax 请求的操作。让我逐步解释这段

代码:

  • 创建 XMLHttpRequest 对象:
const xhr = XMLHttpRequest
                ? new XMLHttpRequest()
                : new ActiveXObject('Microsoft.XMLHTTP');
if (window.XMLHttpRequest) { 
// 现代浏览器支持
XMLHttpRequest xhr = new XMLHttpRequest();
} else { 
// 旧版 Internet Explorer 使用 ActiveXObject 
xhr = new ActiveXObject('Microsoft.XMLHTTP'); }
  • 这里使用了三元运算符来检测浏览器是否支持 XMLHttpRequest 对象,当然也可以使用if判断的方式。如果支持,就创建一个新的 XMLHttpRequest 对象;否则,使用 ActiveXObject('Microsoft.XMLHTTP') 来创建对象,适配一些较旧的浏览器。其实对于现在绝大多数浏览器中,基本不会存在不支持XMLHttpRequest的情况,所以上面那份代码其实是可以不写的。但在面试的过程中,手写Ajax对于我们来说是必备的,当然其他面试者一样如此,所以可以加入上面的代码,告诉面试官你是为了避免出现由于旧版浏览器不支持XMLHttpRequest使得Ajax无法实现,加入一个判断,用于避免这种情况。这样一来,你就比其他面试者更具优势,面试官也会更容易记住你。初始化 XMLHttpRequest 对象:
  • xhr.open('GET', url, false);

    • 这行代码使用 open 方法初始化 XMLHttpRequest 对象。它指定了请求的类型(GET)、URL 和是否使用异步(false 表示同步)。值得注意的是,同步请求在现代 web 开发中已不推荐使用,因为它可能会导致页面冻结,用户体验差,且在主流浏览器中逐渐被废弃。
    1. 监听 onreadystatechange 事件:
    xhr.onreadystatechange = function () {
        if (xhr.readyState !== 4)
            if (xhr.status === 200 || xhr.status === 304) {
                resolve(xhr.responseText);
            } else {
                reject(new Error(xhr.responseText))
            }
    };
    1. onreadystatechange 事件是一个在 XMLHttpRequest 对象的 readyState 属性发生变化时触发的事件。readyState 属性表示请求的状态,其中 4 表示请求已完成。当 readyState 不等于 4 时,这段代码不执行任何操作,因为这表示请求仍在进行中。当 readyState 等于 4 时,表示请求已完成,进入这个条件分支。

    在这个条件分支中,检查 xhr.status,它表示 HTTP 响应的状态码。状态码 200 表示成功,而 304 表示资源未被修改,可以从缓存中加载。如果状态码是 200 或 304,则将 Promise 置为成功状态,调用 resolve 函数,传递响应文本 (xhr.responseText)。如果状态码不是 200 或 304,则说明请求失败,将 Promise 置为拒绝状态,调用 reject 函数,并传递一个包含错误信息的新 Error 对象。讲到这里,我要提醒一下大家,在面试的过程中,当你的代码中出现状态码,那么请做好准备,面试官很有可能会把所有的HTTP状态码都问你一遍,这其实是好事,可以增加你在面试过程中的时间,帮你更轻松的度过面试死亡时间,因为比起面试官的其他问题,这个状态码简直不要太简单,希望大家有时间就看看,并没有多少。我在文章结尾会补充说明把状态码发出来,希望对你有所帮助。

    • 发送请求:
    • ini
    • 复制代码

    xhr.send();
    • 最后,使用 send 方法发送请求。

    总体来说,这段代码是一个非常基础的使用 XMLHttpRequest 对象进行同步 Ajax 请求的例子。然而,现代的 web 开发更倾向于使用异步请求,通常使用 fetch 或类似的 API,因为它们提供更好的性能和用户体验。

    总结:

    在本文中,我们深入研究了 Ajax 技术的本质,揭示了它在现代前端开发中的不可或缺的角色。通过手写 Ajax,我们掌握了异步请求的核心概念,以及如何使用纯粹的 JavaScript 在网页上实现动态数据交换。

    我们了解到,Ajax 不再是前端魔法师的专属工具,而是每个开发者都能够掌握的技能。通过实际动手的练习,我们发现了异步编程的奇妙之处,以及在网页交互中如何利用 Ajax 构建更加响应式和流畅的用户体验。

    但这只是前端开发旅程的开始。在未来的学习中,你可以进一步探索现代工具和框架,如 Fetch API、Axios 等,它们提供了更强大和便捷的方式来处理异步请求。同时,深入理解 Promise 和 async/await 等概念将使你更加游刃有余地处理异步编程挑战。

    无论你是初学者还是经验丰富的开发者,手写 Ajax 是一个深入理解前端技术根基的重要一步。希望本文能够激发你对前端开发的兴趣,并为你在这个令人兴奋的领域中迈出更大的步伐提供了坚实的基础。

    感谢阅读,愿你在前端的旅途中不断探索、学习、创造,成为一位优秀的前端工程师!如果文章对你有所帮助,还望点个赞支持一下。

    补充说明:HTTP状态码

    HTTP 协议使用状态码(HTTP status codes)来表示请求的处理结果。状态码是服务器对客户端发起的请求的响应的一部分,它提供了关于请求处理成功与否、出现错误的信息。

    以下是常见的 HTTP 状态码,它们不仅适用于 HTML,也适用于其他资源的请求:

    • 1xx(信息):
      • 100 Continue:服务器已经接收到请求头,并且客户端应继续发送请求体。
    • 2xx(成功):
      • 200 OK:请求成功。
      • 201 Created:请求已经被实现,新资源已经依据请求的需要而建立。
      • 204 No Content:服务器成功处理了请求,但没有返回任何内容。
    • 3xx(重定向):
      • 301 Moved Permanently:被请求的资源已永久移动到新位置。
      • 302 Found:被请求的资源在新的位置临时找到。
      • 304 Not Modified:资源未被修改,可以使用缓存的版本。
    • 4xx(客户端错误):
      • 400 Bad Request:服务器未能理解请求。
      • 401 Unauthorized:请求要求身份验证。
      • 403 Forbidden:服务器理解请求,但拒绝执行。
      • 404 Not Found:服务器找不到请求的资源。
    • 5xx(服务器错误):
      • 500 Internal Server Error:服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。
      • 502 Bad Gateway:作为网关或代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
      • 503 Service Unavailable:服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。


    编写你自己的Ajax:探索前端异步世界
    原文链接:
    https://juejin.cn/post/7311893415151517736


    相关推荐

    0722-6.2.0-如何在RedHat7.2使用rpm安装CDH(无CM)

    文档编写目的在前面的文档中,介绍了在有CM和无CM两种情况下使用rpm方式安装CDH5.10.0,本文档将介绍如何在无CM的情况下使用rpm方式安装CDH6.2.0,与之前安装C5进行对比。环境介绍:...

    ARM64 平台基于 openEuler + iSula 环境部署 Kubernetes

    为什么要在arm64平台上部署Kubernetes,而且还是鲲鹏920的架构。说来话长。。。此处省略5000字。介绍下系统信息;o架构:鲲鹏920(Kunpeng920)oOS:ope...

    生产环境starrocks 3.1存算一体集群部署

    集群规划FE:节点主要负责元数据管理、客户端连接管理、查询计划和查询调度。>3节点。BE:节点负责数据存储和SQL执行。>3节点。CN:无存储功能能的BE。环境准备CPU检查JDK...

    在CentOS上添加swap虚拟内存并设置优先级

    现如今很多云服务器都会自己配置好虚拟内存,当然也有很多没有配置虚拟内存的,虚拟内存可以让我们的低配服务器使用更多的内存,可以减少很多硬件成本,比如我们运行很多服务的时候,内存常常会满,当配置了虚拟内存...

    国产深度(deepin)操作系统优化指南

    1.升级内核随着deepin版本的更新,会自动升级系统内核,但是我们依旧可以通过命令行手动升级内核,以获取更好的性能和更多的硬件支持。具体操作:-添加PPAs使用以下命令添加PPAs:```...

    postgresql-15.4 多节点主从(读写分离)

    1、下载软件[root@TX-CN-PostgreSQL01-252software]#wgethttps://ftp.postgresql.org/pub/source/v15.4/postg...

    Docker 容器 Java 服务内存与 GC 优化实施方案

    一、设置Docker容器内存限制(生产环境建议)1.查看宿主机可用内存bashfree-h#示例输出(假设宿主机剩余16GB可用内存)#Mem:64G...

    虚拟内存设置、解决linux内存不够问题

    虚拟内存设置(解决linux内存不够情况)背景介绍  Memory指机器物理内存,读写速度低于CPU一个量级,但是高于磁盘不止一个量级。所以,程序和数据如果在内存的话,会有非常快的读写速度。但是,内存...

    Elasticsearch性能调优(5):服务器配置选择

    在选择elasticsearch服务器时,要尽可能地选择与当前业务量相匹配的服务器。如果服务器配置太低,则意味着需要更多的节点来满足需求,一个集群的节点太多时会增加集群管理的成本。如果服务器配置太高,...

    Es如何落地

    一、配置准备节点类型CPU内存硬盘网络机器数操作系统data节点16C64G2000G本地SSD所有es同一可用区3(ecs)Centos7master节点2C8G200G云SSD所有es同一可用区...

    针对Linux内存管理知识学习总结

    现在的服务器大部分都是运行在Linux上面的,所以,作为一个程序员有必要简单地了解一下系统是如何运行的。对于内存部分需要知道:地址映射内存管理的方式缺页异常先来看一些基本的知识,在进程看来,内存分为内...

    MySQL进阶之性能优化

    概述MySQL的性能优化,包括了服务器硬件优化、操作系统的优化、MySQL数据库配置优化、数据库表设计的优化、SQL语句优化等5个方面的优化。在进行优化之前,需要先掌握性能分析的思路和方法,找出问题,...

    Linux Cgroups(Control Groups)原理

    LinuxCgroups(ControlGroups)是内核提供的资源分配、限制和监控机制,通过层级化进程分组实现资源的精细化控制。以下从核心原理、操作示例和版本演进三方面详细分析:一、核心原理与...

    linux 常用性能优化参数及理解

    1.优化内核相关参数配置文件/etc/sysctl.conf配置方法直接将参数添加进文件每条一行.sysctl-a可以查看默认配置sysctl-p执行并检测是否有错误例如设置错了参数:[roo...

    如何在 Linux 中使用 Sysctl 命令?

    sysctl是一个用于配置和查询Linux内核参数的命令行工具。它通过与/proc/sys虚拟文件系统交互,允许用户在运行时动态修改内核参数。这些参数控制着系统的各种行为,包括网络设置、文件...

    取消回复欢迎 发表评论: