Jquery

news2025/7/17 8:03:47

目录
一、基本介绍
二、下载地址
三、基本使用
四、jQuery对象和dom对象
五、jQuery选择器
六、jQuery的DOM操作
七、总结


相关文章

JSP的使用JSP的使用
JSON&AjaxJSON&Ajax

一、基本介绍

jQuery 是一个快速的,简洁的 javaScript 库,使用户能更方便地处理 HTML,css,dom…, 提供方法、events、选择器,并且方便地为网站提供Ajax交互。其宗旨是—WRITE LESS,DO MORE,写更少的代码,做更多的事情。

二、下载地址

JQuery下载地址

 自己创建一个jquery-3.6.0.min.js文件,将页面的代码复制到这个文件里边。

三、基本使用

使用Jquery,只需使用script标签将其引入即可。👇

<script type="text/javascript" src="script/jquery-3.6.0.min.js"></script>

除了下载js文件的方式外,还可以使用CDN的方式来引入。👇

<script crossorigin="anonymous" integrity="sha512-n/4gHW3atM3QqRcbCn6ewmpxcLAHGaDjpEBu4xZd47N0W2oQ+6q7oc3PXstrJYXcbNU1OHdQ1T7pAP+gi5Yu8g==" src="https://lib.baomitu.com/jquery/3.6.0/jquery.js"></script>

📌原生JS演示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>演示</title>
    <script type="text/javascript">
        // 原生js
        window.onload = function () {
            var btn = document.getElementById("btn");
            btn.onclick = function () {
                alert("点击成功")
            }
        }
    </script>
</head>
<body>
    <form action="#" >
        用户名:<input type="text" name="user"></br>
        <input type="submit" id="btn">
    </form>

</body>
</html>

📌Jquery演示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>演示</title>
    <script type="text/javascript" src="../../script/jquery-3.6.0.min.js"></script>
    <script type="text/javascript">
		// JQuery
        $(function () {
            var $btn = $("#btn");
            $btn.click(function () {
                alert("点击成功");
            })
        });
    </script>
</head>
<body>
    <form action="#" >
        用户名:<input type="text" name="user"></br>
        <input type="submit" id="btn">
    </form>

</body>
</html>
  1. \$(function () {}) 相当于原生js的 window.onload = function(){}
  2. \$("#btn")相当于原生js的document.getElementById("btn")。不能去掉 #。
  3. \$("#btn")得到的是JQuery对象,不是js原生的dom对象。

四、jQuery对象和dom对象

1. 什么是jQuery对象

jQuery对象就是对DOM对象进行包装后产生的对象。jQuery对象是jQuery独有的,如果一个对象是jQuery对象,那么他就可以使用jQuery里的方法
✅约定(非强制的):
 如果获取的是jQuery对象,那个要在变量前面加上$

2. DOM对象转jQuery对象

  1. 对于一个DOM对象,只需要用$()把 DOM 对象包装起来,就可以获得一个 jQuery 对象了。$(DOM 对象)
  2. DOM对象转换成jQuery对象后,就可以使用jQuery方法了。👇
// DOM对象
var btn = document.getElementById("btn");
// jQuery对象
var $btn = $(btn);

3. jQuery对象转DOM对象

📌方式一

// jQuery对象
var $btn = $("#btn");
// DOM对象
var btn = $btn[0];

📌方式二

// jQuery对象
var $btn = $("#btn");
// DOM对象
var btn = $btn.get(0);

👆 jQuery之所以可以这样转DOM对象,是因为jQuery底层是一个数组。如下:👇

在这里插入图片描述

五、jQuery选择器

选择器是jQuery的核心, 在jQuery中, 对事件处理, 遍历DOMAjax操作都依赖于选择器。

1. 基本选择器

📌 id选择器

$("#id名")
// 返回值:单个元素组成的集合(因为底层是数组)

📌 元素选择器

$("元素名")
// 说明:元素名就是已经定义的变迁元素,如:div,span...

📌 类选择器

$(".class名")

// 返回值:单个元素或多个元素的数组(因为class可以有多个)

📌 特殊的

$("*")
// 匹配所有的元素
$("div,span,p.myClass")
// 将匹配到的所有元素合并到一起返回

