├── .DS_Store ├── CODES └── demo │ ├── index.html │ └── src │ └── index.js ├── IMGS ├── jquery.png └── jquery_download.png ├── README.md ├── 第01章 jQuery 基础.md ├── 第02章 jQuery DOM.md ├── 第03章 jQuery 事件.md ├── 第04章 jQuery 动画.md └── 第05章 jQuery 工具函数.md /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lihongyao/jQuery/f5365819f65f8c023c0d4d2debe3a742573b1c9a/.DS_Store -------------------------------------------------------------------------------- /CODES/demo/index.html: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | jQuery 14 | 15 | 16 |

17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /CODES/demo/src/index.js: -------------------------------------------------------------------------------- 1 | /* 2 | * @Author: Lee 3 | * @Date: 2021-12-20 19:29:23 4 | * @LastEditors: Lee 5 | * @LastEditTime: 2021-12-20 19:33:41 6 | */ 7 | 8 | 9 | $(function() { 10 | console.log("jQuery ready..."); 11 | 12 | $("#title").text("Hello, jQuery!"); 13 | }); -------------------------------------------------------------------------------- /IMGS/jquery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lihongyao/jQuery/f5365819f65f8c023c0d4d2debe3a742573b1c9a/IMGS/jquery.png -------------------------------------------------------------------------------- /IMGS/jquery_download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lihongyao/jQuery/f5365819f65f8c023c0d4d2debe3a742573b1c9a/IMGS/jquery_download.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | > 本课件参考: 2 | > 3 | > - [jQuery API 中文文档(官方)](https://www.jquery123.com/) 4 | > - [jQuery API 中文文档(非官方)](http://jquery.cuishifeng.cn/) 5 | > - [jQuery 菜鸟教程](http://www.runoob.com/jquery/jquery-tutorial.html) 6 | 7 | # 一、jQuery 简介 8 | 9 | jQuery是一套跨浏览器的 [JavaScript库](http://baike.sogou.com/lemma/ShowInnerLink.htm?lemmaId=1023011&ss_c=ssc.citiao.link),简化HTML与JavaScript之间的操作。它是[轻量级](http://baike.sogou.com/lemma/ShowInnerLink.htm?lemmaId=7988600&ss_c=ssc.citiao.link)的js库 ,兼容[CSS3](http://baike.sogou.com/lemma/ShowInnerLink.htm?lemmaId=40562&ss_c=ssc.citiao.link),还兼容各种浏览器,jQuery2.0及后续版本不再支持[IE6](http://baike.sogou.com/lemma/ShowInnerLink.htm?lemmaId=4794817&ss_c=ssc.citiao.link)/7/8浏览器。由 `John Resig` 在2006年1月的BarCamp NYC上发布第一个版本。目前是由 Dave Methvin 领导的开发团队进行开发。jQuery使用户能更方便地处理HTML documents、events、实现动画效果,并且方便地为网站提供 Ajax 交互。jQuery还有一个比较大的优势是,它的文档说明很全,而且各种应用也说得很详细,同时还有许多成熟的插件可供选择。jQuery能够使用户的html页面保持代码和html内容分离,也就是说,不用再在html里面插入一堆js来调用命令了,只需定义id即可。 10 | 11 | # 二、为什么使用jQuery 12 | 13 | 我们先来看这样一个全球网站使用框架(或库)统计的 [数据](https://w3techs.com/technologies/overview/javascript_library/all)。 14 | 15 | ![](IMGS/jquery.png) 16 | 17 | 统计图表右下角是统计的时间:2019年9月3日。 18 | 19 | # 三、jQuery 相关特点 20 | 21 | jQuery包含以下特点: 22 | 23 | - 动态特效 24 | - ajax 25 | - 通过插件来扩展 26 | - 方便的工具 - 例如浏览器版本判断 27 | - 渐进增强 28 | - 链式调用 29 | - 多浏览器支持,支持Internet Explorer6.0+、Opera9.0+、Firefox2+、Safari2.0+、Chrome1.0+(在2.0.0中取消了对Internet Explorer6,7,8的支持) 30 | 31 | # 四、jQuery 优势 32 | 33 | jQuery的座右铭是 “write less, do more.”,因为和传统的JavaScript相比,jQuery使得只需要使用更少的代码就可以完成同样的功能。jQuery具备以下优势: 34 | 35 | - 简单的选择器/DOM操作 36 | - 简化代码 37 | - 跨浏览器兼容性 38 | 39 | # 五、jQuery 与 JavaScript 的关系 40 | 41 | 简单地说,jQuery就是对JavaScript进行封装而出来的一个库。这和我们以前用JavaScript来写函数和方法,让一段段的语句有更强的可复用性和可维护性是一样的,只是jQuery把这件事情做得更加的极致了而已。 42 | 43 | jQuery的原理就是用它自定的一个变量名“jQuery”作为对象名,然后再赋值给“*$*”这个变量,并且还提供了一个noConflict()方法回调来允许开发自定义变量名从而防止和其它框架库命名的冲突。 44 | 45 | # 六、jQuery 版本选择 46 | 47 | 在jQuery的开发过程中,创建了大量的代码来支持IE6、7、8,从而使得脚本更大也更加复杂。因此当研发2.0版本的jQuery时,研发团队决定这个版本放弃对早期浏览器的支持,以便创建更小、更快的脚本。 48 | 49 | 不过,jQuery团队也考虑到,在网上仍然有很多用户使用这些早期的浏览器,因此开发者仍然需要去支持这些用户。出于这样的原因,他们保留了两个并行的jQuery版本: 50 | 51 | - `jQuery 1.9+`:包含和2.0x同样的功能,不过依然支持IE6、7、8。 52 | - `jQuery 2.0+`:放弃支持早期浏览器,使得脚本更小、更快。 53 | 54 | 这两个版本的功能在短期之内应该不会产生重要的区别。jQuery文件名中应该包含其版本号(比如,jquery-3.2.1.min.js 或 jquery-3.2.1.js)。如果不这样做的话,用户的浏览器可能会缓存更新或更旧版本的文件,从而可能导致脚本运行不正常。 55 | 56 | # 七、jQuery 引入方式 57 | 58 | ## 1、在线引用 59 | 60 | > [CDN 引用地址](http://www.bootcdn.cn/jquery/) 61 | 62 | ```html 63 | 64 | ``` 65 | 66 | ## 2、本地引用 67 | 68 | > [官网下载](http://jquery.com/download/) 69 | 70 | ![](./IMGS/jquery_download.png) 71 | 72 | 选择对应的版本,`ctr + S` 保存。然后再页面中引入即可: 73 | 74 | ```html 75 | 76 | 77 | ``` 78 | 79 | ## 3、包管理工具下载 80 | 81 | ```shell 82 | $ npm i -s jquery 83 | $ yarn add -s jquery 84 | ``` 85 | 86 | 下载指定版本(第1.x版的最新版本): 87 | 88 | ```  89 | $ npm i -s jquery@1.9 90 | ``` 91 | 92 | 下载的jQuery文件夹包含在一个叫做“node_modules”的文件夹下。 93 | 94 | ## 4、文档就绪 95 | 96 | ```js 97 | $(window).ready(function() { 98 | 99 | }) 100 | $(function() { 101 | 102 | }) 103 | ``` 104 | 105 | # 八、对象转换 106 | 107 | ```html 108 |

Hello, jQuery!

109 | ``` 110 | 111 | 我们看看原生JavaScript和jquery获取h1标签的形式: 112 | 113 | ```javascript 114 | // 1. 原生JavaScript获取元素 115 | let title = document.querySelector("#title"); 116 | console.log(title.textContent); // Hello, jQuery! 117 | // 2. jQuery获取元素 118 | let $title = $("#title"); 119 | console.log($title.text()); // Hello, jQuery! 120 | ``` 121 | 122 | 可以看到,两种方法实现的效果都是一样的,但是明显jQuery的语法更加简洁。需要注意的是原生对像和jQuery对象是不相等的,所以有时我们需要将二者进行转换,转换方式如下: 123 | 124 | ```js 125 | // 1. JavaScript对象转jQuery对象 126 | $(title); 127 | // 2. jQuery对象转JavaScript对象 128 | $title[0]; 129 | $title.get(0); 130 | ``` 131 | 132 | # 九、jquery 防止冲突 133 | 134 | 我们知道,变量的命名可以以英文字母、下划线和$符开头。英文字符的命名容易产生重名,下划线美观度又不够。所以很多编程语言,以至于很多JS框架或库都喜欢用“$”符来作为变量名,jQuery就是其中的“著名代表”。这样一来就造成一个问题,如果一个项目中若采用多种第三方的插件、框架和类库难免会产生“$”名称的冲突,而使用“jQuery”这个默认对象作为名称书写起来又比较麻烦,且容易写错。为了解决这个问题,jQuery使用了一个 `noConflict()` 方法来让开发者可以自定义jQuery对象($对象)的名称。 135 | 136 | ```javascript 137 | // 将“$“对象的名称改为”jq“ 138 | var jq = $.noConflict(); 139 | jq("li").click(function(){ 140 | var txt = jq(this).text(); 141 | jq("p").text(text); 142 | }); 143 | ``` 144 | 145 | 这样一来我们就可以使用“jq”作为我们全局的jQuery对象名了。但若我们开发的项目只使用了jQuery这个库,或者使用的其它第三方程序与jQuery没有名称上的冲突,那是完全没有必要这要做的。毕竟技术的一些关键名称会形成开发者的一些习惯,也是团队间无声的交流语言。如果只是图一个个性,把这个名字改了,只会给团队开发造成一些不必要的困扰。 146 | 147 | # 十、插件 148 | - [jQuery 之家 >>]() 149 | - [jQuery 插件库 >>]() 150 | -------------------------------------------------------------------------------- /第01章 jQuery 基础.md: -------------------------------------------------------------------------------- 1 | # 第 01 回:选择器 2 | 3 | jQuery 允许使用 CSS选择器查找元素,其语法形式为:`$('Selector')`,它还提供了一些额外的选择器,见下方的 \`*jQuery*` 注释。 4 | 5 | ## 1、查找元素 6 | 7 | - `*`:通用选择器 **->** 返回页面所有的html元素节点集合; 8 | 9 | 10 | - `element`:标签选择器 **->** 返回所有指定标签元素节点集合; 11 | 12 | 13 | - `#id`:id选择器 **->** 返回指定id元素节点; 14 | - `.class`:返回指定class元素节点集合; 15 | - `selector1, selector2, selectorN`:群组选择器 **->** 返回所有指定群组选择器元素节点集合; 16 | 17 | ## 2、基本选择器 18 | 19 | - `ancestor descendant`:后代选择器 **->** 返回指定后代元素节点集合; 20 | - `parent > child'`:子类选择器 **->** 返回指定子类元素节点集合; 21 | - `prev + next`:同级元素选择器 **->** 返回指定同级元素节点,当前节点的下一节点; 22 | - `prev ~ sibilings`:同级元素选择器 **->** 返回指定同级元素节点,当前节点后面所有的指定元素节点; 23 | 24 | ## 3、基本筛选器 25 | 26 | - `:not(selector)`:除选择器之外的所有元素。 比如 `div:not('#summary')` 27 | - `:first`:选中元素中的第一个元素;*( jQuery )* 28 | - `:last`:选中元素中的最后一个元素;*( jQuery )* 29 | - `:even`:选中元素中索引编号为偶数的元素;*( jQuery )* 30 | - `:odd`:选中元素中索引编号为奇数的元素;*( jQuery )* 31 | - `:eq(index)`:选中元素中索引编号为参数中指定数字的元素;*( jQuery )* 32 | - `:gt(index)`:选中元素中索引编号大于参数中指定数字的元素;*( jQuery )* 33 | - `:lt(index)`:选中元素中索引编号小于参数中指定数字的元素;*( jQuery )* 34 | - `header`:所有的 \

到\

元素;*( jQuery )* 35 | - `:animated`:正在进行动画的元素;*( jQuery )* 36 | - `:focus`:当前拥有焦点的元素; 37 | 38 | ## 4、内容筛选器 39 | 40 | - `:contains('text')`:包含参数中指定文本的元素; 41 | - `:empty`:没有子节点的所有元素; 42 | - `:parent`:拥有子节点(文本或子元素)的元素;*( jQuery )* 43 | - `:has(selector)`:至少包含一个匹配选择器的元素;比如:`div:has(p)` 匹配所有包含\

元素的\

元素; 44 | 45 | ## 5、可见性筛选器 46 | 47 | - `:hidden`:所有隐藏的元素;*( jQuery )* 48 | 49 | - `:visible`:所有在页面布局中占据空间的元素;*( jQuery )* 50 | 51 | > 1、不会选中的元素包括:*display: none; height/width: 0; 祖先元素被隐藏*; 52 | 53 | > 2、会选中的元素包括:*visibility: hidden; opacity: 0;* 因为他们都会在布局中占据空间; 54 | 55 | ## 6、子节点筛选器 56 | 57 | - `:nth-child(n)`:指定下标位置的子节点; 58 | - `:first-child`:当前选中元素的第一个子节点; 59 | - `:last-child`:当前选中元素的最后一个子节点; 60 | - `:only-child`:当元素是父元素中位移的子节点时; 61 | 62 | ## 7、属性选择器 63 | 64 | - `[attribute]`:拥有指定属性的元素(属性值不限); 65 | - `[attribute = 'value']`:拥有指定属性,并且值为指定值的元素; 66 | - `[attribute != 'value']`:拥有指定属性,并且值不为指定值的元素;*( jQuery )* 67 | - `[attribute ^= 'value']`:属性值以特定值开头; 68 | - `[attribute $= 'value']`:属性值以特定值结尾; 69 | - `[attribute *= 'value']`:属性值含有特定值; 70 | 71 | ## 8、表单 72 | 73 | - `:input`:匹配所有 input, textarea, select 和 button 元素;*( jQuery )* 74 | - `:text`:匹配所有文本类型的input元素;*( jQuery )* 75 | - `:password`:匹配所有密码类型的input元素;*( jQuery )* 76 | - `:radio`:匹配所有单选按钮;*( jQuery )* 77 | - `:checkbox`:匹配所有复选框;*( jQuery )* 78 | - `:submit`:匹配所有提交按钮;*( jQuery )* 79 | - `:image`:匹配所有图片按钮;*( jQuery )* 80 | - `:reset`:匹配所有重置按钮;*( jQuery )* 81 | - `:button`:匹配所有按钮;*( jQuery )* 82 | - `:file`:匹配所有文件域;*( jQuery )* 83 | - `:selected`:匹配下拉列表中所有被选中的列表项; 84 | 85 | 86 | - `:enabled`:匹配所有可用的表单元素; 87 | - `:disabled`:匹配所有禁用的表单元素; 88 | - `:checked`:匹配所有被选中的按钮或复选框; 89 | 90 | 91 | > 提示: 92 | > 93 | > 1. jQuery选中一个或多个元素后,会返回一个jQuery对象(类似数组对象)。这个对象通常被称为 “匹配结果集” 或 “jQuery选取结果”。每一个元素都有一个索引编号,我们可通过索引取到结果集中的具体对象。由于jQuery的选取结果为一个集合,因此可能会含有多个元素。如果匹配结果集中含有多个元素,在使用一个方法获取信息时,那么jQuery只会从匹配结果集的第一个元素中获取此信息;在使用一个方法更新信息时,那么jQuery会更新匹配结果集中所有元素的信息,而不止第一个元素。jQuery对象会保存对元素的引用。把jQuery对象缓存在变量中,变量中就包含了对元素的引用。当变量包含一个jQuery对象时,通常都会在变量名的前面加一个`$`符号用来区分脚本中的其他变量,比如:`let $imgBox = $('#img-box');`。 94 | > 2. `this` 是 JavaScript 中的关键字;`$(this)` 是 jQuery 对象; 95 | 96 | # 第 02 回:文本 97 | 98 | 读取、修改元素的html结构或者元素的文本内容是常见的DOM操作,jQuery针对这样的处理提供了2个便捷的方法.html()与.text() 99 | 100 | ## 1、.html() 101 | 102 | 获取/设置集合中第一个匹配元素的HTML内容,常用的有如下两种使用方法: 103 | 104 | - `.html()`:获取集合中第一个匹配元素的HTML内容 105 | - `.html( htmlString )`:设置每一个匹配元素的HTML内容 106 | 107 | > 提示:`.html()` 方法如DOM中的 `innerHTML()` 方法,所以在设置与获取上需要注意的一个最重要的问题,这个操作是针对整个HTML内容(不仅仅只是文本内容) 108 | 109 | ## 2、.text() 110 | 111 | 获取匹配元素集合中每个元素的文本内容结合,包括他们的后代,或设置匹配元素集合中每个元素的文本内容为指定的文本内容。具体有2种用法: 112 | 113 | - `.text()`:获取匹配元素集合中每个元素的合并文本,包括他们的后代 114 | - `.text( textString )`:设置匹配元素的文本 115 | 116 | > 提示:.text()结果返回一个字符串,包含所有匹配元素的合并文本 117 | 118 | **> .html & .text similarities and differences** 119 | 120 | - .html与.text的方法操作是一样,只是在具体针对处理对象不同 121 | - .html处理的是元素内容,.text处理的是文本内容 122 | - .html只能使用在HTML文档中,.text 在XML 和 HTML 文档中都能使用 123 | - 如果处理的对象只有一个子文本节点,那么html处理的结果与text是一样的 124 | - 火狐不支持innerText属性,用了类似的textContent属性,.text()方法综合了2个属性的支持,所以可以兼容所有浏览器 125 | 126 | ## 3、.val() 127 | 128 | 该方法主要用于处理表单元素的值,比如input、select和textarea。其使用方法有一下3种形式: 129 | 130 | - `.val()`:获取匹配的元素集合中第一个元素的当前值 131 | - `.val( value )`:设置匹配的元素集合中每个元素的值 132 | - `.val( function )`:一个用来返回设置值的函数 133 | 134 | > 提示: 135 | > 136 | > 1. 通过 `.val()` 处理select元素,当没有选择项被选中时,它返回 `null` 137 | > 2. .val() 方法多用来设置表单字段的值 138 | > 3. 如果select元素由multiple(多选)属性,并且至少一个选择项被选中,`.val()` 方法返回一个数组,这个数组包含每个选中选择项的值。 139 | 140 | # 第 03 回:属性 141 | 142 | ## 1、元素属性 143 | 144 | - `.attr(key[, value])`:获取/设置属性 145 | - `.attr(attributes)`:给指定元素设置多个属性值,语法形式为:{属性名1:属性值1, 属性名2:属性值2, …...} 146 | - `.removeAttr(key)`:移除属性 147 | 148 | ## 2、状态属性 149 | 150 | 通过 `prop()` 方法切换状态(true和false之间切换) 151 | 152 | - `.prop(key[, value])`:获取/设置状态属性 153 | - `.removeProp(key)`:移除状态属性 154 | - `$checkbox.prop("indeterminate", true)`:获取/设置 “checkbox” 半选中状态 155 | 156 | ## 3、.data() 157 | 158 | HTML5 dataset 是新的HTML5标准,允许你在普通的元素标签里嵌入类似 *data-\** 的属性,来实现一些简单数据的存取。它的数量不受限制,并且也能由JavaScript动态修改,也支持CSS选择器进行样式设置。这使得data属性特别灵活,也非常强大。有了这样的属性我们能够更加有序直观的进行数据预设或存储。那么在不支持HTML5标准的浏览器中,我们如何实现数据存取? jQuery就提供了一个*.data()* 的方法来处理这个问题。 159 | 160 | 使用jQuery初学者一般不是很关心data方式,这个方法是jquery内部预用的,可以用来做性能优化。当然这个也是非常重要的一个API了,常常用于我们存放临时的一些数据,因为它是直接跟DOM元素对象绑定在一起的 161 | 162 | jQuery提供的存储接口 163 | 164 | ```javascript 165 | // 1、静态接口 166 | jQuery.data( element, key, value ) // 存数据 167 | jQuery.data( element, key ) // 取数据 168 | 169 | // 2、实例接口 170 | .data( key, value ) // 存数据 171 | .data( key ) // 取数据 172 | ``` 173 | 174 | 2个方法在使用上存取都是通一个接口,传递元素,键值数据。在jQuery的官方文档中,建议用.data()方法来代替。 175 | 176 | 我们把DOM可以看作一个对象,那么我们往对象上是可以存在基本类型,引用类型的数据的,但是这里会引发一个问题,可能会存在**循环引用的内存泄漏风险**。 177 | 178 | 通过jQuery提供的数据接口,就很好的处理了这个问题了,我们不需要关心它底层是如何实现,只需要按照对应的data方法使用就行了。 179 | 180 | 同样的也提供2个对应的删除接口,使用上与data方法其实是一致的,只不过是一个是增加一个是删除罢了。 181 | 182 | ```javascript 183 | jQuery.removeData( element [, name ] ) 184 | 185 | .removeData( [name ] ) 186 | ``` 187 | 188 | # 第 04 回:样式 189 | 190 | ## 1、.class Styles 191 | 192 | - `.hasClass()` 193 | 194 | 该方法用于判断元素是否包含某class。 195 | 196 | - `.addClass()` 197 | 198 | 该方法可以为元素添加类名,通过动态改变类名,可以让其修改元素呈现不同的效果. 199 | 200 | > 提示:如果添加多个类名,请使用空格隔开。`.addClass()` 方法不会替换一个样式类名。它只是简单的添加一个样式类名到元素上 201 | 202 | - `.removeClass()` 203 | 204 | 该方法的作用是从匹配的元素中删除全部或者指定的class,使用方法如下: 205 | 206 | `.removeClass()`:删除所有class 207 | 208 | `.removeClass([ className ])`:每个匹配元素移除的一个或多个用空格隔开的样式名 209 | 210 | - `.toggleClass()` 211 | 212 | 该方法主要用于类名的互斥切换,比如有时我们需要在删除对应类名和添加赌赢类名之间切换的时候,我们可直接使用该方法,更加方便。一次执行,相当于addClass,再次执行相当于removeClass。 213 | 214 | ## 2、.css Styles 215 | 216 | `.css()` 方法主要用于设置/获取DOM元素样式。 217 | 218 | **a、获取** 219 | 220 | - `.css( propertyName )`:获取匹配元素集合中的第一个元素的样式属性的计算值 221 | - `.css( propertyNamess )`:传递一组数组,返回一个对象结果 222 | 223 | **b、设置** 224 | 225 | - `.css(propertyName, value )`:设置CSS 226 | - `.css( properties )`:可以传一个对象(严格语法json),同时设置多个样式 227 | 228 | # 第 05 回:尺寸与位置 229 | 230 | - `.height()`:获取/设置匹配元素当前计算的高度值(px) 231 | - `.innerHeight()`:获取第一个匹配元素内部区域高度(包括padding、不包括border)。 232 | - `.outerHieght()`:获取第一个匹配元素外部高度(默认包括padding和border)。 233 | - `.width()`:获取/设置第一个匹配元素当前计算的宽度值(px)。 234 | - `.innerWidth()`:获取第一个匹配元素内部区域宽度(包括padding、不包括border)。 235 | - `.outerWidth()`:获取第一个匹配元素外部宽度(默认包括padding和border)。 236 | - `.scrollTop()`:设置/获取匹配元素相对滚动条顶部的偏移。 237 | - `.scrollLeft()`:设置/获取匹配元素相对滚动条左侧的偏移。 238 | - `offset()`:获取元素偏移,相对于文档而言,有四个选项(`.top, .left, .right, .bottom`) 239 | - `position`:获取元素位置,相对于拥有定位属性的祖先级元素而言,有四个选项(`.top, .left, .right, .bottom`) 240 | -------------------------------------------------------------------------------- /第02章 jQuery DOM.md: -------------------------------------------------------------------------------- 1 | # 第01回:节点创建 2 | 3 | ## 1、创建元素节点 4 | 5 | 可以有几种方式,后面会慢慢接触。常见的就是直接把这个节点的结构通过HTML标记字符串描述出来,通过`$()`函数处理,`$("html结构")` 6 | 7 | ```javascript 8 | $('
') 9 | ``` 10 | 11 | ## 2、创建文本节点 12 | 13 | 与创建元素节点类似,可以直接把文本内容一并描述 14 | 15 | ```javascript 16 | $('
我是文本节点
') 17 | ``` 18 | 19 | ## 3、创建属性节点 20 | 21 | 与创建元素节点同样的方式 22 | 23 | ```javascript 24 | $("
我是文本节点
") 25 | ``` 26 | 27 | # 第02回:节点插入 28 | 29 | ## 1、`.append()` 、`.appendTo()` * 30 | 31 | | 选择器 | 描述 | 32 | | ------------- | -------------------------------------------------- | 33 | | `append( )` | 向每个匹配的元素内部追加内容 | 34 | | `appendTo( )` | 把所有匹配的元素**追加到**另一个、指定的元素集合中 | 35 | 36 | ```javascript 37 | $(A).append(B); // 把B添加到A中(作为A的最后一个子元素) 38 | $(A).appendTo(B);// 把A添加到B中(作为B的最后一个子元素) 39 | ``` 40 | 41 | ## 2、`.after()`、`.before()` * 42 | 43 | | 选择器 | 描述 | 44 | | ----------- | -------------------- | 45 | | `after( )` | 指定元素后面添加内容 | 46 | | `before( )` | 指定元素前面添加内容 | 47 | 48 | ```javascript 49 | $(A).after(B); // 在A的后面添加B 50 | $(A).before(B);// 在A的前面添加B 51 | ``` 52 | 53 | ## 3、`.prepend()`、`.prependTo()` * 54 | 55 | | 选择器 | 描述 | 56 | | -------------- | ------------------------------ | 57 | | `prepend( )` | 指定元素内部前置一内容 | 58 | | `prependTo( )` | 指定元素前置到另一个元素的内部 | 59 | 60 | ```javascript 61 | $(A).prepend(B); // 把B添加到A中(作为A的第一个子元素) 62 | $(A).prependTo(B); // 把A添加到B中(作为B的第一个子元素) 63 | ``` 64 | 65 | ## 4、`.insertAfter()`、`.insertBefore()` 66 | 67 | | 选择器 | 描述 | 68 | | ---------------- | -------------------------- | 69 | | `insertAfter()` | 将内容插入到指定元素的后面 | 70 | | `insertBefore()` | 将内容插入到指定元素的前面 | 71 | 72 | ```javascript 73 | $(A).insertAfter(B); // 将A插入到B的后面 74 | $(A).insertBefore(B); // 将A插入到B的前面 75 | ``` 76 | 77 | # 第03回:节点删除 78 | 79 | ## 1、`.empty()` 80 | 81 | 该方法主要是用于清空指定元素的所有子节点,如: 82 | 83 | ```html 84 |
85 |

耀哥

86 |
87 | ``` 88 | 89 | 如果我们通过empty方法移除里面div的所有元素,它只是清空内部的html代码,但是标记仍然留在DOM中。 90 | 91 | ```javascript 92 | // 通过empty处理 93 | $('.hello').empty(); 94 | 95 | // 结果:
96 | ``` 97 | 98 | ## 2、`.remove()` * 99 | 100 | 移除元素自身,包括子节点、事件等信息。 101 | 102 | ```javascript 103 | // 通过remove处理 104 | $('.btn').remove(); // 结果:节点不存在了,同时事件也会被销毁 105 | ``` 106 | 107 | ## 3、`.detach()` 108 | 109 | 如果我们希望临时删除页面上的节点,但是又不希望节点上的数据与事件丢失,并且能在下一个时间段让这个删除的节点显示到页面,这时候就可以使用detach方法来处理。 110 | 111 | detach从字面上就很容易理解。让一个web元素托管。即从当前页面中移除该元素,但保留这个元素的内存模型对象。 112 | 113 | > jQuery 官方文档说明: 114 | 115 | > ```javascript 116 | > 这个方法不会把匹配的元素从jQuery对象中删除,因而可以在将来再使用这些匹配的元素。与remove()不同的是,所有绑定的事件、附加的数据等都会保留下来。 117 | > $("div").detach()这一句会移除对象,仅仅是显示效果没有了。但是内存中还是存在的。当你append之后,又重新回到了文档流中。就又显示出来了。 118 | > ``` 119 | 120 | 当然这里要特别注意,detach方法是JQuery特有的,所以它只能处理通过JQuery的方法绑定的事件或者数据。 121 | 122 | ```js 123 | var li = $(".list li:eq(2)").detach(); 124 | setTimeout(() => { 125 | $(".list").append(li); 126 | }, 3000); 127 | ``` 128 | 129 | # 第04回:节点复制与替换 130 | 131 | ## 1、`.clone()` 132 | 133 | 克隆节点是DOM的常见操作,jQuery提供一个clone方法,专门用于处理dom的克隆。 134 | 135 | clone()方法深度复制所有匹配的元素集合,包括所有匹配元素、匹配元素的下级元素、文字节点。 136 | 137 | clone方法比较简单就是克隆节点,但是需要注意,如果节点有事件或者数据之类的其他处理,我们需要通过`clone(ture)` 传递一个布尔值 `ture`用来指定,这样不仅仅只是克隆单纯的节点结构,还要把附带的事件与数据给一并克隆了。 138 | 139 | ```javascript 140 | $("div").on('click', function() {//执行操作}) 141 | 142 | //clone处理一 143 | $("div").clone() // 只克隆了结构,事件丢失 144 | 145 | //clone处理二 146 | $("div").clone(true) // 结构、事件与数据都克隆 147 | ``` 148 | 149 | ## 2、`.replaceWith()`、`.replaceAll()` * 150 | 151 | ```javascript 152 | $(A).replaceWith(B); // 把A替换为B 153 | $(A).replaceAll(B); // 把B替换为A 154 | ``` 155 | 156 | ## 3、`.wrap()` 157 | 158 | 如果要将元素用其他元素包裹起来,也就是给它增加一个父元素,针对这样的处理,JQuery提供了一个 *wrap* 方法。 159 | 160 | ```html 161 |

Hello, world!

162 | ``` 163 | 164 | ```javascript 165 | $('p').wrap('
') 166 | 167 | // 结果为: 168 | /* 169 |
170 |

Hello, world!

171 |
172 | */ 173 | ``` 174 | 175 | ## 4、`.unwrap()` 176 | 177 | 该方法与wrap方法相反,unwrap方法将匹配元素集合的父级元素删除,保留自身(和兄弟元素,如果存在)在原来的位置。 178 | 179 | ## 5、`.wrapAll()` 180 | 181 | wrap是针对单个dom元素处理,如果要将集合中的元素用其他元素包裹起来,也就是给他们增加一个父元素,针对这样的处理,JQuery提供了一个wrapAll方法,比如,页面上有两个p元素,如果要为两个p元素添加共有的一个父类div,则通过如下代码实现: 182 | 183 | ```javascript 184 | $('p').wrapAll('
'); 185 | ``` 186 | 187 | ## 6、`.wrapInner()` 188 | 189 | 如果要将集合中的元素内部所有的子元素用其他元素包裹起来,并当作指定元素的子元素,针对这样的处理,JQuery提供了一个wrapInner方法。我们来看例子: 190 | 191 | ```html 192 |
Hello, world!
193 |
Hello, world!
194 | ``` 195 | 196 | ```javascript 197 | $('div').wrapInner('

'); 198 | 199 | // 结果为: 200 | /* 201 |
202 |

Hello, world!

203 |
204 |
205 |

Hello, world!

206 |
207 | */ 208 | ``` 209 | 210 | ## 第05回:节点遍历 211 | 212 | ## 1、`.children()` * 213 | 214 | jQuery是一个集合对象,如果想快速查找集合里面的第一级子元素,此时可以用 `children()` 方法。这里需要注意:*.children(selector)* 方法是返回匹配元素集合中每个元素的所有子元素(仅儿子辈,这里可以理解为就是父亲-儿子的关系) 215 | 216 | ```html 217 |
218 |
    219 |
  • 1
  • 220 |
221 |
222 | ``` 223 | 224 | 代码如果是 *$(".div").children()* ,那么意味着只能找到ul,因为div与ul是父子关系,li与div是祖辈关系,因此无法找到。 225 | 226 | > 提示:jQuery是一个集合对象,所以通过children是匹配集合中每一个元素的第一级子元素。 227 | 228 | 该方法可以接受参数,用于筛选子元素,如 *"$('.parent').children(.active)"*,匹配子元素中类名为 `active` 的那一个。 229 | 230 | ## 2、.find() * 231 | 232 | find 与 children 类似,区别在于 children是父子关系查找,find是后代关系查找(包含父子关系)。 233 | 234 | ```html 235 |
236 |
    237 |
  • 1
  • 238 |
239 |
240 | ``` 241 | 242 | 代码如果是 `$("div").find("li")` ,此时,li与div是祖辈关系,通过find方法就可以快速的查找到了。 243 | 244 | > 提示: 245 | > 246 | > 1. find是遍历当前元素集合中每个元素的后代。只要符合,不管是儿子辈,孙子辈都可以。 247 | > 2. 与其他的树遍历方法不同,选择器表达式对于 `.find()` 是必需的参数。如果我们需要实现对所有后代元素的取回,可以传递通配选择器 `*`。 248 | > 3. find只在后代中遍历,不包括自己。 249 | 250 | ## 3、`.parent()` * 251 | 252 | 如果想快速查找合集里面的每一个元素的父元素(这里可以理解为就是父亲-儿子的关系),此时可以用 *parent()* 方法。因为是父元素,这个方法只会向上查找一级。 253 | 254 | ```html 255 |
256 |
    257 |
  • 1
  • 258 |
259 |
260 | ``` 261 | 262 | 查找ul的父元素 div, *$(ul).parent()* ,就是这样简单的表达 263 | 264 | ## 4、`.parents()` 265 | 266 | jQuery是一个合集对象,如果想快速查找合集里面的每一个元素的所有祖辈元素,此时可以用 *parents()* 方法。其实也类似 *find* 与 *children* 的区别,parent只会查找一级,parents则会往上一直查到查找到祖先节点。 267 | 268 | ```html 269 |
270 |
    271 |
  • 1
  • 272 |
273 |
274 | ``` 275 | 276 | 在li节点上找到祖辈元素div, 这里可以用 *$("li").parents()* 方法 277 | 278 | ## 5、`.closest()` 279 | 280 | 以选定的元素为中心,往内查找可以通过find、children方法。如果往上查找,也就是查找当前元素的父辈祖辈元素,jQuery提供了*closest()* 方法,这个方法类似parents但是又有一些细微的区别,属于使用频率很高的方法。 281 | 282 | *closest()* 方法接受一个匹配元素的选择器字符串。从元素本身开始,在DOM 树上逐级向上级元素匹配,并返回最先匹配的祖先元素。例如:在a元素中,往上查找所有的li元素,可以这样表达:*$("a").closet("li')*。 283 | 284 | > 提示:jQuery是一个集合对象,所以通过closest是匹配集合中每一个元素的祖先元素。 285 | 286 | 粗看 *.parents()* 和 *.closest()* 是有点相似的,都是往上遍历祖辈元素,但是两者还是有区别的,否则就没有存在的意义了 287 | 288 | - 起始位置不同:.closest 开始于当前元素 .parents开始于父元素 289 | - 遍历的目标不同:.closest要找到指定的目标,.parents遍历到文档根元素,closest向上查找,直到找到一个匹配的就停止查找,parents 一直查找到根元素,并将匹配的元素加入集合 290 | - 结果不同:.closest返回的是包含零个或一个元素的jquery对象,parents返回的是包含零个或一个或多个元素的jquery对象 291 | 292 | ## 6、`.next()`、`.nextAll()` * 293 | 294 | - `.next()`:该方法用于匹配当前元素的下一个元素。 295 | - `.nextAll()`:查找当前元素之后所有的同辈元素。 296 | 297 | ## 7、.prev()、.prevAll() * 298 | 299 | - `.prev()`:该方法用于匹配当前元素的上一个元素。 300 | - `.prevAll()`:查找当前元素之前所有的同辈元素 301 | 302 | ## 8、`.siblings()` * 303 | 304 | 该方法用于匹配当前元素的所有兄弟元素。 305 | 306 | # 第 06 回:筛选 307 | 308 | ## 1、`.eq(index)` * 309 | 310 | 获取当前链式操作中第N个jQuery对象,返回jQuery对象,当参数大于等于0时为正向选取,比如0代表第一个,1代表第二个。当参数为负数时为反向选取,比如-1为倒数第一个,具体可以看以下示例。 311 | 312 | ## 2、`.first()`、`.last()` * 313 | 314 | - `.first()`:获取匹配元素集合中第一个元素。 315 | - `.last()`:获取匹配元素集合中最后一个元素。 316 | 317 | ## 3、`.filter()` 318 | 319 | 筛选出与指定表达式匹配的元素集合。这个方法用于缩小匹配的范围。用逗号分隔多个表达式。 320 | 321 | ## 4、`.is()` 322 | 323 | 根据选择器、DOM元素或 jQuery 对象来检测匹配元素集合,如果其中至少有一个元素符合这个给定的表达式就返回true。如果没有元素符合,或者表达式无效,都返回'false'。 324 | 325 | 注意:、在jQuery 1.3中才对所有表达式提供了支持。在先前版本中,如果提供了复杂的表达式,比如层级选择器(比如 + , ~ 和 > ),始终会返回true 326 | 327 | ## 5、`.not()` 328 | 329 | 从匹配元素的集合中删除与指定表达式匹配的元素 330 | 331 | ## 6、`.map(callback)` 332 | 333 | 通过一个函数匹配当前集合中的每个元素,产生一个包含新的jQuery对象。 334 | 335 | ## 7、`.has()` 336 | 337 | 筛选匹配元素集合中的那些有相匹配的选择器或DOM元素的后代元素。 338 | 339 | -------------------------------------------------------------------------------- /第03章 jQuery 事件.md: -------------------------------------------------------------------------------- 1 | # 第01回:事件添加 2 | 3 | 语法形式: 4 | 5 | ```javascript 6 | $el.eventType( [eventData ], handler(eventObject) ) 7 | ``` 8 | 9 | ```javascript 10 | $(".btn").click("Henry", function(event) { 11 | // this -> 按钮对象 12 | console.log(`Hello, ${event.data}!`); 13 | }); 14 | ``` 15 | 16 | # 第02回:事件类型 17 | 18 | 事件类型和原生事件类型一致,这里只列出jQuery特有的一些事件: 19 | 20 | ## 1、`.hover()` 21 | 22 | 切换事件,类似于css中的hover,其语法形式为: 23 | 24 | ```js 25 | $(selector).hover(handlerIn, handlerOut) 26 | ``` 27 | 28 | ## 2、`.one()` 29 | 30 | 一次事件,顾名思义,事件方法只会触发一次。基本语法如下: 31 | 32 | ```javascript 33 | $("div").one(eventType, handler(eventObject) ) 34 | ``` 35 | 36 | > 特别注意: 37 | > 38 | > ``` 39 | > form元素是有默认提交表单的行为,如果通过submit处理的话,需要禁止浏览器的这个默认行为 40 | > 传统的方式是调用事件对象 e.preventDefault() 来处理, jQuery中可以直接在函数中最后结尾return false即可 41 | > ``` 42 | > 43 | > jQuery处理如下: 44 | > 45 | > ```javascript 46 | > $("#target").submit(function(data) { 47 | > return false; //阻止默认行为,提交表单 48 | > }); 49 | > ``` 50 | 51 | # 第03回:事件的绑定和解绑 52 | 53 | ## 1、`on()` 事件绑定 54 | 55 | 之前学的鼠标事件,表单事件与键盘事件都有个特点,就是直接给元素绑定一个处理函数,所有这类事件都是属于快捷处理。翻开源码其实可以看到,所有的快捷事件在底层的处理都是通过一个 `.on()` 方法来实现的。jQuery `.on()` 方法是官方推荐的绑定事件的一个方法。 56 | 57 | **基本用法**: 58 | 59 | ```javascript 60 | .on( events ,[ selector ] ,[ data ], fn ) 61 | ``` 62 | 63 | 最常见的给元素绑定一个点击事件,对比一下快捷方式与on方式的不同: 64 | 65 | ```javascript 66 | $("#btn").click(function(){}) // 快捷方式 67 | $("#btn").on('click',function(){}) // on方式 68 | ``` 69 | 70 | **多个事件绑定同一个函数** 71 | 72 | ```javascript 73 | $("#btn").on("mouseover mouseout", function(){ }); 74 | ``` 75 | 76 | 通过空格分离,传递不同的事件名,可以同时绑定多个事件。 77 | 78 | **多个事件绑定不同函数** 79 | 80 | ```javascript 81 | $("#btn").on({ 82 | mouseover: function(){}, 83 | mouseout: function(){} 84 | }); 85 | ``` 86 | 87 | 通过逗号分离,传递不同的事件名,可以同时绑定多个事件,每一个事件执行自己的回调方法。 88 | 89 | **将数据传递到处理程序** 90 | 91 | ```javascript 92 | function fn(event) { 93 | console.log(`Hello, ${event.data.name}!`); 94 | } 95 | $(".btn").on("click", {name: "耀哥"}, fn); 96 | ``` 97 | 98 | 可以通过第二参数(对象),当一个事件被触发时,要传递给事件处理函数的 99 | 100 | ## 2、on() 事件代理 101 | 102 | JavaScript中,由于事件的冒泡机制,我们可以为事件设置代理,同样的,jQuery在on方法上也添加了事件代理这一机制,其语法形式如下: 103 | 104 | ```javascript 105 | .on( events ,[ selector ] ,[ data ], handler(eventObject) ) 106 | ``` 107 | 108 | 在on的第二参数中提供了一个selector选择器,简单的来描述下: 109 | 110 | 参考下面3层结构 111 | 112 | ```html 113 |
114 |

115 | 目标节点 116 |

117 |
118 | ``` 119 | 120 | 给出如下代码: 121 | 122 | ```javascript 123 | $('div').on('click', 'p', function(e) { 124 | e.target.textContent = 'Hello, world!'; 125 | }); 126 | ``` 127 | 128 | > 事件绑定在最上层div元素上,当用户触发在a元素上,事件将往上冒泡,一直会冒泡在div元素上。如果提供了第二参数,那么事件在往上冒泡的过程中遇到了选择器匹配的元素,将会触发事件回调函数。 129 | 130 | ## 3、`off()` 卸载事件 131 | 132 | 根据on绑定事件的一些特性,off 方法也可以通过相应的传递组合的事件名,名字空间,选择器或处理函数来移除绑定在元素上指定的事件处理函数。当有多个过滤参数时,只有与这些参数完全匹配的事件处理函数才会被移除。 133 | 134 | 绑定两个事件 135 | 136 | ```javascript 137 | $("el").on("mousedown mouseup", fn) 138 | ``` 139 | 140 | 删除一个事件 141 | 142 | ```javascript 143 | $("el").off("mousedown") 144 | ``` 145 | 146 | 删除所有事件 147 | 148 | ```javascript 149 | $("el").off("mousedown mouseup") 150 | ``` 151 | 152 | 快捷方式删除所有事件,这里不需要传递事件名了,节点上绑定的所有事件将全部销毁 153 | 154 | ```javascript 155 | $("el").off() 156 | ``` 157 | 158 | # 第04回:事件对象 159 | 160 | 同原生 161 | 162 | # 第05回:自定义事件 163 | 164 | ## 1、trigger事件 165 | 166 | 众所周知类似于mousedown、click、keydown 等等这类型的事件都是浏览器提供的,通俗叫原生事件,这类型的事件是需要有交互行为才能被触发。 167 | 168 | 在jQuery通过on方法绑定一个原生事件 169 | 170 | ```javascript 171 | $('#elem').on('click', function() { 172 | alert("触发系统事件") 173 | }); 174 | ``` 175 | 176 | alert需要执行的条件:必须有用户点击才可以。如果不同用户交互是否能在某一时刻自动触发该事件呢? 正常来说是不可以的,但是jQuery解决了这个问题,提供了一个 **trigger** 方法来触发浏览器事件 177 | 178 | 所以我们可以这样: 179 | 180 | ```javascript 181 | $('#elem').trigger('click'); 182 | ``` 183 | 184 | 在绑定on的事件元素上,通过trigger方法就可以调用到alert了,挺简单! 185 | 186 | **再来看看.trigger是什么?** 187 | 188 | > 简单来讲就是:根据绑定到匹配元素的给定的事件类型执行所有的处理程序和行为 189 | 190 | trigger除了能够触发浏览器事件,同时还支持自定义事件,并且自定义事件还支持传递参数 191 | 192 | ```javascript 193 | $('#elem').on('LiHy', function(event, arg1, arg2) { 194 | alert("触发自定义事件") 195 | }); 196 | $('#elem').trigger('LiHy', ['参数1', '参数2']) 197 | ``` 198 | 199 | **trigger触发浏览器事件与自定义事件区别?** 200 | 201 | - 自定义事件对象,是jQuery模拟原生实现的 202 | - 自定义事件可以传递参数 203 | 204 | ## 2、triggerHandler事件 205 | 206 | trigger事件还有一个特性:**会在DOM树上冒泡**,所以如果要阻止冒泡就需要在事件处理程序中返回 *false* 或调用事件对象中的 `.stopPropagation()` 方法可以使事件停止冒泡 207 | 208 | trigger事件是具有触发原生与自定义能力的,但是存在一个不可避免的问题**: 事件对象event无法完美的实现**,毕竟一个是浏览器给的,一个是自己模拟的。尽管 `.trigger()` 模拟事件对象,但是它并没有完美的复制自然发生的事件,若要触发通过 jQuery 绑定的事件处理函数,而不触发原生的事件,使用 `.triggerHandler()` 来代替。 209 | 210 | `triggerHandler` 与 `trigger` 的用法是一样的,重点看不同之处: 211 | 212 | - `triggerHandler`不会触发浏览器的默认行为,`.triggerHandler( "submit" )` 将不会调用表单上的 `.submit()` 213 | - `.trigger()` 会影响所有与 jQuery 对象相匹配的元素,而 `.triggerHandler()` 仅影响第一个匹配到的元素 214 | - 使用 `.triggerHandler()` 触发的事件,并不会在 DOM 树中向上冒泡。 如果它们不是由目标元素直接触发的,那么它就不会进行任何处理 215 | - 与普通的方法返回 jQuery 对象(这样就能够使用链式用法)相反,`.triggerHandler()` 返回最后一个处理的事件的返回值。如果没有触发任何事件,会返回 `undefined` 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | -------------------------------------------------------------------------------- /第04章 jQuery 动画.md: -------------------------------------------------------------------------------- 1 | # 第01回:隐藏、显示 2 | 3 | ## 1、`.hide()` 4 | 5 | 隐藏元素,其语法形式为: 6 | 7 | ```javascript 8 | .hide([speed,[easing],[fn]]) 9 | ``` 10 | 11 | > 参数解读: 12 | 13 | - **speed**:三种预定速度之一的字符串( `slow`, `normal`, or `fast`)或表示动画时长的毫秒数值(如:`1000`) 14 | - **easing**:用定切换效果,默认是"`swing`",可用参数"`linear`" 15 | - **fn**:在动画完成时执行的函数,每个元素执行一次。 16 | 17 | > 提示:元素隐藏之后会脱离文档流 18 | 19 | ## 2、`.show()` 20 | 21 | 显示元素,其语法形式为: 22 | 23 | ```javascript 24 | .show([speed,[easing],[fn]]) 25 | ``` 26 | 27 | > 注意: 28 | > 29 | > 1. `.show()` 与 `.hide()` 方法是修改的display属性。 30 | > 2. 如果使用 `!important` 在你的样式中,比如 `display: none !important`,如果你希望 `.show()` 方法正常工作,必须使用 `.css('display', 'block !important')` 重写样式。 31 | > 3. 如果让 show 与 hide 成为一个动画,那么默认执行动画会改变元素的高度,高度,透明度。 32 | 33 | ## 3、`.toggle()` 34 | 35 | show与hide是一对互斥的方法。需要对元素进行显示隐藏的互斥切换,通常情况是需要先判断元素的display状态,然后调用其对应的处理方法。比如显示的元素,那么就要调用hide,反之亦然。 对于这样的操作行为,jQuery提供了一个便捷方法 `.toggle()` 用于切换显示或隐藏匹配元素。 36 | 37 | 语法形式如下: 38 | 39 | ```javascript 40 | .toggle([speed,[easing],[fn]]) 41 | ``` 42 | 43 | # 第02回:上卷、下拉 44 | 45 | ## 1、`.slideDown()` 46 | 47 | 对于隐藏的元素,在将其显示出来的过程中,可以对其进行一些变化的动画效果。之前学过了show方法,show方法在显示的过程中也可以有动画,但是 `.show()` 方法将会匹配元素的宽度,高度,以及不透明度,同时进行动画操作。这里将要学习一个新的显示方法 `.slideDown()` 方法,用滑动动画显示一个匹配元素。 48 | 49 | `.slideDown()` 方法将给匹配元素的高度的动画,这会导致页面的下面部分滑下去,弥补了显示的方式。其语法形式为: 50 | 51 | ```javascript 52 | .slideDown([speed,[easing],[fn]]) 53 | ``` 54 | 55 | > 注意: 56 | > 57 | > 1. 下拉动画是从无到有,所以一开始元素是需要先隐藏起来的,可以设置 `display:none`。 58 | > 2. 如果提供回调函数参数,callback 会在动画完成的时候调用。将不同的动画串联在一起按顺序排列执行是非常有用的。这个回调函数不设置任何参数,但是 this会设成将要执行动画的那个DOM元素,如果多个元素一起做动画效果,那么要非常注意,回调函数会在每一个元素执行完动画后都执行一次,而不是这组 动画整体才执行一次 59 | 60 | ## 2、`.slideUp()` 61 | 62 | 对于显示的元素,在将其隐藏的过程中,可以对其进行一些变化的动画效果。之前学过了hide方法,hide方法在显示的过程中也可以有动画,但 是`.hide()`方法将为匹配元素的宽度,高度,以及不透明度,同时进行动画操作。这里将要学习一个新的显示方法slideUp方法。 63 | 64 | 其语法形式为: 65 | 66 | ```javascript 67 | .slideUp( [speed ] [, easing ] [, complete ] ) 68 | ``` 69 | 70 | 这个使用的含义就是:找到元素的高度,然后采用一个下滑动画让元素一直滑到隐藏,当高度为0的时候,也就是不可见的时,修改元素display 样式属性被设置为none。这样就能确保这个元素不会影响页面布局了。 71 | 72 | ## 3、`.slideToggle()` 73 | 74 | slideDown与slideUp是一对相反的方法。需要对元素进行上下拉卷效果的切换,jQuery提供了一个便捷方法slideToggle用滑动动画显示或隐藏一个匹配元素。其语法形式为: 75 | 76 | ``` 77 | .slideToggle( [speed ] [, easing ] [, complete ] ) 78 | ``` 79 | 80 | > 注意: 81 | > 82 | > 1. display属性值保存在jQuery的数据缓存中,所以display可以方便以后可以恢复到其初始值 83 | > 2. 当一个隐藏动画后,高度值达到0的时候,display 样式属性被设置为none,以确保该元素不再影响页面布局 84 | 85 | # 第03回:淡入、淡出 86 | 87 | 除了通过 `display` 设置元素的显示与隐藏,还有一种方法就是设置元素的不透明度(`opacity`),值范围为` 0~1` ,当不透明度为1时,元素显示,当不透明度为0时,元素隐藏。jQuery淡入淡出效果正是使用了这个原理。只不过,当不透明度为0时,元素虽然隐藏了,但是并没有脱离文档流,但是jQuery中,元素淡出会脱离文档流。 88 | 89 | ## 1、`.fadeIn()` 90 | 91 | ```javascript 92 | .fadeIn( [speed ] [, easing ] [, complete ] ) 93 | ``` 94 | 95 | ## 2、.fadeOut() 96 | 97 | ```javascript 98 | .fadeOut( [speed ] [, easing ] [, complete ] ) 99 | ``` 100 | 101 | ## 3、`.fadeToggle()` 102 | 103 | ```javascript 104 | .fadeToggle( [speed ] [, easing ] [, complete ] ) 105 | ``` 106 | 107 | ## 4、.fadeTo() 108 | 109 | ```javascript 110 | .fadeTo( speed , opacity , [, easing ] [, complete ] ) 111 | ``` 112 | 113 | # 第04回:自定义动画 114 | 115 | ## 1、`.animate()` 116 | 117 | jQuery 提供的动画有限,有时需要我们实现一些更为复杂的动画效果,这时我们就需要使用自定义动画了。当然,jQuery也为我们提供了自定义动画的接口,其语法形式如下: 118 | 119 | ```javascript 120 | .animate( prop ,[ speed ], [ easing ], [ complete ] ) 121 | .animate( prop, options ) 122 | ``` 123 | 124 | **参数解读** 125 | 126 | - `prop`:一个或多个css属性的键值对所构成的Object对象,对 **数字属性值** 有效,驼峰命名,可使用快捷方式如‘show/toggle’。 127 | - `speed`:持续时间,单位ms,提供 'fast' 和 'slow' 字符串,分别表示持续时间为200 和 600毫秒。 128 | - `easing`:动画运动算法,jQuery库中默认调用 swing。如果需要其他的动画算法,请查找相关的插件 129 | - `complete`:回调函数 130 | 131 | ```javascript 132 | $(".box").click(function () { 133 | $(this).animate({ 134 | left: "+=50px" 135 | },1000, function () { 136 | alert("动画执行完毕!"); 137 | }) 138 | }); 139 | ``` 140 | 141 | animate 在执行动画中,如果需要观察动画的一些执行情况,或者在动画进行中的某一时刻进行一些其他处理,我们可以通过animate提供的第二种设置语法,传递一个对象参数,可以拿到动画执行状态一些通知。 142 | 143 | ```javascript 144 | .animate( prop, options ) 145 | ``` 146 | 147 | **options参数:** 148 | 149 | - `duration`:设置动画执行的时间 150 | - `easing` :规定要使用的 easing 函数,过渡使用哪种缓动函数 151 | - `step`:规定每个动画的每一步完成之后要执行的函数 152 | - `progress`:每一次动画调用的时候会执行这个回调,就是一个进度的概念 153 | - `complete`:动画完成回调 154 | - `queue`:布尔值。指示是否在效果队列中放置动画。如果为 false,则动画将立即开始 155 | 156 | ```javascript 157 | $(".box").click(function () { 158 | $(this).animate({ 159 | left: "+=50px" 160 | }, { 161 | duration: 1000, 162 | complete: function () { 163 | alert("动画执行完毕!"); 164 | } 165 | }) 166 | }); 167 | ``` 168 | 169 | > 同步动画: 170 | 171 | 动画同时执行,如下所示: 172 | 173 | ```javascript 174 | $(".box").click(function () { 175 | $(this).animate({ 176 | width: "50px", 177 | height: "50px", 178 | left: "800px", 179 | opacity: ".5", 180 | },1000, function () { 181 | alert("动画执行完毕!"); 182 | }) 183 | }); 184 | ``` 185 | 186 | > 队列动画 187 | 188 | 根据动画添加的先后顺序执行动画。 189 | 190 | 示例1: 191 | 192 | ```javascript 193 | $(".box").click(function () { 194 | $(this).animate({width: "50px", height: "50px"}, function () { 195 | $(this).animate({left: "800px"}, function () { 196 | $(this).animate({opacity: ".5"}, function () { 197 | alert("动画执行完毕!"); 198 | }) 199 | }) 200 | }); 201 | }); 202 | ``` 203 | 204 | 示例2: 205 | 206 | ```javascript 207 | $(".box").click(function () { 208 | $(this) 209 | .animate({width : "50px"}, 1000) 210 | .animate({height : "50px"}, 1000) 211 | .animate({opacity: ".5"}, 1000); 212 | }); 213 | ``` 214 | 215 | ## 2、.queue() 216 | 217 | animate 只对数字值的变化有效,如果想要将其他变化(比如颜色变化)加入到动画队列中,可使用 `.queue()` 方法,不过你需要指定 `next` 函数参数并调用,当其他变化执行之后手动执行后续动画队列。 218 | 219 | ```javascript 220 | 221 | $(".box").click(function () { 222 | $(this) 223 | .animate({width : "100px"}, 1000) 224 | .animate({height : "100px"}, 1000) 225 | .animate({opacity: ".5"}, 500) 226 | .queue(function (next) { 227 | // next -> 函数 228 | $(this).css({ 229 | background: "blue" 230 | }); 231 | next(); 232 | }) 233 | .slideUp(1000); 234 | }); 235 | ``` 236 | 237 | ## 3、`.dequeue()` 238 | 239 | `.queue()` 是 jQuery 1.4版本以后才出现的,而之前我们普遍使用的是 `.dequeue()` 方法。意思为执行下一个元素列队中的函数。 现在对上述代码进行修改,如下所示: 240 | 241 | ```javascript 242 | $(".box").click(function () { 243 | $(this) 244 | .animate({width : "100px"}, 1000) 245 | .animate({height : "100px"}, 1000) 246 | .animate({opacity: ".5"}, 500) 247 | .queue(function () { 248 | // next -> 函数 249 | $(this).css({ 250 | background: "blue" 251 | }); 252 | $(this).dequeue(); 253 | }) 254 | .slideUp(1000); 255 | }); 256 | ``` 257 | 258 | ## 4、.clearQueue() 259 | 260 | jQuery 还提供了一个清理列队的功能方法:`.clearQueue()`。 261 | 262 | 假如我想在执行完第二个动画就不再执行了。那么只要在第二个动画的回调函数那里添加一句 `$(this).clearQueue()` 就可以停止后面的列队动画了。 263 | 264 | ```javascript 265 | $(".box").click(function () { 266 | $(this) 267 | .animate({width : "100px"}, 1000) 268 | .animate({height : "100px"}, 1000) 269 | .animate({opacity: ".5"}, 500, function(){$(this).clearQueue();/* 清理队列*/}) 270 | .queue(function () { 271 | // next -> 函数 272 | $(this).css({ 273 | background: "blue" 274 | }); 275 | $(this).dequeue(); 276 | }) 277 | .slideUp(1000); 278 | }); 279 | ``` 280 | 281 | 获取队列长度: 282 | 283 | ```javascript 284 | function getQueueCount() { 285 | //获取当前列队的长度,fx 是默认列队的参数 286 | return $(".box").queue("fx").length; 287 | } 288 | ``` 289 | 290 | ## 5、.stop() 291 | 292 | 动画在执行过程中是允许被暂停的,当一个元素调用 `.stop()` 方法,当前正在运行的动画(如果有的话)立即停止。 293 | 294 | 语法形式: 295 | 296 | ``` 297 | .stop( [clearQueue ], [ jumpToEnd ] ) 298 | ``` 299 | 300 | 该方法的可选参数,简单来说可以有3种情况: 301 | 302 | - `.stop()`: 停止当前动画,迅速执行后续动画效果。 303 | - `.stop(true)`:停止当前动画,清除后续动画队列。 304 | - `.stop(true,true)`:当前动画将停止,但该元素上的 CSS 属性会被立刻修改成动画的目标值 305 | 306 | 简单的说:参考下面代码、 307 | 308 | ```javascript 309 | $("#box").animate({ 310 | height: 300 311 | }, 5000) 312 | $("#box").animate({ 313 | width: 300 314 | }, 3000) 315 | $("#box").animate({ 316 | opacity: 0.6 317 | }, 2000) 318 | ``` 319 | 320 | 1. `stop()`:只会停止第一个动画,第二个第三个继续 321 | 2. `stop(true)`:停止第一个、第二个和第三个动画 322 | 3. `stop(true,ture)`:停止动画,直接跳到第一个动画的最终状态 323 | 324 | ## 6、.delay() 325 | 326 | 设置一个延时来推迟执行队列中之后的项目。 327 | 328 | 用于将队列中的函数延时执行。他既可以推迟动画队列的执行,也可以用于自定义队列。 329 | 330 | 语法形式: 331 | 332 | ``` 333 | .delay(duration, [queueName]); 334 | ``` 335 | 336 | > 参数解读: 337 | 338 | - `duration`:延时时间,单位:毫秒 339 | 340 | - `queueName`:队列名词,默认是Fx,动画队列。 341 | 342 | > 代码示例: 343 | 344 | ```javascript 345 | $('#foo').slideUp(300).delay(800).fadeIn(400); 346 | ``` 347 | 348 | ## 7、`.finish()` 349 | 350 | 停止当前正在运行的动画,删除所有排队的动画,并完成匹配元素所有的动画。 351 | 352 | 当 `.finish()` 在一个元素上被调用,立即停止当前正在运行的动画和所有排队的动画(如果有的话),并且他们的CSS属性设置为它们的目标值(所有动画的目标值)。所有排队的动画将被删除。 353 | 354 | 如果第一个参数提供,该字符串表示的队列中的动画将被停止。 355 | 356 | `.finish()` 方法和 `.stop(true, true)` 很相似,`.stop(true, true)` 将清除队列,并且目前的动画跳转到其最终值。但是,不同的是,`.finish()` 会导致所有排队的动画的CSS属性跳转到他们的最终值。 357 | 358 | ## 8、jQuery.fx.off 359 | 360 | 关闭页面上所有的动画。 361 | 362 | 把这个属性设置为 `true` 可以立即关闭所有动画(所有效果会立即执行完毕)。有些情况下可能需要这样,比如: 363 | 364 | \* 你在配置比较低的电脑上使用jQuery。 365 | 366 | \* 你的一些用户由于动画效果而遇到了 [可访问性问题](http://www.jdeegan.phlegethon.org/turn_off_animation.html) 367 | 368 | 当把这个属性设成 `false` 之后,可以重新开启所有动画。 369 | 370 | ## 9、`jQuery.fx.interval` 371 | 372 | 设置jQuery动画每隔多少毫秒绘制一帧图像 (默认为13 毫秒) 数字越小越流畅,但可能影响浏览器性能。 373 | -------------------------------------------------------------------------------- /第05章 jQuery 工具函数.md: -------------------------------------------------------------------------------- 1 | # 数组和对象操作 2 | 3 | ## 1. `$.each()` 4 | 5 | 通用遍历方法,可用于遍历对象和数组。 6 | 7 | 不同于遍历 jQuery 对象的 `$().each()` 方法,此方法可用于遍历任何对象。回调函数拥有两个参数:第一个为对象的成员或数组的索引,第二个为对应变量或内容。如果需要退出 each 循环可使回调函数返回 false,其它返回值将被忽略。 8 | 9 | ```js 10 | // 1.遍历数组 11 | $.each(['A', 'B', 'C'], function (index, val) { 12 | console.log(`下标:${index},值:${val}`); 13 | }); 14 | /* 15 | 下标:0,值:A 16 | 下标:1,值:B 17 | 下标:2,值:C*/ 18 | 19 | // 2.遍历对象 20 | $.each({name:'Henry', age: 28}, function (key, val) { 21 | console.log(`键:${key},值:${val}`); 22 | }); 23 | /* 24 | 键:name,值:Henry 25 | 键:age, 值:28*/ 26 | ``` 27 | 28 | ## 2. `$.extend()` 29 | 30 | 用一个或多个其他对象来扩展一个对象,返回被扩展的对象。 31 | 32 | ```js 33 | function tool(options) { 34 | // 默认配置 35 | let configs = { 36 | duration: 1000, 37 | interval: 15 38 | }; 39 | // 修改默认配置 40 | $.extend(configs, options); 41 | console.log(configs); // {duration: 2000, interval: 15, color: "green"} 42 | } 43 | tool({ 44 | duration: 2000, 45 | color: 'green' 46 | }); 47 | ``` 48 | 49 | ## 3. `$.grep()` 50 | 51 | 过滤数组元素 52 | 53 | ```js 54 | resArr = $.grep([1, 2, 3, 4], (num, index) => { 55 | return num % 2 == 0; 56 | }); 57 | console.log(resArr); // [2, 4] 58 | ``` 59 | 60 | 61 | 62 | --------------------------------------------------------------------------------