jQuery讲解|这一章就够了|(超详细|保姆级)

news2024/11/15 6:34:35

🙈作者简介:练习时长两年半的Java up主
🙉个人主页:老茶icon
🙊 ps:点赞👍是免费的,却可以让写博客的作者开兴好久好久😎
📚系列专栏:Java全栈,计算机系列(火速更新中)
💭 格言:种一棵树最好的时间是十年前,其次是现在
🏡动动小手,点个关注不迷路,感谢宝子们一键三连

目录

  • 课程名: jQuery
    • 内容/作用:知识点/设计/实验/作业/练习
    • 学习: jQuery基础知识
  • jQuery
    • 作用
    • 使用
      • 1.下载jQuery.js文件,添加到项目中
      • 2.在页面中导入jQuery.js文件
      • 3.在页面中编写jQuery代码
  • $符号冲突问题
  • 文档就绪函数
  • 选择器
    • 基本选择器
    • 层次选择器
    • 过滤选择器
      • 普通过滤
      • 表单元素过滤
      • 属性过滤
      • 内容(文本)过滤
  • js对象(dom对象)和jquery对象
    • jquery对象和dom对象互转
  • 操作节点
    • 获取、设置节点的内容
    • 获取、设置节点的样式
    • 获取、设置节点的属性
  • 创建节点
  • 添加节点
  • 移除节点
  • 复制节点
  • 修饰节点
  • 通过节点获取节点
  • 预设动画
  • 自定义动画
    • 停止动画
  • 节点事件
    • 绑定事件
      • js中给节点绑定事件
      • jquery中给节点绑定事件
    • 触发事件
  • 前端框架
    • Bootstrap
      • 使用
    • LayUI
      • 使用
  • 总结

课程名: jQuery

内容/作用:知识点/设计/实验/作业/练习

学习: jQuery基础知识

jQuery

jQuery是一个轻量级的javascript函数库。

封装了很多js的内容,本质还是javascript,是一个.js文件。

作用

jQuery的宗旨:“write less,do more”,

意味着用更少的代码去完成更多的事情。

  • 更方便地获取文档中的元素,对其进行操作

  • 强大的选择器

  • 支持链式写法

  • 封装了ajax,更方便使用

    。。。

使用

1.下载jQuery.js文件,添加到项目中

  • 官网下载https://jquery.com/download/

    • 右键链接另存为下载

在这里插入图片描述

  • 使用HBuilder中自带的创建

    • 在js目录下右键新建.js文件

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y13J5lgF-1681377884362)(jquery.assets/image-20230410092031672.png)]

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xlsAebSy-1681377884362)(jquery.assets/image-20230410092128499.png)]

2.在页面中导入jQuery.js文件

<!-- 导入jquery的js文件 -->
<script src="js/jquery-3.6.4.min.js"></script>

3.在页面中编写jQuery代码

同js的写法,在script标签中编写jQuery代码

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <!-- 导入jquery的js文件 -->
        <script src="js/jquery-3.6.4.min.js"></script>
        <style>
            #md{
                width: 150px;
                height: 150px;
                background-color: skyblue;
            }
        </style>
    </head>
    <body>
        <h1>点击展开/隐藏</h1>
        <div id="md"></div>

        <script>
            // 编写jquery代码
            $("h1:eq(0)").click(() => {
                $("#md").toggle(1000);
            });
        </script>
    </body>
</html>

$符号冲突问题

在页面中引入jquery后,$符号相当于jQuery这个单词,有特殊的含义。

如果页面中引入了多个js函数库,这些函数库都需要使用 符号,就会出现 符号,就会出现 符号,就会出现冲突。

jQuery中提供了一个noConflict()函数,用于释放对$的使用权

//释放$的使用权,重新定义为jq代替$符号
var jq=$.noConfilict();

jQuery("#md").text("xxx")//正常,原始写法
$("#md").text("xxx")//无效,无法继续使用$符号
jq("#md").text("xxx")//正常,jq当做jQuery使用

文档就绪函数

在js中