2. 层次选择器

 可以通过DOM元素之间的层次关系来获取特定元素,如:子代元素、兄弟元素等。

📌 ancestor descendant

$("form input")
// 在给定的祖先元素下匹配所有后代元素

👆这是匹配所有的后代元素,包括孙子元素等等

📌 parent > child

$("form > input")
// 在给定的父元素下匹配所有子元素

👆这是匹配所有的子代元素

📌 prev + next

$("form + input")
// 匹配所有紧接在form元素后的input元素

📌 prev ~ siblings

$("form ~ input")
// 匹配form元素之后的所有input元素

 👆匹配到的元素不包括form元素,并且input匹配的是和form同辈的元素,其余后辈元素不被匹配。
和此选择器相似的方法是siblings(),这个方法获取的是他的调用对象的所有同辈元素,不管前后。

3. 基础过滤选择器

📌 :first

$("tr:first")
// 返回tr的第一个元素

📌 :last

$("tr:last")
// 返回tr的最后一个元素

📌 :not(selector)

$("input:not(:checked)")
// 返回所有没有被选中的input

📌 :even

$("tr:even")
// 返回所有索引值为偶数的tr元素(0也为偶数)

📌 :odd

$("tr:odd")
// 返回所有索引值为奇数的tr元素

📌 :eq(index)

$("tr:eq(0)")
// 返回的第一个tr元素

📌 :gt(index)

$("tr:gr(0)")
// 返回所有索引值大于0的tr元素

📌 :lt(index)

$("tr:lt(3)")
// 返回所有索引值小于3的tr元素

📌 :header

$(":header")
// 用来获取h1,h2,h3...之类的标题元素

📌 :animated

$(":animated")
// 获取所有正在执行动画效果的元素

4. 内容过滤选择器

📌 :contains(text)

$("div:contain('tom')")
// 匹配包含给定文本的元素

📌 :empty

$("td:empty")
// 匹配所有不包含子元素或者文本的空元素

📌 :has(selector)

$("div:has(p)")
// 返回所有包含p元素的div元素

📌 :parent

$("td:parent")
// 匹配所有含有子元素或者文本的元素;和empty相反

5. 可见度过滤选择器

📌 :hidden

$("div:hidden")
// 匹配所有的不可见div元素

📌 :visible

$("td:visible")
// 匹配所有的可见div元素

6. 属性过滤选择器

📌 [attribute]

$("div[id]")
// 匹配所有的带有id属性的div元素

📌 [attribute=value]

$("div[id='btn']")
// 匹配所有id属性值为'btn'的div元素

📌 [attribute!=value]

$("div[id!='btn']")
// 匹配所有id属性值不为'btn'的div元素

📌 [attribute^=value]

$("div[id^='btn']")
// 匹配所有id属性值以'btn'开头的div元素(如:btn1,btnws)

📌 [attribute$=value]

$("div[id$='btn']")
// 匹配所有id属性值以'btn'结尾的div元素(如:01btn,wwbtn)

📌 [attribute=value]*

$("div[id*='btn']")
// 匹配所有id属性值中包含'btn'的div元素(如:01btn,wwbtn)

📌 复合属性选择器

$("div[id][class='123']")
// [attributeFilter1][attributeFilter2][attributeFilterN] 复合属性选择器

7. 子元素过滤选择器

📌 :nth-child()

// :nth-child(index/even/odd/equation)
$("ul li:nth-child(2)")
// 返回ul下li的第三个子元素
  1. nth-child(even/odd):能选取每个父元素下的索引值为偶(奇)数的元素。
  2. nth-child(2):能选取每个父元素下的索引值为 2 的元素。
  3. nth-child(3n):能选取每个父元素下的索引值是 3 的倍数 的元素。
  4. nth-child(3n+1):能选取每个父元素下的索引值是 3n + 1 的元素。

📌 :first-child

$("ul li:first-child")
// 返回ul下li的第一个元素

📌 :last-child

$("ul li:last-child")
// 返回ul下li的最后一个元素

📌 :only-child

