Ajax——Ajax的同步与异步以及代码封装(jQuery)

2023-11-20

1. Ajax的异步与同步

1.1 同步与异步概念

  • 同步:指一个进程在执行某个请求的时候,如果该请求需要一段时间才能返回信息,那么这个进程会一直等待下去,直到收到返回信息才继续执行下去,不能同时执行进程

  • 异步:指进程不需要一直等待下去,而是继续执行下面的操作,不管其他进程的状态,当有信息返回的时候会通知进程进行处理,这样就可以提高执行的效率了,即异步是我们发出的一个请求,该请求会在后台自动发出并获取数据,然后对数据进行处理,在此过程中,我们可以继续做其他操作,不管它怎么发出请求,不关心它怎么处理数据,也可称之为并发数据。

1.2 Ajax在代码上的实现

// 假设这个是ajax请求1
// 如果第三个参数是false:这个就表示“ajax请求1”不支持异步,也就是说ajax请求1发送之后,会影响其他ajax请求的发送,只有当我这个请求结束之后,你们其他的ajax请求才能发送。
// false表示,不支持异步。我这个请求发了之后,你们其他的请求都要靠边站。都等着。你们别动呢,等我结束了你们再说。
xhr1.open("请求方式", "URL", false)
xhr1.send()

// 假设这个是ajax请求2
// 如果第三个参数是true:这个就表示“ajax请求2”支持异步请求,也就是说ajax请求2发送之后,不影响其他ajax请求的发送。
xhr2.open("请求方式", "URL", true) 
xhr2.send()

1.3 Ajax同步与异步使用的场景

例如:

  • 用户注册
    • 用户名需要发送ajax请求进行校验

    • 邮箱地址也需要发送ajax请求校验

    • 其他的也可能需要发送ajax请求。。。

    • 并且最终注册按钮的时候,也是发送ajax请求进行注册。

      • 那么显然,注册的Ajax请求和校验的ajax请求不能异步,必须等待所有的校验ajax请求结束之后,注册的ajax请求才能发。

2. Ajax代码的封装

2.1 Ajax代码封装的原因

  • AJAX请求相关的代码都是类似的,有很多重复的代码,这些重复的代码能不能不写,能不能封装一个工具类。要发送ajax请求的话,就直接调用这个工具类中的相关函数即可。