//文档就绪事件
window.onload=()=>{
	//在页面中的节点加载后执行,只能定义一个该事件
}

在引入jquery后

//文档就绪函数
$(()=>{
    //在页面中的节点加载后执行,能定义多个该函数
})

选择器

基本选择器

基本选择器
$(“#id名”);id选择器,根据标签的id名获取单个节点
$(“.class名”)类选择器,根据标签的class名获取多个节点
$(“标签名”)元素选择器,根据标签名获取多个节点
$(“选择器1,选择器2…”)群组选择器,根据各个选择器获取多个节点
$(“div#md”)获取id为md的div节点

层次选择器

层次选择器
$(“#md空格*”)id为md的节点下的所有子节点。*表示所有节点。
$(“#md空格p”)id为md的节点下的所有p节点。
$(“#md>*”)id为md的节点下的第一层子节点。
$(“#md>p”)id为md的节点下的第一层p节点。
$(“#md+p”)id为md的节点后紧邻的p节点
$(“#md~p”)id为md的节点之后同级的p节点

注意

  • $(“p .test”) 中间有空格,表示获取p标签下class为test的标签

    <p>
        <span class="test"></span>
        <a class="test"></a>
    	<!--以上两个节点都能获取-->
    </p>
    
    
  • $(“p.test”) 中间无空格,表示获取p标签中class为test的标签

    <p>
        <span class="test"></span>
        <p class="test"></p><!--只能获取该节点-->
    </p>
    

过滤选择器

普通过滤

$(“选择器:特定单词”)

普通过滤
$(“tr:odd”)奇数索引,得到索引1,3,5…
$(“tr:even”)偶数索引,得到索引0,2,4…
$(“tr:eq(3)”)得到指定索引的节点,eq表示equals
$(“tr:lt(3)”)得到小于指定索引的节点,lt表示less then
$(“tr:gt(3)”)得到大于指定索引的节点,gt表示greater then
$(“td:nth-child(2n-1)”)得到所有奇数td。2n-1表示奇数
$(“tr:first”)得到所有的tr节点中的第一个节点
$(“tr:last”)得到所有的tr节点中的最后一个节点
$(“li:first-child”)得到所有作为头结点的li
$(“li:last-child”)得到所有作为尾节点的li
$(“li:not(:first)”)得到所有li中的非头结点li

表单元素过滤

表单元素过滤
$(“:input”)得到所有的表单元素,包含input、select、textarea
$(“:text”)得到文本框
$(“:password”)得到密码框
$(“:radio”)得到单选按钮
$(“:checkbox”)得到复选框
$(“:checked”)得到被选中的单选按钮或复选框
$(“:selected”)得到被选中的下拉菜单的option
( " : r e s e t " ) / (":reset")/ (":reset")/(“:submit”)得到重置/提交按钮

属性过滤

属性过滤
$(“选择器:not([属性名])”)得到没有指定属性的节点
$(“选择器[属性名=值]”)得到指定属性名为指定值的节点
$(“:text[name=username]”)得到name属性为username的文本框
$(“:radio[name=sex]:checked”)得到name属性为sex且被选中的单选按钮
$(“:checkbox[name=hobby]:checked”)得到name属性为hobby且被选中的复选框
$(“选择器[属性名^=值]”)得到指定属性名以指定值开头的节点
( " 选择器 [ 属性名 ("选择器[属性名 ("选择器[属性名=值]")得到指定属性名以指定值结尾的节点
$("选择器[属性名1=值][属性名2=值]")得到同时拥有属性1和属性2且指定值的节点
$(“选择器[属性名*=值]”)得到指定属性包含指定值的节点
$(“选择器[属性名!=值]”)得到指定属性名不为指定值的节点

内容(文本)过滤

内容过滤
$(“p:contains(hello)”)得到包含文本hello的p标签
$(“p:not(:contains(hello))”)得到不包含文本hello的p标签
$(“p:empty”)得到没有任何文本的p标签

js对象(dom对象)和jquery对象

使用jquery中的选择器获取到的节点,称为jquery对象,只能使用jquery的方法操作节点。

使用js中原生的方式获取到的节点,称为dom对象,只能使用js中的方法操作节点。

jquery对象和dom对象互转

  • jquery对象转换为dom对象

    jquery对象.get(0);
    jquery对象[0];
    
  • dom对象转换为jquery对象

    $(dom对象);
    
<h1 id="title">一个标题</h1>


<script src="js/jquery-3.4.1.min.js"></script>
<script>
    // 通过js的方式获取到的对象称为dom对象
    var domObj = document.querySelector("#title");
    // 通过jquery的方式获取到的对象称为jquery对象
    var jqueryObj = $("#title");

    // dom对象只能使用js中的方式操作节点
    domObj.style.color = "red";
    // 无法通过使用对方的方式操作节点
    // jqueryObj.style.color = "blue";//无效
    // domObj.text("xxx");//无效

    jqueryObj.css("color","cadetblue");

    //jquery对象和dom对象的互转

    //dom对象转换为jquery对象   $(dom对象)
    $(domObj).text("xxxxx");
    // jquery对象转换为dom对象  jquery对象[0]或jquery对象.get(0)
    jqueryObj[0].style.fontSize="20px";
    jqueryObj.get(0).innerText="hello";
</script>

操作节点

获取、设置节点的内容

常用函数
节点.val()获取某个节点的value属性值,相当于js中的 节点.value
节点.val(“值”)设置某个节点的value属性值,相当于js中的 节点.innerText=“内容”
节点.text()获取某个节点的文本,相当于js中的 节点.innerText
节点.text(“内容”)设置某个节点的内容,相当于js中的 节点.innerText=“内容”
节点.html()获取某个节点的内容,相当于js中的 节点.innerHTML
节点.html(“内容”)设置某个节点的内容,相当于js中的 节点.innerHTML=“内容”

获取、设置节点的样式

常用函数
节点.css(“样式名”)获取某个节点的某个样式值
节点.css(“样式名”,“值”)设置某个节点的某个样式
节点.css(“样式名”,“值”).css(“样式名”,“值”)同时设置某个节点的多个样式
节点.css({“样式名”:“值”,“样式名”:“值”})同时设置某个节点的多个样式

获取、设置节点的属性

常用函数
节点.attr(“属性名”)获取某个节点的某个属性
节点.attr(“属性名”,“值”)设置某个节点的某个属性为指定值
节点.removeAttr(“属性名”)移除某个节点的某个属性
节点.addClass(“class名”)给某个节点追加class值
节点.removeClass(“class名”)移除某个节点的某个class值
节点.toggleClass(“class名”)切换某个节点的class值。如果存在该值则移除,不存在则追加
节点.hasClass(“class名”)判断某个节点是否存在某个class值

创建节点

$(“完整标签”);

//js写法
document.createElement("div");
//jquery写法
$("<div></div>");

//以上两种方式创建的节点,都处于游离状态,需要添加到其他已有节点上才能使用

添加节点

添加子节点
父节点.append(子节点)将子节点添加到父节点中的末尾
子节点.appendTo(父节点)将子节点添加到父节点中的末尾
父节点.prepend(子节点)将子节点添加到父节点中的开头
子节点.prependTo(父节点)将子节点添加到父节点中的开头
添加兄弟节点
原始节点.before(新节点)将新节点添加到原始节点之前
新节点.insertBefore(原始节点)将新节点添加到原始节点之前
原始节点.after(新节点)将新节点添加到原始节点之后
新节点.insertAfter(原始节点)将新节点添加到原始节点之后

移除节点

移除节点
某节点.remove()移除某节点
某节点.empty()移除某节点的子节点

复制节点

复制节点
某节点.clone()复制节点,不保留节点事件
某节点.clone(true)复制节点,保留节点事件

修饰节点

替换节点
旧节点.replaceWith(新节点)使用新节点替换旧节点
新节点.replaceAll(旧节点)使用新节点替换旧节点
包裹节点
节点集合.wrap(指定节点)使用指定节点包裹节点集合中的每一个节点
节点集合.wrapAll(指定节点)使用指定节点包裹节点集合中的所有节点
父节点.wrapInner(指定节点)使用指定节点包裹父节点中的所有子节点

通过节点获取节点

函数名
某节点.next()获取某节点之后紧邻的一个节点
某节点.prev()获取某节点之前紧邻的一个节点
某节点.nextAll(选择器)获取某节点之后的所有同级节点,参数可以是指定选择器
某节点.prevAll(选择器)获取某节点之前的所有同级节点,参数可以是指定选择器
某节点.sibling(选择器)得到某个节点的所有同级节点
父节点.children(选择器)得到父节点中的所有子节点
节点集合.first()得到节点集合中的第一个节点
节点集合.last()得到节点集合中的最后一个节点
子节点.parent()得到子节点的父节点
某节点.index()得到某个节点在所在同级节点集合中的索引

预设动画

函数名
show()改变某个节点的width和height从0到原始大小,显示
hide()改变某个节点的width和height从原始大小到0,隐藏。最终display:none
toggle()显示/隐藏切换
fadeIn()改变某个节点的opacity从0到1,淡入
fadeOut()改变某个节点的opacity从1到0,淡出,最终display:none
fadeToggle()淡入/淡出切换
slideUp()改变某个节点的height从原始到0,向上滑入,最终display:none
slideDown()改变某个节点的height从0到原始,向下滑出
slideToggle()滑入/滑出切换
注意以上函数都可以写两个参数,第一个参数是毫秒整数,表示动画执行时间,第二个参数是一个函数,表示动画执行结束后的回调函数
//错误写法
$("#md").click(()=>{
    $("#md").toggle(2000);
    //不会等待2s后弹出,弹窗和动画在同时执行
    alert("xxx");
});

//正确写法
$("#md").click(()=>{
    //2s动画结束后再执行第二个函数
    $("#md").toggle(2000,()=>{
          alert("xxx");
    });
});

自定义动画

//样式组是必要参数
节点.animate({样式组},持续时间,时间函数,回调函数);
animate()支持链式写法,表示在动画1执行后执行动画2

$("#md").animate({
    "样式名":"值",
    "样式名":"值"
},2000,"linear",()=>{
    动画执行后的回调函数
}).animate({
    "样式名":"值",
    "样式名":"值"
},2000,"linear",()=>{
    动画执行后的回调函数
};
           
//样式只能是数值为单位,如颜色无法生效           

停止动画

  • 节点.stop()
    • 停止当前正在进行的动画,如果后续还有动画会直接执行后续动画
  • 节点.stop(trur)
    • 停止当前所有动画

节点事件

绑定事件

js中给节点绑定事件

dom对象.on事件名=()=>{
	函数体;
}
document.getElementById("md").οnclick=()=>{
	
}
//通常是给单个节点绑定事件

jquery中给节点绑定事件

  • jquery对象.事件函数(函数);
$("#md").click(function(){
    
});
//可以给节点集合中的所有节点统一绑定事件,在函数中可以使用$(this)表示触发事件的节点
$("div").click(function(){
    $(this)表示所有div中当前点击的div
});
  • jquery对象.bind(事件名,函数)
$("div").bind("mouseenter",function(){
  	
});

触发事件

节点.事件函数()

//轮播变量
var i = 1;
// 每隔2s,让对应的头像点击
setInterval(() => {
    //触发节点的单击事件
    $("#head>div:eq(" + i + ")").click();
    // 循环
    if (i++ == 4) {
        i = 0;
    }
}, 2000);
常用事件
click()单击
hover(函数1,函数2)鼠标进入时触发函数1,离开触发函数2。如果只有一个函数参数,进入和离开都触发该函数。
mouseenter()/mouseover()鼠标进入
mouseout()/mouseleave()鼠标离开
mousemove()鼠标移动
blur()失去焦点
focus()获得焦点
change()改变
input()输入
submit()表单提交

前端框架

设计者提供给用户该框架的css和js文件。

用于只需要导入css文件和js文件,就通过对应的class,使用该框架中相应的样式和效果。

任何前端框架都有对应的API,应用程序接口文档,包含了该框架的用法。

Bootstrap

由Twitter公司推出的一套Web框架。其核心内容是栅格系统。

使用

1.官网下载核心文件

在这里插入图片描述

2.将解压后的整个文件夹保存到项目目录中

3.新建页面,导入bootstrap中的核心文件

  • css文件

    • bootstrap.css或bootstrap.min.css
  • js文件

    • bootstrap依赖于jquery,所以先导入jquery.js文件

    • 再导入bootstrap.js或bootstrap.min.js

LayUI

由国内开发者设计的一套基于jquery的前端框架。

官网现已下架,但LayUI可以继续使用。

使用

1.镜像网站下载

2.解压后将layui目录导入到项目目录中

3.在页面中导入layui的css文件和js文件

总结

   好好学习,天天向上。

往期专栏
Java全栈开发
数据结构与算法
计算机组成原理
操作系统
数据库系统
物联网控制原理与技术

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

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

相关文章

【设计模式】生产者消费者模型

带你轻松理解生产者消费者模型&#xff01;生产者消费者模型可以说是同步与互斥最典型的应用场景了&#xff01;文末附有模型简单实现的代码&#xff0c;若有疑问可私信一起讨论。 文章目录一&#xff1a;为什么要使用生产者消费者模型&#xff1f;二&#xff1a;生产者消费者模…

JDK 17:Java 17 中的新特性简介

Java 开发工具包 (JDK) 17 将是一个长期支持 (LTS) 版本&#xff0c;预计来自 Oracle 的扩展支持将持续数年。该功能集定于 6 月 10 日冻结&#xff0c;届时 JDK 17 将进入初始阶段。作为 OpenJDK JDK 17 的一部分提交的功能包括&#xff1a; 特定于上下文的反序列化过滤器允许…

计算机网络 实验一

⭐计网实验专栏&#xff0c;欢迎订阅与关注&#xff01; ★观前提示&#xff1a;本篇内容为计算机网络实验。内容可能会不符合每个人实验的要求&#xff0c;因此以下内容建议仅做思路参考。 一、实验目的 掌握在Packet Tracer软件中搭建实验平台&#xff0c;配置基本的网络参数…

8D和A3报告

8D和3A报告&#xff0c;他们都不仅仅是记录问题的一种文书&#xff0c;而是解决问题的工具。 A3发展于TPS &#xff08;Toyota Production system&#xff09;&#xff0c;可以用来解决问题&#xff0c;沟通&#xff0c;记录&#xff0c;是一种流程&#xff0c;当人们在使用A3…

MySQL中添加新字段

© Ptw-cwl 要在MySQL中添加新字段&#xff0c;您可以使用ALTER TABLE语句。 以下是添加新字段的基本语法&#xff1a; ALTER TABLE table_name ADD column_name datatype;其中&#xff1a; table_name 是您要在其中添加新字段的表的名称。column_name 是新字段的名称。…

Linux安装Anaconda

目录1.下载Anaconda的安装包2.安装Anaconda3.用conda创建虚拟环境4.安装项目依赖包1.下载Anaconda的安装包 首先需要在官网上选择需要安装的版本。 官网地址&#xff1a;https://repo.anaconda.com/archive/&#xff0c;如选择当前最新版本进行安装&#xff1a; https://repo.…

TWIST阅读笔记

目录TWIST: Two-Way Inter-label Self-Training for Semi-supervised 3D Instance Segmentation摘要本文方法语义引导的实例提议生成提议纠正基于提议的伪标签更新TWIST: Two-Way Inter-label Self-Training for Semi-supervised 3D Instance Segmentation 摘要 利用无标签数…

浙大版《C语言程序设计实验与习题指导(第3版)》题目集实验2合集

实验2-1-1 计算摄氏温度 本题要求编写程序&#xff0c;计算华氏温度100F对应的摄氏温度。计算公式&#xff1a;C5(F−32)/9&#xff0c;式中&#xff1a;C表示摄氏温度&#xff0c;F表示华氏温度&#xff0c;输出数据要求为整型。 输入格式:本题目没有输入。 输出格式:按照下…

Java每日一练(20230413)

目录 1. 子集 II &#x1f31f;&#x1f31f; 2. 快乐数 ※ 3. 整数反转 ※ &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 子集 II 给你一个整数数组 nums &#xff0c;其中可能…

【pip换源操作】解决用pip下载Python第三方库慢问题

python自带的第三方库使用pip安装速度会很慢&#xff0c;还有可能会报错。 常见的报错信息有&#xff1a; check_hostname requires server_hostname raise ValueError(“check_hostname requires server_hostname”) ValueError: check_hostname requires server_hostname EO…

波尔模型的实验验证之类氢粒子光谱类实验

光谱产生的原因&#xff1a;原子中电子在轨道上跃迁产生&#xff0c;如莱曼系为电子从n2,3,4等轨道跃迁到n1的基态轨道产生。 中心的原点为原子核&#xff0c;中心最接接近原子核的圆为n1的电子轨道。 r_na_0n^2&#xff0c;轨道大小正比于n的平方 根据电子轨道图即可以获得…

AE开发之图层渲染20210603

AE开发之图层渲染比例符号化地图的整饰唯一值符号的符号化过程点符号设置&#xff0c;线符号设置标注图层&#xff0c;&#xff08;写得不好&#xff0c;不推荐看) 唯一值符号化&#xff0c;字段进行设置&#xff0c;这里用到了UniqueValueRenderer接口&#xff0c;这里面有一…

用pyocd读写gd32f4系列mcu的otp区

如前一篇文章所述&#xff0c;pyocd是一个调试、编程cortex-m单片机的简单、强大的工具&#xff0c;本文就结合实例讲解pyocd的一些用法。 使用j-link、dap-link等工具在keil或其它ide中调试单片机程序的场景比较常见&#xff0c;而使用这些工具对单片机片内和片外flash存储区…

[ 应急响应基础篇 ] evtx提取安全日志 事件查看器提取安全日志

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

【C++中关于abs()函数的告警问题】“abs“ is ambiguousC/C++(266)

C中关于abs()函数的告警问题 “abs” is ambiguousC/C(266) 在调试异常打卡记录这道华为OD机考题的时候&#xff0c;完成了C版本之后&#xff0c;在vscode进行调试&#xff0c;出现了如下的告警&#xff1a;abs有歧义&#xff0c;所以就开始查找到底是设什么原因&#xff1a; …

MAC-安装Java环境、JDK配置、IDEA插件推荐

背景&#xff1a;发现经常换电脑装环境等比较麻烦&#xff0c;主要还是想记录一下&#xff0c;不要每次安装都到处翻。。 1、下载并安装JDK 到官网下载所需的JDK&#xff1a;https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html 这儿下…

Wine运行器帮助——使用Qemu User运行Wine(理论支持全架构)

提醒 Qemu 的转换效率较低&#xff0c;如果可以的话建议使用其它方案以提升运行效率 此方案理论上支持全架构&#xff08;amd64、arm64、mips64、loongarch64、riscv64、ppc64、s390x……&#xff09;&#xff0c;只要能跑 Qemu User 即可&#xff0c;在 x86、arm64 真机测试通…

[建议收藏]45 个 Git 经典操作场景,专治各种不会合并代码的童鞋~~

有人说:一个人从1岁活到80岁很平凡,但如果从80岁倒着活,那么一半以上的人都可能不凡。 生活没有捷径,我们踩过的坑都成为了生活的经验,这些经验越早知道,你要走的弯路就会越少。

FFmpeg基础

FFmpeg介绍 FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码libavcodec&#xff0c;为了保证高可移植性和编解码质量…

老胡的周刊(第086期)

老胡的信息周刊[1]&#xff0c;记录这周我看到的有价值的信息&#xff0c;主要针对计算机领域&#xff0c;内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。&#x1f3af; 项目MochiDiffusion[2]在 MacOS 上运行原生的 Stab…