$("ul li:only-child")

 如果某个元素是父元素中唯一的子元素,那将会被匹配.如果父元素中含有其他元素,那将不会被匹配.意思就是:只有一个子元素的才会被匹配!

8. 表单属性过滤选择器

📌 :enabled

$("input:enabled")
// 匹配所有input 中不带有 disabled="disabled"的 input

📌 :disabled

$("input:disabled")
// 匹配所有 disabled="disabled"的input元素

📌 :checked

$("input:checked")
// 匹配所有复选框被选中的元素

📌 :selected

$("select option:selected")
// 匹配选中的option

9. 表单选择器

📌 :input

$(":input")
// 匹配所有的inut,textarea,select和button元素

📌 :text

$(":text")
// 匹配所有的单行文本框

📌 :password

$(":password")
// 匹配所有的密码框

📌 :radio

$(":radio")
// 匹配所有单选按钮

📌 :checkbox

$(":checkbox")
// 匹配所有的复选框

📌 :submit

$(":submit")
// 匹配所有的提交按钮

📌 :image

$(":image")
// 匹配所有的图像域

📌 :reset

$(":reset")
// 匹配所有的充值按钮

📌 :button

$(":button")
// 匹配所有的按钮

📌 :file

$(":file")
// 匹配所有的文本域

📌 :hidden

$("input:hidden")
// 匹配所有的不可见元素(即:type=hidden的input元素);这个选择器不仅局限于表单,也可以匹配style=hidden

六、jQuery的DOM操作

1. 查找节点,修改属性

 查找属性节点: 查找到所需要的元素之后, 可以调用jQuery对象attr()方法来获取它的各种属性值

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>演示</title>
    <script type="text/javascript" src="../../script/jquery-3.6.0.min.js"></script>
    <script type="text/javascript">
        $(function () {
            var $btn = $("#btn");
            var $user = $("#user");
            $btn.click(function () {
				// 修改输入框内的值
                $user.attr("value","123")
            })
        });
    </script>
</head>
<body>
    <form action="#" >
        用户名:<input type="text" name="user" id="user"></br>
        <input type="submit" id="btn">
    </form>

</body>
</html>

2. 创建节点

2.1 基本介绍

  1. 创建节点: 使用 jQuery 的工厂函数 $(): $(html标签) 会根据传入的 html 标记字符串创建一个 jQuery 对象, 并返回。
  2. 动态创建的新元素节点不会被自动添加到文档中, 而是需要使用其他方法将其插入到文档中。
  3. 当创建单个元素时, 需注意闭合标签和使用标准的 HTML 格式. 例如创建一个

    元素, 可以使用$("\<p/>") $("\<p>\</p>"), 但不能使用 $("\<p>") $("\</P>")

  4. 创建文本节点就是在创建元素节点时直接把文本内容写出来; 创建属性节点也是在创建元素节点时一起创建。

2.2 插入方式

这里所说的对象都指jQuery对象

📌 内部插入法

// 向每个匹配的元素的内部的结尾处追加内容
// 例如:A.apppend(B),表示将B对象添加到A对象内部的结尾处
append(content)

// 将每个匹配的元素追加到指定的元素中的内部结尾处
// 例如:A.apppendTo(B),表示将A对象添加到B对象内部的结尾处
appendTo(content)

// 向每个匹配的元素的内部的开始处插入内容
// 例如:A.perpend(B),表示将B对象添加到A对象内部的开头处
prepend(content)

// 向每个匹配的元素的内部的开始处插入内容
// 例如:A.perpendTo(B),表示将A对象添加到B对象内部的开头处
prependTo(content)

💡 内部插入法是在元素内部插入内容,该内容会成为该元素的子元素节点

📌 外部插入法

// 在每个匹配的元素之后插入内容
// 例如:A.after(B),表示将B对象添加到A对象的后面,B成为A的兄弟节点,B在A之后
after(content)

// 在每个匹配的元素之前插入内容
// 例如:A.before(B),表示将B对象添加到A对象的前面,B成为A的兄弟节点,B在A之前
before(content)

// 把所有匹配的元素插入到另一个、指定的元素元素集合的后面
// 例如:A.insertAfter(B),表示将A对象添加到B对象的后面,A成为B的兄弟节点,A在B之后
insertAfter(content)