2.2 如何实现Ajax代码的封装

  • 手动封装一个工具类,这个工具类我们可以把它看做是一个JS的库。我们把这个JS库起一个名字,叫做jQuery。(我这里封装的jQuery只是一个前端的库,和后端的java没有关系,只是为了方便web前端代码的编写,提高WEB前端的开发效率)

  • 手写的jQuery源代码【存在bug,简单理解】

  • 开发时需要注意的内容:

    • 在判断是一个元素节点之后,将生成的变量改为全局变量,返回的是一个jQuery对象(全局变量已经满足可以随时使用,这里就需要返回一个jQuery(相当于一个类,可以使用jQuery调用对象的函数【blur,onclick…】)
    • 使用typeof()判断变量类型是字符串时是:string
    • $ == jQuery是将jQuery的名字变成了‘$’
function jQuery(selector){
    if (typeof selector == "string") {
        if (selector.charAt(0) == "#") {
            domObj = document.getElementById(selector.substring(1))
            return new jQuery()
        }
    }
    if (typeof selector == "function") {
        window.onload = selector
    }
    this.html = function(htmlStr){
        domObj.innerHTML = htmlStr
    }
    this.click = function(fun){
        domObj.onclick = fun
    }
    this.focus = function (fun){
        domObj.onfocus = fun
    }
    this.blur = function(fun) {
        domObj.onblur = fun
    }
    this.change = function (fun){
        domObj.onchange = fun
    }
    this.val = function(v){
        if (v == undefined) {
            return domObj.value
        }else{
            domObj.value = v
        }
    }

    // 静态的方法,发送ajax请求
    /**
     * 分析:使用ajax函数发送ajax请求的时候,需要程序员给我们传过来什么?
     *      请求的方式(type):GET/POST
     *      请求的URL(url):url
     *      请求时提交的数据(data):data
     *      请求时发送异步请求还是同步请求(async):true表示异步,false表示同步。
     */
    jQuery.ajax = function(jsonArgs){
        // 1.
        var xhr = new XMLHttpRequest();
        // 2.
        xhr.onreadystatechange = function(){
            if (this.readyState == 4) {
                if (this.status == 200) {
                    // 我们这个工具类在封装的时候,先不考虑那么多,假设服务器返回的都是json格式的字符串。
                    var jsonObj = JSON.parse(this.responseText)
                    // 调用函数
                    jsonArgs.success(jsonObj)
                }
            }
        }

        if (jsonArgs.type.toUpperCase() == "POST") {
            // 3.
            xhr.open("POST", jsonArgs.url, jsonArgs.async)
            // 4.
            xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
            xhr.send(jsonArgs.data)
        }

        if (jsonArgs.type.toUpperCase() == "GET") {
            xhr.open("GET", jsonArgs.url + "?" + jsonArgs.data, jsonArgs.async)
            xhr.send()
        }

    }
}
$ = jQuery

// 这里有个细节,执行这个目的是为了让静态方法ajax生效。
new jQuery()

2.3 Ajax代码封装的使用样例

  • 前端页面:
    • html代码编写
    • js代码就是用上面的
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试自己编写的jQuery库</title>
</head>
<body>
<script type="text/javascript" src="/ajax/js/jQuery-1.0.0.js"></script>
<script type="text/javascript">

    $(function () {
        $("#btn").click(function () {
            $.ajax({
                type: "POST",
                url: "/ajax/ajaxrequest11",
                async: true,
                data: "username=" + $("#username").val(),
                success: function (json){
                    $("#mydiv").html(json.username)
                }
            })
        })
    })
</script>

用户名:<input type="text" id="username" ><br>
<input type="button" id="btn" value="发送Ajax get请求">
<div id="mydiv"></div>
</body>
</html>
  • 后端代码
package com.lcl.ajax.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

/**
 * @Author Administration
 * @PackageName NewWeb
 * @Package com.lcl.ajax.servlet
 * @Date 2022/8/19 14:42
 * @Description: 测试自己编写的jQuery库
 */
@WebServlet("/ajaxrequest11")
public class AjaxRequest11Servlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        String username = request.getParameter("username");

        response.getWriter().print("{\"username\":\""+username+"\"}");
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ajax——Ajax的同步与异步以及代码封装(jQuery) 的相关文章

随机推荐

  • LeetCode题解—260.只出现一次的数字Ⅲ

    题目地址 260 只出现一次的数字 III 力扣 LeetCode 题解 这道题是基于寻找只出现一次的数字 上的拓展 136 只出现一次的数字 力扣 LeetCode 在 中 我们只需要把所有的数字异或一遍即可 因为只有一个数字是唯一的 但
  • 2.23怎么在OrCAD原理图中显示与隐藏元器件的Value值?【OrCAD原理图封装库50问解析】

    笔者电子信息专业硕士毕业 获得过多次电子设计大赛 大学生智能车 数学建模国奖 现就职于南京某半导体芯片公司 从事硬件研发 电路设计研究 对于学电子的小伙伴 深知入门的不易 特开次博客交流分享经验 共同互勉 全套资料领取扫描文末二维码 温馨提
  • C1认证学习笔记(第三章)

    C1认证 三 JS基础 JavaScript变量命名规则 任务目标 任务背景 语法层面 工程层面 任务练习 逻辑运算 任务目标 任务背景 比较运算符 逻辑运算符 知识拓展 任务练习 隐式类型转换 任务目标 任务背景 任务内容 字符串和数字的
  • 设计模式之访问者模式

    访问者模式 把被操作的对象作为元素 可变可拓展的操作作为访问者 可以说访问者中有很多操作 然后访问者访问元素 对该元素进行操作 不同的访问者有不同的操作 案例 定义访问者接口 public interface UniversalVisito
  • 如何创建虚拟环境

    创建虚拟环境常用的两种方法 一 用conda创建虚拟环境的步骤 1 创建虚拟环境 conda create n env python 3 6 版本号 2 激活虚拟环境 source activate env 3 退出虚拟环境 source
  • Unity动画控制器animator.CrossFade

    需要特别注意 1 CrossFade虽然可以不用任何逻辑来链接而直接跳转 但是CrossFade只能覆盖其他动画 当当前动画播放完毕而没有跳出这个动画时再次调用CrossFade将会失败 造成动画依旧停在原位 参数animator Cros
  • [学C日记]---数组

    1 数组创建 int count int arr count 不行 中不能使用变量 2 数组的大小可以通过计算得到 int arr 10 int sz sizeof arr sizeof arr 0 在主函数里算 在调用函数里算时 传参的时
  • CTFSHOW-WEB详解

    CTFSHOW WEB详解 一 WEB13 文件上传 二 WEB 红包题第二弹 一 WEB13 文件上传 开始的界面就是文件上传 确定方向为文件上传漏洞分析 尝试上传文件 我上传的第一个文件是一个文本文件很小只有9个字节 就上传成功了直接
  • 数据分析---arXiv论文种类分类

    论文种类分类 4 1 任务说明 主题 论文分类 数据建模任务 利用已有数据建模 对新论文进行类别分类 内容 使用论文标题完成类别分类 4 2 数据处理步骤 在原始arxiv论文中论文都有对应的类别 而论文类别是作者填写的 在本次任务中可以借
  • 修改环境变量后,导致一些常用命令失效,如ll,ls,vi不能用

    因为一不小心将linux的环境变量修改错误 导致ll之类的常用命令都不能用 很是苦恼 通过百度查询 原来在敲命令时 敲完整的命令路径 还是可以的 原文地址 http www cnblogs com zhbsh archive 2011 05
  • 1141 二维数组的输入和输出

    题目描述 输入m行n列的二维数组的值 再按行列形式输出 输入要求 第一行输入m n代表行数和列数 接着输入具体的m n个元素 输出要求 按行列形式换行输出 每一个数据后面都有空格 一行输出完毕后换行 输入样例 2 5 1 4 6 23 1
  • Qt实现窗口关闭时提示确认退出

    Qt实现窗口关闭时提示确认退出 在Qt中 当用户点击窗口关闭按钮时 程序会直接退出 这样可能会导致数据丢失或其他不必要的操作 为了提高用户体验 我们可以在窗口关闭前给出一个提示框 询问用户是否确认退出 一 实现思路 通过重写QWidget类
  • kaggle数据集的下载

    感谢阅读本文 喜欢请收藏点赞 准备工作 1 安装kaggle库 2 注册登录kaggle账户 3 kaggle json的下载与使用 4 下载数据集 文件保存路径 准备工作 1 安装kaggle库 2 注册登录kaggle账户 点我跳转 没
  • R-INLA Project目录

    集成嵌套拉普拉斯近似法 INLA 是一种近似贝叶斯推断的方法 在过去的几年里 由于其速度和通过R INLA软件包的易用性 它已经成为马尔科夫链蒙特卡洛等其他方法的替代品 尽管INLA方法的重点是可以表达为潜伏高斯马尔可夫随机场 GMRF 的
  • SpringMVC视图解析器

    SpringMVC视图解析器 前言 在前一篇博客中讲了SpringMVC的Controller控制器 在这篇博客中将接着介绍一下SpringMVC视图解析器 当我们对SpringMVC控制的资源发起请求时 这些请求都会被SpringMVC的
  • ES: 设置默认值

    场景 XX对象的告警个数字段是数字 优先级字段是数字 排序要求 优先告警个数大 gt 小 其次优先级大 gt 小 问题 告警个数字段不存在或者值为0的情况是等价的 排序上应该是平等的 不应该存在0的大于字段不存在的 处理 对没有告警个数字段
  • Obsidian 使用 Livesync 同步数据

    Obsidian 使用 Livesync 同步数据 之前一直使用 icloud 同步我的 obsidian 笔记 同时定期使用 git 备份笔记 但是前段时间因为在 ios 上误删了一个文件夹 导致我的 icloud 桌面端和手机端的笔记不
  • Ubuntu9.04太多乱码(中文不能正常显示)

    最近在使用Ubuntu9 04的过程中 发现有好多地方都出现乱码 其实是中文不能正常显示 现在把我所遇到的所有乱码问题集中一下 方便以后查阅参考 一 Flash乱码 在终端输入 sudo gedit etc fonts conf d 49
  • linux系统安装python3.9.2

    1 下载安装包 下载地址 https www python org downloads release python 392 在这里插入图片描述 2 下载Python3编译的依赖包 yum install y gcc patch libff
  • Ajax——Ajax的同步与异步以及代码封装(jQuery)

    文章总结目录 1 Ajax的异步与同步 1 1 同步与异步概念 1 2 Ajax在代码上的实现 1 3 Ajax同步与异步使用的场景 2 Ajax代码的封装 2 1 Ajax代码封装的原因 2 2 如何实现Ajax代码的封装 2 3 Aja