diff --git "a/04 \346\235\216\346\230\216\345\201\245/20231213 jQuery\347\254\224\350\256\260.md" "b/04 \346\235\216\346\230\216\345\201\245/20231213 jQuery\347\254\224\350\256\260.md"
new file mode 100644
index 0000000000000000000000000000000000000000..4b59109dc247855e1d4c6c5f6b3a3393da078591
--- /dev/null
+++ "b/04 \346\235\216\346\230\216\345\201\245/20231213 jQuery\347\254\224\350\256\260.md"
@@ -0,0 +1,355 @@
+# jQuery
+
+
+
+### 1 关于原生js对象(DOM对象)和jQuery对象的误区:
+
+```js
+1.javascript对象又称dom对象,是指使用javascript操作的对象,
+例如:
+ document.getElementById("id值")方法 获得的对象就是dom对象
+ document.querySelectorAll("")
+2.jquery对象是指使用jquery操作的对象,
+例如:
+ $("选择器");
+3.关于javascript对象与jquery对象之间的转换
+ 因为jquery对象默认是集合或者数组,所以可以使用数组或者集合的取值方法
+
+ dom->jquery: $(dom对象);
+ jquery->dom: jquery对象[0]或者jquery对象.get(0)
+
+4.dom对象只能使用javascript方法,jquery对象只能使用jquery方法
+
+```
+
+### 2 jQuery 是第三方库,使用前要先引入
+
+```js
+
+```
+
+### 3 选择器
+
+```js
+
我是一个标题
+我是有id的p段落
+
+```
+
+### 4 jQuery事件
+
+***1.js事件回顾***
+
+```js
+javascript事件
+ 1.以on开头,比如鼠标单击事件onclick,onchange,onready,onblur,oninput,
+ javascript事件一般通过注册事件句柄实现绑定
+ 2.js事件通常是一个函数,通过事件驱动执行,js函数内部可以使用jquery方式进行选中元素
+ 3.位置:js事件函数写在标签内,ready()外
+
+ 定义onclick事件函数
+
+
+
+ function jsClick(){
+ alert("js鼠标单击事件...");
+ // 使用jquery选中选中其它元素
+ $("#myText").css("background-color","red");
+ }
+
+```
+
+***2.jQuery事件***
+
+```js
+/*
+ jquery事件:
+ 1.没有on,直接以js事件去掉相应的on即可
+ 2.位置:ready()内
+ ready(function){
+ $("jquery选择器").事件类型(function(){
+ 事件体...
+ })
+ }
+ */
+ $(document).ready(function(){
+ // 鼠标单击事件
+ $("#myButton").click(function(){
+ $("#myText").css("background-color","red");
+ })
+ })// ready()结束标记
+
+```
+
+***3.常见的jQuery事件***
+
+```js
+ 鼠标事件
+ -click:鼠标单击
+ -- dblclick 双击
+ -mouseover:鼠标进入(进入子元素也会触发)
+ -mouseout:鼠标离开(离开子元素也会触发)
+ -focus:元素获得焦点
+ -blur:元素失去焦点
+
+ 键盘事件
+ -keydown:键盘按下事件,从上到下的过程
+ -keyup:松开键盘
+ -keypress:键盘被按到最底部
+ 绑定事件
+ 1.形式 addEventLister("事件名",函数)
+ $("jquery选择器").bind("事件名",函数)
+ 好处:更加通用
+ 2.多组事件绑定:
+ $("jquery选择器").bind({"事件名":函数,"事件名":函数,"事件名":函数,})
+
+
+显示效果:
+ -show(参数1,参数2):显示
+ -hide(参数1,参数2):隐藏
+
+
+ -fadeIn(参数1,参数2):淡入
+ -slideDown(参数1,参数2):展开
+ 关于参数:参数1表示速度,可选值有slow、fast、normal
+ 参数2表示回调函数
+ 隐藏效果:
+
+ -fadeOut(参数1,参数2):淡出
+ -slideUp(参数1,参数2):拉升 (压缩)
+
+ $("p").one( "click", fun...) //one 绑定一个一次性的事件处理函数
+ $("p").unbind( "click" ) //解绑一个事件
+
+```
+
+### 5 jQuery操作DOM对象
+
+***1.jQuery操作样式***
+
+```js
+i.设置css
+ 获取对象的某个样式的属性对应的值jquery对象.css("属性名") style
+ 设置单个样式:jquery对象.css("属性名","属性值")
+ 设置多个样式:jquery对象.css({"属性名":"属性值",属性名":"属性值,属性名":"属性值})
+classList.add .remove toggle .contains
+ii.追加或移出预定义样式
+ addClass("xxx"):追加单个属性
+ addClass("xxx xxx xxx"):追加多个属性
+ removeClass("xxx"):移除单个属性
+ removeClass("xxx xxx xxx"):移除多个属性
+ toggleClass("xxx xxx xxx"):轮换属性
+ 可以在style标签预定义一些样式,通过add或remove方法进行追加或移除属性
+
+```
+
+***2.jQuery操作内容***
+
+```js
+i.jquery操作DOM之内容
+ 取值(文本):
+ html():获取值,获取的是元素的内容,包括元素内部的各种标签 innerHTML
+ text():获取值,只获取内容值,不包括各种标签 innerText
+ 赋值:
+ html("xxx"):先渲染,后显示 innerHTML= xxx
+ text("xxx"):原封不动显示,不进行渲染 innerText = xxx
+
+ 表单的:
+ val():获取属性值 .value
+ val("xxx"):赋值 .value =xxx
+
+
+ii.jquery工厂$()的作用
+ -$("jquery选择器"):jquery选择器:
+ -$(document):类型转换,DOM对象转换为jquery对象
+ -$(html字符串):创建节点
+
+ 插入节点:
+ -内部插入:
+ $("A").append($("B")):将B插入到A尾部
+ $("A").prepend($("B")):将B插入到A头部
+
+ 外部插入:
+ $("A").before($("B")):将B插入到A前面(外部)
+ $("A").after($("B")):将B插入到A后面(外部)
+
+ 替换节点
+ -$("A").replaceWith($("B")):用B替换A
+
+ 删除节点
+ -remove():彻底删除,包括节点关联的一切
+ -empty():只删除节点内容
+
+ 克隆节点
+ -clone(true|false)
+ 其中true代表克隆节点的同时克隆节点所绑定的事件,false代表只克隆节点
+
+iii.属性操作
+ attr("属性名"):根据属性名获取属性值
+ attr("属性名","属性值"):设置单个属性值
+ attr({"属性名":"属性值","属性名":"属性值","属性名":"属性值"}):设置多个属性值
+ removeAttr("属性名"):删除属性值
+
+iiii.jquery获取集合和遍历集合
+ 获取子节点集合:$("选择器").children("过滤")
+
+
+ 同辈集合:
+ -next():下一个
+ -prev():前一个
+ -sublings():左右
+
+ 前辈集合:
+ -parent():父辈
+ -parents():祖先
+
+iiiii.集合遍历:
+ $("选择器").each(function(index,element){
+
+ })
+ 其中参数index表示当前是第几个元素,element代表当前元素,注意element是dom对象,必须进行jquery工厂进行转换
+
+```
+
+### 6 jQuery表单验证(后端必会知识)
+
+***1.关于表单验证***
+表单验证是java后端程序员必须要掌握的前端技能,表单验证减轻了前端对服务器的访问量。
+表单验证三大步:
+-获取要校验的元素值(选择器)
+-要触发校验的事件或方法:blur或是submit,或change
+-验证:采用字符串处理方法或是正则表达式
+***2.采用字符串验证表单(传统模式)***
+————————————————
+
+```js
+// 采用字符串处理方法对表单进行校验
+ $("#uname").blur(function(){
+ if($(this).val().length<2 || $(this).val().length>6){
+ if($(this).val().length==0 || $(this).val()==""){
+ $("#nameTip").css("display","none");
+ }else{
+ $("#nameTip").css("display","inline");
+ }
+ }else{
+ $("#nameTip").css("display","none");
+ }
+ })
+```
+
+***3.采用正则表达式验证表单***
+————————————————
+
+```js
+// 使用正则验证邮箱
+ $("#uemail").blur(function(){
+ var $email = $(this).val();
+ // 定义正则规则
+ var reg = /^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;
+ // 调用方法校验
+ if(!reg.test($email)){
+ if($email=="" || $email.length==0){
+ $("#emailTip").css("display","none");
+ }else{
+ $("#emailTip").css("display","inline");
+ }
+ }else{
+ $("#emailTip").css("display","none");
+ }
+ })
+```
+
+### 7 对象访问
+
+```js
+$.trim(对象) //去除字符串两端的空格
+$.map(data,(item)=>{})
+
+$.each(对象) //遍历一个数组或对象,for循环
+
+$.inArray(对象) //返回一个值在数组中的索引位置,不存在返回-1
+
+$.grep() //返回数组中符合某种标准的元素
+
+$.extend() //将多个对象,合并到第一个对象
+
+$.makeArray() //将对象转化为数组
+
+$.type() //判断对象的类别(函数对象、日期对象、数组对象、正则对象等等
+
+$.isArray() //判断某个参数是否为数组
+
+$.isEmptyObject() //判断某个对象是否为空(不含有任何属性)
+
+$.isFunction() //判断某个参数是否为函数
+
+$.isPlainObject() //判断某个参数是否为用"{}"或"new Object"建立的对象
+
+$.support() //判断浏览器是否支持某个特性
+```
+
diff --git "a/04 \346\235\216\346\230\216\345\201\245/20231214 jQuery\344\275\234\344\270\232.md" "b/04 \346\235\216\346\230\216\345\201\245/20231214 jQuery\344\275\234\344\270\232.md"
new file mode 100644
index 0000000000000000000000000000000000000000..d71cbf17ba183c7fcea92cc9342d13f45963fc91
--- /dev/null
+++ "b/04 \346\235\216\346\230\216\345\201\245/20231214 jQuery\344\275\234\344\270\232.md"
@@ -0,0 +1,249 @@
+### tab栏切换
+
+~~~ js
+// 1. 给 ul 添加点击事件(事件委托)
+$('ul').on('click','a',function(){
+ // 先删除 li里的 active
+ $('a.active').removeClass('active')
+ // 自己添加 active 类
+ $(this).addClass('active')
+
+ // 先删除 有item类 里的 active
+ $('.item.active').removeClass('active')
+ // 获取当前点击的 a 的索引
+ const id = $('a').index($(this))
+ // 根据 id 指定某个div添加 active 类
+ $(`.item:eq(${id})`).addClass('active')
+})
+~~~
+
+### 轮播图
+
+~~~ js
+// 定义起始值
+let i = 0
+// 1. 给 > 按钮 添加点击事件
+$('.next').bind('click', () => {
+ // 判断 i 是否大于数组长度
+ i = i >= sliderData.length - 1 ? 0 : i + 1
+ // 调用切换函数
+ toggleData()
+})
+
+// 2. 给 < 按钮添加点击事件
+$('.prev').bind('click', () => {
+ // 判断 i 是否大于数组长度
+ i = i <= 0 ? sliderData.length - 1 : i - 1
+ // 调用切换函数
+ toggleData()
+})
+
+// 3. 添加定时器
+let time = setInterval(() => {
+ $('.next').click()
+}, 1000)
+
+// 4. 添加 鼠标经过、移出事件
+$('.slider-wrapper,.slider-footer').bind({
+ 'mouseover': () => {
+ // console.log(111);
+ // 暂停定时器
+ clearInterval(time)
+ },
+ 'mouseout': () => {
+ // console.log(222);
+ // 开启定时器
+ time = setInterval(() => {
+ $('.next').click()
+ }, 1000)
+ }
+})
+
+// 分装一个切换(图片、标题、背景颜色、小圆点)的类
+function toggleData() {
+ // 切换图片
+ $('.slider-wrapper img').attr('src', sliderData[i].url)
+ // 切换标题
+ $('.slider-footer p').html(sliderData[i].title)
+ // 切换标题背景颜色
+ $('.slider-footer').css('background', sliderData[i].color)
+ // 切换小圆点
+ // 先删除 active 类
+ $('.slider-indicator li.active').removeClass('active')
+ // 自己添加 active 类
+ $(`.slider-indicator li:eq(${i})`).addClass('active')
+}
+~~~
+
+### 图书管理系统
+
+~~~ js
+/**
+ * 目标一: 获取接口数据并渲染
+ * 1.1 定义自己的外号
+ * 1.2 通过自己的外号,发送异步请求,获取数据
+ * 1.3 将获取的数据渲染
+ */
+
+// 1.1 定义自己的外号
+const creator = '墨下皆是心酸'
+
+// 因为,添加、删除、编辑后都要渲染一遍,所有分装一个渲染函数
+function getBooksList() {
+ // 1.2 通过自己的外号,发送异步请求,获取数据
+ $.ajax({
+ url: 'https://hmajax.itheima.net/api/books',
+ data: {
+ creator
+ },
+ success: (result) => {
+ const data = result.data
+ // 将获取的数据渲染到页面上
+ const htmlStr = $.map(data, (item, index) => {
+ // 解构数据
+ const { id, bookname, author, publisher } = item
+ return `
+
+ ${index + 1} |
+ ${bookname} |
+ ${author} |
+ ${publisher} |
+
+ 删除
+ 编辑
+ |
+
+ `
+ }).join('')
+ $('tbody').html(htmlStr)
+ }
+ })
+}
+getBooksList()
+
+
+/**
+ * 目标二:添加图书
+ * 2.1 获取添加弹框d对象
+ * 2.2 给保存按钮添加点击事件,收集表单信息,隐藏弹框
+ * 2.3 通过获取的表单内容,发送异步请求
+ * 2.4 清空表单,刷新图书列表
+*/
+
+// 2.1 获取 添加弹框 对象
+const addModal = new bootstrap.Modal($('.add-modal'))
+
+// 2.2 给保存按钮添加点击事件,收集表单信息,隐藏弹框
+$('.add-btn').bind('click', () => {
+ // 获取 添加弹框 中的表单对象
+ const addForm = $('.add-form')[0]
+ // 使用表单插件,获取表单信息
+ const objBook = serialize(addForm, { hash: true, empty: true })
+ console.log(objBook);
+ // 2.3 通过获取的表单内容,发送异步请求
+ $.ajax({
+ url: 'https://hmajax.itheima.net/api/books',
+ type: 'post',
+ data: {
+ ...objBook,
+ creator
+ },
+ success: () => {
+ // 2.4 清空表单,刷新图书列表
+ // console.log(result);
+ // 刷新图书列表
+ getBooksList()
+ // 隐藏 添加弹框
+ addModal.hide()
+ // 清空表单
+ addForm.reset()
+ }
+ })
+})
+
+
+/**
+ * 目标三:删除图书
+ * 3.1 给 tbody 添加点击事件(事件委托)
+ * 3.2 通过自定义属性,向接口发送异步请求,删除图书
+ * 3.3 刷新图书列表
+ */
+
+$('tbody').on('click', '.del', function () {
+ // 是否删除弹框(提高数据安全性)
+ if (confirm('你确定要删除吗?')) {
+ // 获得父级身上的自定义属性
+ const id = $(this).parent().data('id')
+ // console.log(id);
+ // 3.2 通过自定义属性,向接口发送异步请求,删除图书
+ $.ajax({
+ url: `https://hmajax.itheima.net/api/books/${id}`,
+ type: 'delete',
+ success: () => {
+ // 3.3 刷新图书列表
+ getBooksList()
+ }
+ })
+ }
+})
+
+
+/**
+ * 目标四:修改图书
+ * 4.1 给 tbody 添加点击事件(事件委托),显示弹框
+ * 4.2 通过 id 发送异步请求,获取当前图书的信息,回显在表单上
+ * 4.3 点击 修改 将修改后的数据提交给异步请求,隐藏弹框,刷新表单页面
+ */
+
+
+// 获取 编辑弹框对象
+const editModal = new bootstrap.Modal($('.edit-modal'))
+// 4.1 给 tbody 添加点击事件(事件委托),显示弹框
+$('tbody').on('click', '.edit', function () {
+ // 获得父级身上的自定义属性
+ const id = $(this).parent().data('id')
+ // 4.2 通过 id 发送异步请求,获取当前图书的信息,回显在表单上
+ $.ajax({
+ url: `https://hmajax.itheima.net/api/books/${id}`,
+ success: result => {
+ // 因为,获取到的数据的 key 名刚好是每个表单的 类名
+ // 所以,可以先获取响应数据中的所有 key,遍历回显
+ const bookInfo = result.data
+ // console.log(bookInfo);
+ const keys = Object.keys(bookInfo)
+ // console.log(keys);
+ keys.forEach(key => {
+ document.querySelector(`.edit-form .${key}`).value = bookInfo[key]
+ })
+ // 显示弹框
+ editModal.show()
+ }
+ })
+})
+
+
+// 获取编辑弹框中的表单对象
+const editForm = $('.edit-form')[0]
+// 4.3 点击 修改 将修改后的数据提交给异步请求,隐藏弹框,刷新表单页面
+$('.edit-btn').bind('click', () => {
+ // 使用插件获取表单信息,并解构
+ const objBook = serialize(editForm, { hash: true, empty: true })
+ // console.log(objBook);
+ // 将修改后的数据提交给异步请求
+ $.ajax({
+ url: `https://hmajax.itheima.net/api/books/${objBook.id}`,
+ type: 'put',
+ data: {
+ ...objBook,
+ creator
+ },
+ success: result => {
+ // 隐藏弹框
+ editModal.hide()
+ // 刷新图书列表
+ getBooksList()
+ }
+ })
+})
+~~~
+