// 把所有匹配的元素插入到另一个、指定的元素元素集合的前面
// 例如:A.insertBefore(B),表示将A对象添加到B对象的前面,A成为B的兄弟节点,A在B之前
insertBefore(content)

💡外部插入法是在元素外部插入内容,该内容会成为该元素的兄弟节点

3. 删除节点

  1. remove()

remove(): 从 DOM 中删除所有匹配的元素, 传入的参数用于根据 jQuery 表达式来筛选元素. 当某个节点用 remove() 方法删除后, 该节点所包含的所有后代节点将被同时删除. 这个方法的返回值是一个指向已被删除的节点的引用。

  1. empty()

 清空节点 – 清空元素中的所有后代节点(不包含属性节点)。

4. 复制节点

  1. clone()

 克隆匹配的 DOM 元素, 返回值为克隆后的副本。但此时复制的新节点不具有任何行为

  1. clone(true)

 复制元素的同时也复制元素中的的事件(即克隆了这个元素身上所绑定的所有动作、行为)。

5. 替换节点

  1. replaceWith()

 将所有匹配的元素都替换为指定的HTMLDOM/juqery元素。A.replaceWith(B)(用B替换A)

  1. replaceAll()

 颠倒了的replaceWith()。A.replaceAll(B)(用A替换B)

💡注意:
 若在替换之前, 已经在元素上绑定了事件, 替换后原先绑定的事件会与原先的元素一起消失。

{% endnote %}

6. 属性操作

  1. attr():获取属性和设置属性。
  2. attr():传递一个参数时, 即为某元素的获取指定属性。
  3. attr():传递两个参数时, 即为某元素设置指定属性的值。
  4. jQuery中有很多方法都是一个函数实现获取和设置. 如: attr(), html(), text(), val(),height(), width(), css() 等。
  5. removeAttr():删除指定元素的指定属性。

7. 样式操作

  1. 获取 class 和设置 class:class 是元素的一个属性, 所以获取 class 和设置 class 都可以使用 attr() 方法来完成。
  2. 追加样式:addClass(),参数就是css样式表中定义的那个。
  3. 移除样式:removeClass() — 从匹配的元素中删除全部或指定的 class。
  4. 切换样式:toggleClass() — 控制样式上的重复切换.如果类名存在则删除它, 如果类名不存在则添加它。
  5. 判断是否含有某个样式:hasClass() — 判断元素中是否含有某个 class, 如果有, 则返回true; 否则返回 false。

8. 获取HTML,文本值

  1. html():设置或返回所选元素的内容(包括HTML标记)。
  2. text():读取和设置某个元素中的文本内容。
  3. val():读取和设置某个元素中的值。

9. 常用的遍历节点方法

  1. 取得匹配元素的所有子元素组成的集合: children() 该方法只考虑子元素而不考虑任何后代元素
  2. 取得匹配元素后面的同辈元素的集合:next()/nextAll();
  3. 取得匹配元素前面的同辈元素的集合:prev()/prevAll();
  4. 取得匹配元素前后所有的同辈元素:siblings()
  5. 获取指定的第几个元素:nextAll().eq(index)
  6. 对获取到的同辈元素进行过滤:nextAll().filter("标签")

📌演示

$("div[class='one']").children().each(function (){
	alert("子 div 的内容是~~~ " + $(this).text());
})

// 其余集合的遍历方式都差不多

👆$(this)相当于当前遍历到的这个元素。

10. CSS-DOM操作

CSS属性描述
css()设置或返回匹配元素的样式属性。
height()设置或返回匹配元素的高度。
offset()返回第一个匹配元素相对于文档的位置。
offsetParent()返回最近的定位祖先元素。
position()返回第一个匹配元素相对于父元素的位置。
scrollLeft()设置或返回匹配元素相对滚动条左侧的偏移。
scrollTop()设置或返回匹配元素相对滚动条顶部的偏移。
width()设置或返回匹配元素的宽度。

七、总结

 以上就是Jquery的全部内容,讲了一些Jquery常用的方法。想要详细了解的小伙伴,可以到👉jQuery API 3.5.1 速查表👈去查看。如果文章有描述不正确或者错误的地方,还望指正。您可以留言📫或者私信我。🙏

