# jQuery **Repository Path**: flyird/j-query ## Basic Information - **Project Name**: jQuery - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2021-11-19 - **Last Updated**: 2021-12-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: 课程资料, jQuery ## README  # 01 - 知识回顾 ## 一个简单的案例 使用所学的知识,实现下拉菜单效果,如下:  HTML代码: ```html
``` CSS样式: ```css ul, li { list-style: none; margin: 0; padding: 0; font-size: 14px; box-sizing: border-box; } #nav > li { width: 120px; height: 30px; line-height: 30px; float: left; background-color: #171a24; border: solid 1px #fff; } #nav a { display: block; text-decoration: none; color: #fff; margin-left: 4px; } #nav ul li { background-color: #282c3f; color: #fff; border-bottom: solid 1px #fff; } #nav ul { display: none; /* 起始状态,让子菜单隐藏 */ } ``` JS代码: ```js // 找到三个顶级菜单 let bigLis = document.querySelectorAll('#nav > li'); // 循环,分别为每个顶级菜单注册 鼠标移入和离开 事件 for (let i = 0; i < bigLis.length; i++) { // 鼠标移入事件 bigLis[i].onmouseover = function () { this.children[1].style.display = 'block'; } // 鼠标离开事件 bigLis[i].onmouseout = function () { this.children[1].style.display = 'none'; } } ``` 代码又长又臭,还有兼容性问题,写完代码,烧死不少脑细胞,头发掉了一大把。。。 实测,原生的WebAPI太不好用了。。。 ## 封装函数 比如,把查找元素的那一串代码封装成一个短一点的函数,用的时候调用函数就好了。 比如,把设置元素显示的代码封装成函数,用的时候,调用函数就行了。 比如,把设置元素隐藏的代码封装成函数,用的时候,调用函数就行了。 比如,为节点列表中的每个元素注册事件,也封装成函数,用的时候,调用函数就行了。 ...... 创建一个函数库,***tools.js***,封装上面提到的三个函数 ```js // 为了简洁,函数名只使用一个下划线 (JS变量允许使用下划线开头的哟) function _(selector) { return document.querySelectorAll(selector); } // 每个HTML元素节点,都继承HTMLElement; // 所以为HTMLElement原型加入方法,这样,所有的元素节点都可以使用这个方法啦~~~ HTMLElement.prototype.show = function () { this.style.display = 'block'; } HTMLElement.prototype.hide = function () { this.style.display = 'none'; } // 形如 document.querySelectorAll() 返回的是节点列表,并不是一个元素; // 所以,需要为节点列表的原型添加对象,这样,节点列表才能调用这个方法; // 这个方法为节点列表中的每个节点注册事件,所以里面就是循环,然后注册事件 NodeList.prototype.hover = function (fn1, fn2) { // this 表示调用这个方法的 对象 // console.log(this); // [li, li, li] for (let i = 0; i < this.length; i++) { // this[i].addEventListener('click', function () {}); // 这是通用的写法 this[i].onmouseenter = function () { // console.log('hello'); // ??????? // 事件内部,this表示事件源 fn1.call(this); } this[i].onmouseleave = function () { // console.log('world'); // ???????? fn2.call(this); } } } ``` 调用时: ```html ``` 这样看来,调用方法,使用方法,及其的方便简洁了,但是,**封装成了最大的问题**,尤其是对于初学者来说,简直就是噩梦~~~ # 02 - jQuery简介 ## 什么是jQuery jQuery是一个轻量级的JavaScript库; 库,即封装了很多好用的方法的大仓库; 所以,jQuery和我们自己封装的tools.js比较像,就是很多方法组成的一个大仓库; jQuery是其他人开发的,我们不用担心封装的问题了,拿来直接使用即可。 ## 初体验 在HTML结构和CSS样式不变的情况下,还是完成下拉菜单的效果。 这次,我们使用jQuery完成。 ```html ``` 没错,就是这么简单,而且代码也非常简洁,并且,你也不用担心基础不好,不会封装的问题了。 ## 使用jQuery的好处 - 写的更少,做的更多 (write less, do more)(这也是jQuery的宗旨) - 解决了浏览器兼容问题 - 1.x 版本,兼容IE6/7/8 - 2.x 版本,不兼容IE6/7/8 - 3.x 版本,不兼容IE6/7/8,是目前的最新版本 ## 咋用,咋学 - jQuery是别人封装的库,学习的话,最好下载到自己的电脑中 - 官网:https://jquery.com/ 进入之后,右侧有个醒目的 “download”,点击它,即可下载 - 一个不错的网站:https://www.jq22.com/jquery-info122,从这里也可以下载到jQuery - 下载下来,一般有两个文件,不带 `min` 的是未压缩版,带 `min` 的是压缩版,使用哪个都可以 - 引入jquery文件 - 使用前使用 script 标签,引入 `` - 也可以引入其他服务器的 jquery文件,这样你就不用下载了,但是需要联网,这种方式也叫做CDN方式,如下 `` 或者 `` - 课上认真听课,老师会把常用的方法全部讲到。 - 认真做案例,有的案例不止一种做法,要多研究 - 通过案例学习知识点 - 不要死记硬背,查看手册,学会自己查阅文档,这点是最重要的。老师上课也会带着大家一起查。 - “询问”百度。 # 03 - 选择器 ## 概念 - jQuery选择器的作用是选择页面中的元素 - 类似原生的 `document.getElementByXxx()` 和 `document.querySelector()` 方法 ## 语法 ```js // 语法 $('选择器') // 比如,选择 id=abc 的元素 $('#abc') // 比如选择页面中所有的 p 元素 $('p') // 选择页面中的第二个p元素 $('p:nth-child(2)') ``` jQuery选择器,和CSS选择器几乎一样,支持CSS1~CSS3的选择器; jQuery还额外扩展了一些选择器,从而使我们在选择元素上更加灵活。 ## 常用选择器 ```js // 根据id选择元素 $('#id') // 根据类名选择元素 $('.class') // 根据标签名选择元素 $('标签名') 比如 $('li') // 选择某个元素的后代元素 $('祖先元素 后代元素') 比如 $('div span') 找div后代中的所有span标签 // 选择某个父元素的子元素 $('父元素 > 子元素') // 根据属性选择元素 $('选择器[属性=值]') 比如 $('input[type=button]') 查找type属性为button的input元素 // 选择 第 2/4/6... 个元素 $('选择器:odd') // 选择 第 1/3/5... 个元素 $('选择器:even') // 选择第一个元素 | 选择最后一个元素 $('选择器:first') $('选择器:last') 比如 $('li:first') 表示找所有里中的第一个li // 选择第一个子元素 | 选择最后一个子元素 $('选择器:first-child') $('选择器:last-child') 比如 $('li:first-child') 表示找每个ul中的第一个li // 选择偶数元素 $('选择器:nth-child(2n)') ``` # 04 - 筛选 ## 概念 筛选,是在选择的元素的基础之上,再次筛选出符合条件的元素。 比如 `$('li')` 查找到了10个 `我是创建的p
'); $('div').append(p); 说明: 1. 此方法不会覆盖父元素中原有元素,只是单纯的再加一个子元素 ``` - 父元素开始位置添加子元素 ```js 语法; $('父元素').preppend('子元素或直接的HTML标签'); 例如: var p = $('我是创建的p
'); $('div').prepend(p); 说明: 1. 此方法不会覆盖父元素中原有元素,只是单纯的再加一个子元素 ``` - 添加到父元素中,并覆盖原来所有的子元素 ```js 语法: $('父元素').html('html标签'); 例如: $('父元素').html('我的新来的,你们都退下'); 说明: 1. 此方法的参数,直接使用 HTML 标签 2. 此方法,会覆盖父元素中原有的所有内容 3. 其实,和原生的 innerHTML 一样。 ``` - 添加兄弟节点 ```js 语法: $('元素').before('元素或HTML标签'); --- 在当前元素之前,添加一个兄弟节点 $('元素').after('元素或HTML标签'); --- 在当前元素之后,添加一个兄弟节点 例如: $('p').before('记住,你是个弟弟
'); ``` ## 移除元素 - `remove()` ```js 语法: $('元素').remove(); 特点: 1. 从页面中将当前标签删除 2. 这个元素的事件/附加的数据也会被删除 ``` - `detach()` ```js 语法: $('元素').detach(); 特点: 1. 从页面中将当前标签删除 2. 这个元素的事件/附加的数据会被保留 ``` - `empty()` ```js 语法: $('元素').empty(); 特点: 将标签中的所有内容清空 ``` - `html()` ```js 语法: $('元素').html(''); 特点: 将标签中的所有内容清空,和 empty() 一样的效果 ``` ## 其他 其他方法,还包括 - 包裹元素 - `wrap()` - 替换(修改)元素 -- `replaceWith()` - 克隆元素 -- `clone()` 这些方法,不是很常用,了解即可。 # 12 - 属性操作 ## attr 和 removeAttr 方法 原生中,有 `getAttribute()` 和 `setAttrbute()` 和 `removeAttribute()` 方法,用于操作元素的属性 jQuery中,封装并简化了上述方法 - 获取属性值 ```js 语法: $('元素').attr('属性名') 例如: $('input').attr('type') ``` - 设置属性值 ```js 语法: $('元素').attr('属性名', '值'); 例如: $('img').attr('src', './images/1.png') 总结: 1. attr方法,类似原生的 getAttribute 和 setAttribute 方法的结合体 2. 为attr传递一个参数,表示获取该属性的值;传递两个参数,表示设置属性值 3. attr方法不适合操作 checked、disabled、selected 等这类属性,这类属性请使用下面的 prop 方法 ``` - 移除属性 ```js 语法: $('元素').removeAttr('属性名'); 例如: $('table').removeAttr('width') ``` ## prop 和 removeProp 方法 - 使用场景 - 适合 `checked` 、 `disabled` 、`selected` 这类属性的操作,这类属性的值为 `true` 或 `false` - 使用语法 - 语法和上面的 `attr()` 方法一样。 - 举例说明 ```js // 设置 单选按钮 选中 $('input[type=radio]').prop('checked', true); // 设置单选按钮取消选中 $('input[type=radio]').prop('checked', false); ``` ## data 方法 `data()` 方法有两层含义,一是用于在标签上存储数据,二是获取形如 `data-xxx="值"` 这样的属性,我们主要讲解后者。 ```js 语法 $('元素').data([属性名]); 例如: $('元素').data('id') --- 获取元素的 data-id 属性值,注意,这里只需要填id即可 $('元素').data() --- 获取元素的 全部 data-xxx 属性值,结果是一个对象 ``` ## HTML|文本|值 操作 ### 设置|获取HTML内容 ```js 语法: $('元素').html([html标签]); 举例: $('div').html(); --- 获取div中的html内容 $('div').html('hello
'); --- 设置div里面的内容为 `hello
` 说明: 1. 设置元素的HTML内容的时候,会把元素中原有的全部内容覆盖掉 2. 和原生的 innerHTML 一样 ``` ### 设置|获取文本内容 ```js 语法: $('元素').text([文本]); 举例: $('div').text(); --- 获取div中的文本内容 $('div').text('hello'); --- 设置div里面的内容为 `hello` 说明: 1. 设置元素的文本内容的时候,会把元素中原有的全部内容覆盖掉 2. 和原生的 innerText 类似 ``` ### 设置|获取value值 ```js 语法: $('元素').val([值]); 举例: $('input').val(); --- 获取input的value值 $('input').val('hello'); --- 设置input的value值为 `hello` 说明: 1. 设置元素的文本内容的时候,会把元素中原有的全部内容覆盖掉 2. 和原生的 `节点.value` 语法 类似 ``` # 13 - 其他 ## jQuery对象和DOM对象 ### 概念 - DOM对象:通过 `document` 获取得到的,就是DOM对象 - `document.getElementById()` - `document.querySelector()` - `document.createElement()` - ...... - jQuery对象:通过 `$('xxx')` 得到的就是jQuery对象 - `$('#id')` - `$('hello world
')` - ...... ### 为何要区分 DOM对象,只能调用DOM方法,不能调用jQuery方法; jQuery对象,只能调用jQuery封装的方法,不能调用原生的DOM方法; ### jQuery对象和DOM对象相互转换的原因 有些时候,我们得到了一个jQuery对象,但是需要调用DOM方法; 有些时候,我们得到了一个DOM对象,但是需要调用jQuery方法; 这个时候,就需要先进行对象的转换; ### 转换方法 - DOM对象转jQuery对象 - `$(DOM对象)` ,也就是在DOM对象外,加一个 `$()` 就行了 - jQuery对象转成DOM对象(有如下两个办法) - `$('元素')[0]` ,也就是在jQuery对象后面加一个 `[0]` 就行了 - `$('元素').get(0)` ,也就是在jQuery对象后,调用 `get(0)` 就行了 ## each遍历 ### 说明 为了方便遍历数组、伪数组、jQuery对象等,jQuery封装了 `each()` 方法。 ### 语法 ```js 语法一:只能遍历jQuery对象 (通过) $('元素').each(function (index, item) { index 是索引、下标 item 表示每一项,如果遍历的是节点,注意item是DOM对象 this 表示每一项,和item一样 返回 'false' 将停止循环 (就像在普通的循环中使用 'break')。 返回 'true' 跳至下一个循环(就像在普通的循环中使用'continue') }); 语法二:可遍历任何对象 $.each(待遍历的数组或对象, function (index, item) { index 是索引、下标 item 表示每一项,如果遍历的是节点,注意item是DOM对象 this 表示每一项,和item一样 如果需要退出 each 循环可使回调函数返回 false,其它返回值将被忽略。 }) ``` ### 总结 - `$('xxx').each()` 和 `$.each()` 差不多 - 前者只能遍历jQuery对象;后者能够遍历任何对象 - 如果遍历的是节点,则要注意 item 是DOM对象 ## 获取元素在兄弟间的位置 有很多时候,我们点击或鼠标移入某个元素的时候,需要知道 这个元素 在所有兄弟节点中的索引是几。 为此,jQuery封装了 `index()` 方法,该方法的作用就是 **返回相应元素的索引值,从0开始计数** 比如:页面有 3 个 li 标签,点击 li 的时候,输出这个 li 的索引。 代码如下: ```js $('li').on('click', function () { let index = $(this).index(); console.log(index); // 点击li的时候,分别输出0/1/2 }) ``` ## 页面加载事件(入口函数) - DOM中如果在HTML结构之前写JS代码,需要设置加载事件,获取HTML元素 ```js ``` - JQ如果在HTML结构之前写js代码,需要设置加载事件(入口函数) ```js // 简化写法 $(function(){ var div = document.querySelector('div'); console.log(div); }) // 或者 $(document).ready(function(){ var div = document.querySelector('div'); console.log(div); }); 备注: // 如果将JQ代码写到HTML结构后面,则可以不用设置加载事件 ``` - JQ入口函数与原生JS中的load事件区别 ```tex ☞ js中的load事件是整个页面都加载完成后,包括外部的资源文件(css、图片等等)都加载完毕后才执行 ☞ jQuery中的入口函数是整个文档(HTML标签)加载完成后就立即执行代码 ☞ js中的load事件只能写一个,如果直接写多个会被覆盖掉;需要用addEventListener注册多个 ☞ Jquery中的入口函数可以写多个,并且不会被覆盖 ``` # 14 - 案例 - 导航菜单 ## 横向 ### 演示效果  ### JS代码 ```js // 最终 $('#nav > li').hover(function () { $(this).children().last().slideToggle(); }) ``` ## 纵向 ### 演示效果  ### JS代码 ```js // 找到大的菜单,注册单击事件;点击之后,切换子菜单的显示隐藏 $('#nav > li > a').click(function () { // 找到子菜单,toggle | slideToggle | fadeToggle. // $(this) 表示 a 标签 $(this).next('ul').slideToggle(400); // 做成手风琴(排它)效果 $(this).parent().siblings().children('ul').slideUp(); }); ``` # 15 - 案例 - tab栏切换 ## 横向 ### 演示效果  ### JS代码 ```js $('li').on('click', function () { $(this).addClass('tab').siblings().removeClass('tab'); let index = $(this).index(); $('#content > div').eq(index).addClass('curr').siblings().removeClass('curr'); }) ``` ## 纵向 ### 演示效果  ### JS代码 ```js //每一个item注册一个鼠标进入事件 $('.item').mouseenter(function () { //当前元素设置背景图片 $(this).css({ 'background': 'url(imgs/abg.gif)', 'color': '#fff' }) //当前元素对应的图片显示 let index = $(this).index(); //根据当前index显示对应的内容 $('img').eq(index).show().siblings().hide(); }).mouseleave(function () { $(this).css({ 'background': '', 'color': '#000' }) }) ``` # 16 - 案例 - 手风琴效果 ## 纵向 ### 演示效果  ### JS代码 ```js $('h4').click(function () { $(this).siblings().slideDown().parent().siblings().find('.content').slideUp(); }); ``` ## 横向 ### 演示效果  ### JS代码 ```js $('li').hover(function () { $(this).stop().animate({ 'width': '900px' }).siblings().stop().animate({ 'width': '100px' }) }) ``` # 17 - 案例 - 鼠标移入图片高亮 ## 效果展示  ## JS代码 ```js $('.item').hover(function () { // 当前元素不透明,兄弟元素设置半透明 $(this).stop().fadeTo('fast', 1).siblings().stop().fadeTo('fast', 0.2); }, function () { // 鼠标离开 $('.item').stop().fadeTo('fast', 1); }); ``` # 18 - 案例 - 禁止注册 ## 效果展示  ## JS代码 ```js $('.ck').click(function () { //先获取当前复选框的状态 let flag = $(this).prop('checked'); //判断当前状态 if (flag) { //代表当前是选中状态 $('.btn').attr('disabled', false); } else { //代表当前复选框是未被选中的状态,按钮要被禁用掉 $('.btn').attr('disabled', true); } }) ``` # 19 - 案例 - 购物车 ## 效果展示  ## JS代码 ```js //数量增加减少功能 (function () { //计算总结 var money = 0; // 增加 || 减少 $('.num1 > a').click(function () { //获取输入框中的值 var num = Number($(this).siblings('input').val()); // 判断点击的是 + 还是 - let s = $(this).text(); if (num <= 0 && s === '-') return; if (s === '+') num++; if (s === '-') num--; //将累加后的值赋值给输入框(赋值给当前按钮对应的输入框) $(this).siblings('input').val(num); //计算价格 money = num * $(this).parent().siblings('.s-price').find('strong').text(); //将价格赋值给总价标签 $(this).parent().siblings('.t_price').find('strong').text(money.toFixed(2)); //计算总结 getMoney(); }); })(); //计算总价和数量 function getMoney() { var money = 0; var lis = $('.t_price strong'); $.each(lis, function (index, item) { money += Number($(item).text()); }) //将总结设置给总结标签 $('.product_money strong').text(money.toFixed(2)); var cont = 0; var items = $('.num1 input'); items.each(function (inex, item) { cont += Number($(item).val()); }); //将总数设置给标签 $('.product_num strong').text(cont); } getMoney(); //删除功能 (function () { //清空购物车 $('.clear_p').click(function () { if (confirm('确定要删除么?')) { $('.content').empty(); getMoney(); } }) //移除购物车功能 $('.del a').click(function () { if (confirm('确定删除么?')) { $(this).parents('.item').remove(); getMoney(); } }); })(); ``` # 20 - 案例 - 回到顶部 ## 效果展示  ## JS代码 ```js $(window).scroll(function () { if ($(this).scrollTop() >= 1000) { $('div').fadeIn(); } else { $('div').fadeOut(); } }); $('div').click(function () { // $(window).scrollTop(0); $('html').animate({ scrollTop: 0 }, 500); }) ``` # 21 - 案例 - 评论管理 ## 效果展示  ## JS代码 ```js var input_v = $('textarea'); var btn = $('.btn'); btn.click(function () { var item = $(`${input_v.val()}
删除${val}
`); // 设置p的样式 p.css('font-size', random(12, 30) + 'px').css('color', `rgb(${random(0, 100)}, ${random(0, 100)}, ${random(0, 100)})`); // 把 p 放到页面中 $('.screen').append(p); // p的高度,必须放到页面之后,才能获取 // console.log(p.height()); // p 上下的位置随机 // p.css('top', random(0, box的高度 - 下边的高度 - p的高度)); let t = $('.box').height() - $('.bottom_bar').outerHeight() - p.height(); p.css('top', random(0, t) + 'px'); // 给 p 加一个动画 p.animate( { right: $('.box').width() + p.width() + 'px' }, 10000, 'linear', function () { $(this).remove(); } ); }) ``` # 23 - 案例 - 待办事项 ## 效果展示  ## JS代码 ```js // 分析: // 1. 注册键盘事件(给输入框注册键盘事件) // ☞ 在键盘事件中创建元素 (判断用户按下是不是回车键) // ☞ 在类名叫 todo-list 标签中创建 li标签 // ☞ 在li标签中创建一个 类名叫 view 的div标签 // ☞ 在div标签中创建一个复选框标签,类名叫 toggle // ☞ 在div标签中创建一个label标签(显示用户输入内容) // ☞ 在div标签中创建一个类名叫destroy的button标签 // ☞ 在li中创建一个和div并列显示的类名叫edit的输入框标签 // 键盘事件 $('.new-todo').keydown(function (e) { if (e.keyCode == 13) { // 用户按下的是回车键 // 获取用户输入的内容 let v = $(this).val(); //a)创建li标签 let li = $(`