最后希望大家多多 关注+点赞+收藏^_^,你们的鼓励是我不断前进的动力!!!
感谢感谢~~~🙏🙏🙏

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

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

相关文章

DINO学习笔记

DINO学习笔记 DINO: DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detection Abstract 我们提出了DINO(DETR with Improved deNoising anchOr boxes)&#xff0c;一种先进的端到端对象检测器。DINO采用对比的去噪训练方法、混合查询选择方法进行锚点初…

【蓝桥杯专项】动态规划_背包问题合集(Java)

✨哈喽&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01;✨ &#x1f6f0;️&#x1f6f0;️系列专栏:【蓝桥杯专项】 ✈️✈️本篇内容:动态规划_背包问题合集&#xff01; &#x1f680;&#x1f680;码云仓库gitee&#xff1a;Java数据结构代码存放! ⛵⛵作者简介…

【C++笔试强训】第二十二天

&#x1f387;C笔试强训 博客主页&#xff1a;一起去看日落吗分享博主的C刷题日常&#xff0c;大家一起学习博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a;夜色难免微凉&#xff0c;前方必有曙光 &#x1f31e;。 &#x1f4a6;&a…

动态内存管理

目录 内存中的栈区和堆区 malloc free calloc realloc 内存中的栈区和堆区 我们知道php的底层是C (任何语言其实都可以分为大同小异的几块) 而C语言的内存模型分为5个区&#xff1a;栈区、堆区、静态区、常量区、代码区。每个区存储的内容如下&#xff1a; 1、栈区&…

网络:IP与MAC

如果我们要跟对方通信&#xff0c;我们需要知道对方的IP地址与MAC地址。 一、IP IP地址&#xff0c;32位&#xff0c;工作在网络层&#xff0c;属IP协议族。在互联网中逻辑的代表某一台设备&#xff0c;但是在不同的时间&#xff0c;与我合作的主机非常多。某一个设备使用完我…

2022/11/12 json格式转换对象 动态sql

PostMapping public Integer save(RequestBody User user){return userMapper.insert(user); }选择json格式。以为本人忘记选了415错误&#xff0c;media错误 mybatisx插件 sprinboot yml文件导入xml mybatis: mapper-locations: classpath:mapper/*.xml 一直报错 发现重复了…

【华为ICT大赛】华为云激活设备的方法以及数据上下行

先展示一下没有激活的时候在线调试的状态 然后下面我将激活他&#xff0c;让他变为下面这个样子 官方教程 这里我从0演示一个产品的创建到MQTT.fx连接到云平台并且接收数据。 进入华为云平台控制台 然后开始创建一个产品 创建完毕产品之后就可以开始创建服务了&#xff0c;一…

提高工作效率的 keychron 键盘,你还没有入手吗?

前言 大家好&#xff0c;今天给大家推荐一款我最近入手并且一直在使用的机械键盘 keychron K4 。我自己是一个键盘的重度使用者&#xff0c;由于工作的需求&#xff0c;对键盘有很大的依赖&#xff0c;而一款可以提高工作效率的键盘&#xff0c;往往可以让我们的工作事半功倍。…

文化馆建筑方案设计原理及方案

文化馆建筑的分类与作用 根据职能不同&#xff0c;文化馆建筑可分为文化馆、群众艺术馆和文化站等形式。 文化馆是国家设立的开展社会宣传教育、普及科学文化知识、组织辅导群众文化艺术(活动)的综合性文化事业机构和场所。 群众艺术馆是国家设立的组织指导群众文化艺术活动及…

Github工程中的Markdown语言应用

Github工程中的Markdown语言应用1. 介绍2. 工具2.1 下载链接2.2 编辑界面2.3 插件安装3. 基本操作3.1 标题编写3.2 正文编写3.3 代码块编写3.4 加粗倾斜3.5 有序列表3.6 无序列表3.7 行内代码编写4. 参考资料最早开源代码中&#xff0c;接触的最多的就是Readme文件&#xff0c;…

Altium格式PCB转换成Allegro操作指导

Altium格式PCB转换成Allegro操作指导 首先打开Altium Design的PCB文件,输出一个“PCB ASCII File(*.pcbdoc)”格式的文件。如下图 打开Allegro,选择was performance L模式,新建空白的brd。 导入Altium PCB 选择文件转换即可 转换成功 This section is describe what t…

Spring更简单的实现Bean对象的存取

目录 一、前言&#xff1a; 二、储存Bean对象 5大类注解 Bean方法注解 三、获取Bean对象 属性注入 优缺点 Setter注入 优缺点分析 构造方法注入 优缺点分析 经典面试题 &#xff1a;属性注入 &#xff0c;构造方法注入 和 Setter 注入 之间&#xff0c;有什么区别…

大数据Presto(四):Presto自定义函数和JDBC连接

文章目录 Presto自定义函数和JDBC连接 一、Presto 自定义函数 1、​​​​​​​UDF函数 2、​​​​​​​UDAF函数 二、Presto JDBC连接 Presto自定义函数和JDBC连接 ​​​​​​​一、Presto 自定义函数 我们可以登录Presto客户端&#xff0c;使用命令&#xff1a;s…

JavaScript 71 JavaScript JSON 71.5 JSON.parse()

JavaScript 文章目录JavaScript71 JavaScript JSON71.5 JSON.parse()71.5.1 实例 – 解析 JSON71.5.2 来自服务器的 JSON71.5.3 作为 JSON 的数组71.5.4 例外71.5.5 浏览器支持71 JavaScript JSON 71.5 JSON.parse() JSON 的常规用途是同 web 服务器进行数据传输。 在从 web…

Hive笔记-01 架构概述

文章目录1.概述2.Metadata/Metastore的作用3 Metastore三种配置方式3.1 Hive配置参数说明3.1.1 基本配置参数3.1.2 其他配置参数3.2 内嵌模式&#xff08;Embedded&#xff09; 3.2.1 hive-site.xml配置说明 3.2.2 hive-site.xml配置样例3.2.3 启动方式3.2.4 缺点3.3 本地模式&…

cmd常用命令行

前言 最近在看《深入剖析Tomcat》&#xff0c;其中涉及了常见的dos命令&#xff0c;这里做一些简单记录&#xff0c;其实跟linux命令很像。 案例 .bat&#xff1a;批处理文件 rem&#xff1a;用于注释&#xff0c;解释器不会执行以rem命令开始的行 - pause&#xff1a;暂停…

Executors工具类的相关方法

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生。本篇将记录创建线程池的Executors工具类里面的方法&#xff0c;方便加深知识印象和复习使用。 本篇文章记录的基础知识&#xff0c;适合在学Java的小白&#xff0c;也适合复习中&#xff0c;面试中的大佬&a…

Matlab之机载雷达系统中的空时自适应处理(STAP)技术(附源码)

目录 一、介绍 二、系统设置 2.1 天线定义 2.2 雷达设置 2.3 目标 2.4 杂波 2.5 传播路径 三、模拟循环 3.1真实目标范围、角度和多普勒 3.2 使用 DPCA 消除器进行杂波抑制 ​四、总结 五、程序 本例简要介绍了空时自适应处理&#xff08;STAP&#xff09;技术&…

【C++】模板进阶 —— 非类型模板参数 | 特化 | 模板的分离编译

&#x1f308;欢迎来到C专栏~~模板进阶 (꒪ꇴ꒪(꒪ꇴ꒪ )&#x1f423;,我是Scort目前状态&#xff1a;大三非科班啃C中&#x1f30d;博客主页&#xff1a;张小姐的猫~江湖背景快上车&#x1f698;&#xff0c;握好方向盘跟我有一起打天下嘞&#xff01;送给自己的一句鸡汤&…

java线程基础

最近&#xff0c;想弄一个雪花飘落&#xff0c;结果&#xff0c;搞了两三个小时没弄出来。主要是雪花飘落可能需要用到线程。有人是通过一个雪花去实现&#xff0c;然后通过集合去实现漫天雪花。不管怎么说&#xff0c;做开发&#xff0c;可能线程学习也是一块绕不过去的大山。…