本篇介绍jQuery。
jquery的优势
- js代码对浏览器的兼容性做的更好了
- 隐式循环
- 链式操作
jQuery理念“Write Less, Do More”
jquery是什么
高度封装了js代码的模块
封装了dom节点
还封装了很多操作dom节点的简便方法。
找节点的过程也是对象实例化的过程。这是优势但同时也带来了效率问题。
jQuery的导入
1 | https://code.jquery.com/jquery-3.4.1.js 未压缩版 |
1 | <script src="jquery3.4.1.js"></script> |
1 | 验证: |
jQuery对象
1 | >>>jQuery('#box') |
$ 就是 jQuery 的别名
jQuery是一个构造函数,我们通过$()返回的是一个伪数组,它是jQuery的一个实例
jQuery对象和dom对象的关系和转换
1 | jQuery封装了dom |
jQuery的选择器(方式一)
基础选择器
id选择器#
、类选择器 .
、标签选择器*
、通用选择器 *
、 交集选择器 标签名.类名/#id
、并集选择器 ,
1 | #id选择器 .类选择器 标签选择器 *通用选择器 |
层级选择器
后代选择器 空格
、 子代选择器 >
、 毗邻选择器 +
(必须得挨着?) 、弟弟选择器 ~
(弟弟要浪)
1 | 空格 后代选择器 >子代选择器 +毗邻选择器 ~弟弟选择器 |
属性选择器
[属性名]
标签名[属性名=字符串]
标签名[属性名=正则匹配]
1 | $('[属性名]') 必须是含有某属性的标签 |
jQuery的筛选器
筛选器是在实例化中进行筛选
基础筛选器
1 | $('选择器:筛选器') |
表单筛选器
type筛选器
根据input标签的type类型进行筛选
1 | $(':text') |
状态筛选器
1 | $(':enabled') |
jQuery的筛选器方法(方式二)
通过已知的某个节点(jQuery对象)去找 兄弟、祖宗、儿子。
找兄弟:
- 找所有兄弟 sibllings
- 找哥哥 prev() prevAll() prevUntil(‘选择器’)
- 找弟弟 next() nextAll() nextUntil(‘选择器’)
找祖宗:
- 找父亲 parent() parents()
- 刨祖坟 parentsUntil(‘body’)
找儿子:
- 找儿子 children()
筛选方法:
1 | $(selector).first() // 选第一个 |
事件
事件的绑定
1 | <body> |
jQuery操作标签
- 操作文本 : <>文本内容<>
- 操作标签 : 添加 删除 修改 克隆
- 操作属性 : 通用属性 类 css样式 value 盒子模型 滚动条
操作文本
text
与html
都可以获得值设置值- text 像 innerText html 像 innerHTML
- html 还可以识别标签、dom对象、jq对象
1 | text() |
操作标签
增加
父子关系
- 追加儿子:
(父亲).append(儿子)
(儿子).appendTo(父亲)
- 头部添加:
(父亲).prepend(儿子)
(儿子).prependTo(父亲)
兄弟关系
- 添加哥哥(before):
参考点.before(要插入的)
要插入的.insertBefore(参考点)
- 添加弟弟(after) :
参考点.after (要插入的)
要插入的.insertAfter(参考点)
注意:方法前面的必须是jq对象
坑:如果被添加的标签原本就在文档树中,就相当于移动
例子:
1 | 追加儿子 |
删除
jq对象.remove()
、jq对象.detach()
、jq对象.empty()
remove
: 删除标签和事件,返回一个不包含事件的标签detach
:删除标签和事件,返回一个包含事件的标签empty
:清空内容,自己被保留
修改
replaceWith
、replaceAll
replaceWith
:a.replaceWith(b)
用b替换areplaceAll
:a.replaceAll(b)
用a替换b
克隆
默认参数为false表示不能克隆事件:
jq对象.clone()
参数改为true表示克隆事件:
jq对象.clone(true)
1 | 复制 : clone |
操作属性
通用属性
attr()
- 获取属性的值 一个参数
- 设置属性的值 两个参数
- 设置多个属性的值 字典
1 | 获取属性的值 |
removeattr('属性名')
- 删除属性
1 | $('a').removeAttr('title') //删除title属性 |
prop
- 如果一个标签只有true和false两种情况,适合用prop处理,selected,checked)
- 如果获取的结果是true表示选中,false表示取消选中
1 | $(':checkbox:checked').prop('checked') //获取值 |
类的操作
- 添加类 addClass
多个参数,添加多个类
1 | $('div').addClass('red') //添加一个类 |
- 删除类 removeClass
多个参数,删除多个类
1 | $('div').removeClass('bigger') //删除一个类 |
- 转换类 toggleClass
多个参数,添加多个类
1 | $('div').toggleClass('red') //有即删 无即加 |
value值的操作
jq对象.val()
特殊:对于select checkbox这些 需要使用 [index] 的方式来设置选中, 而不是 index本身
1 | $(input).val() // 查看值 |
css样式
jq对象.css()
单个:jq对象.css('样式名称','值')
多个:jq对象.css({'样式名1':'值1','样式名2':'值2'})
1 | $('div').css('background-color','red') //设置一个样式 |
杂项
滚动条
jq对象.scrollTop()
jq对象.scrollLeft()
1 | $(window).scrollLeft() |
盒子模型
内容的宽高
width
height
内容 + padding
innerWidth
innerHeight
内容 + padding + border
outerWidth
outerHeight
内容 + padding + border + margin
outerHeight(true) 默认为flase不计算margin
outerWidth(true)
当你用这些方法修改值得时候,永远是content被修改
表单操作
当我们点击button按钮时,返回true就会跳转,返回false就不跳转
1 | $(':submit').click( |
jQuery效果
隐藏/显示
隐藏,显示,切换,滑动,淡入淡出和动画。
hide()
和 show()
语法:
1 | $(selector).hide(speed,callback); |
可选的speed参数指定隐藏/显示的速度,可以采用:“slow”,“fast”或毫秒。
可选的回调参数是在hide()或show()方法完成后执行的函数。
1 |
|
toggle()
有则删除,无则添加
语法:
$(selector).toggle(speed,callback);
- 可选的speed参数可以采用:“normal”,“slow”,“fast”或毫秒。
- 可选的回调参数是在toggle()完成后执行的函数。
1 | // 将上面的 $('p').hide(2000) 替换为下面 |
淡入淡出 fade系列
- fadeIn()
- fadeOut()
- fadeToggle()
- fadeTo()
fadeIn()
与 fadeOut()
语法:
$(selector).fadeIn(speed,easing,callback)
该方法方法逐渐改变被选元素的不透明度,从隐藏到可见(褪色效果)。
note:隐藏的元素不会被完全显示(不再影响页面的布局)。
$(selector).fadeOut(speed,easing,callback)
该方法方法逐渐改变被选元素的不透明度,从可见到隐藏。
speed 参数:(可选,规定褪色效果的速度)
- 毫秒
- ‘fast’
- ‘slow’
easing 参数: (可选,规定在动画的不同点上元素的速度。默认值为 “swing”)
- “swing” - 在开头/结尾移动慢,在中间移动快
- “linear” - 匀速移动
callback 参数: (可选。fadeIn() 方法执行完之后,要执行的函数。)
1 |
|
fadeToggle()
语法:
$(selector).fadeToggle(speed,callback)
jQuery fadeToggle() 方法可以在 fadeIn() 与 fadeOut() 方法之间进行切换。
如果元素已淡出,则 fadeToggle() 会向元素添加淡入效果。
如果元素已淡入,则 fadeToggle() 会向元素添加淡出效果。
1 | 将上面两句代码 |
fadeTo()
语法:
$(selector).fadeTo(speed,opacity,callback);
该方法允许渐变为给定的不透明度(值介于 0 与 1 之间)。
1 |
|
滑动 slide系列
- slideDown()
- slideUp()
- slideToggle()
slideUp() 与 slideDown()
语法:
$(selector).slideUp(speed,callback);
向上滑动元素(设置display为none)
$(selector).slideDown(speed,callback);
用于向下滑动元素。(设置display为block)
1 |
|
注意:让它滑动出现先的前提是 display: none;
slideToggle()
语法:
$(selector).slideToggle(speed,callback);
在 slideDown() 与 slideUp() 方法之间进行切换。
1 | $('#flip').click(function () { |
动画
animate()
语法
$(selector).animate({params},speed,callback);
必选的params参数定义要设置动画的CSS属性。
可选的speed参数指定效果的持续时间。 它可以采用以下值:”slow”, “fast”或者毫秒。
可选的回调参数是动画完成后要执行的函数。
note:默认情况下,所有HTML元素都具有静态位置,并且无法移动。要操纵位置,请记住首先将元素的CSS position属性设置为relative,fixed或absolute!
操作多个属性 + 使用相对值
1 |
|
可以用 animate() 方法来操作所有 CSS 属性吗?
是的,几乎可以!不过,需要记住一件重要的事情:当使用 animate() 时,必须使用 Camel 标记法书写所有的属性名,比如,必须使用 paddingLeft 而不是 padding-left,使用 marginRight 而不是 margin-right,等等。
同时,色彩动画并不包含在核心 jQuery 库中。需要从 jquery.com 下载 颜色动画 插件。
使用预定义的值
1 |
|
使用队列功能
对于函数体内多个animate() ,jQuery 会创建包含这些方法调用的”内部”队列。然后逐一运行这些 animate 调用。
1 |
|
jquery中有一个Queue队列的接口,这个模块没有单独拿出来是因为这个是内部专门为动画服务的,Queue队列如同data数据缓存与Deferred异步模型一样,都是jQuery库的内部实现的基础设施(底层方法)。
我们一直习惯于线性的编写代码逻辑,但是在JavaScript编程几乎总是伴随着异步操作:
setTImeout
,css3Transition
/Animation
,ajax
,dom的绘制,postmessage
,web Database
等等,大量异步操作所带来的回调函数会把我们的算法分解,对于“异步+回调”的模式,怎么“拉平”异步操作使之跟同步一样,因为异步操作进行流程控制的时候无非避免的要嵌套大量的回调逻辑,所以就会出现 promises 约定了。
那么 jQuery 引入队列其实从一个角度上可以认为:允许一系列函数被异步地调用而不会阻塞程序。
前面提到jQuery的优势有一条为链式,举个例子:
1 | $("div").slideUp().fadeIn() |
这是 jQuery 的一组动画链式序列,它的内部其实就是一组队列 Queue,所以队列和 Deferred 地位类似,是一个内部使用的基础设施。
- 当 slideUp 运行时,fadeIn 被放到 fx 队列中(这个队列存在进程锁)
- 当 slideUp 完成后,从队列中被取出运行( 使用dequeue 方法 )
小结
为什么这里突然提到了异步,提到了队列,从开始的目标开始分析,对于 jQuery 的动画的设计我们要分 2 个层面理解:
- 每一个动画效果可以看作一个独立的动画对象,每个对象都实现了针对自己这个动画的生命周期的控制。
- 动画对象与动画对象之间其实是没有直接关系,但是为了做到连续调用就需要引入一套队列机制也就是 Queue 来控制对象之间的转换的控制。
- 动画调度的流程:利用队列异步的空闲然后执行同步的代码。
停止动画
stop()
语法:
$(selector).stop(stopAll,goToEnd);
stop() 方法适用于所有 jQuery 效果函数,包括滑动、淡入淡出和自定义动画。
- stopAll 参数规定是否应该清除动画队列。默认是 false,即仅停止活动的动画,允许任何排入队列的动画向后执行。
- goToEnd 参数规定是否立即完成当前动画。默认是 false。
- 对于每个动画的开始,我们应首先停止以前的动画,在开始当前的动画。
1 |
|
回调 Callback
前面提到的很多方法中,很多可以包含着回调函数。
1 |
|
链式操作 Chaining
Chaining 允许我们在一条语句中运行多个 jQuery 方法(在相同的元素上)。
只需要把把该动作追加到之前的动作上就可以了。
1 |
|
事件
jQuery事件发展历程
简单事件绑定>>bind事件绑定>>delegate事件绑定>>on事件绑定(推荐)
简单事件绑定
1 | click(handler) 单击事件 |
- 缺点:不能同时注册多个事件
bind事件绑定
1 | //第一个参数:事件类型 |
- 缺点:不支持动态事件绑定
delegate委托事件绑定
1 | // 第一个参数:要绑定事件的元素 |
on注册事件(主要)
jQuery1.7之后,jQuery用on统一了所有事件的处理方法。
最现代的方式,兼容zepto(移动端类似jQuery的一个库),强烈建议使用。
on注册简单事件
1 | // 表示给$(selector)绑定事件,并且由自己触发,不支持动态绑定。 |
on注册委托事件
1 | // 表示给$(selector)绑定代理事件,当必须是它的内部元素span才能触发这个事件,支持动态绑定 |
on注册事件的完整语法:
1 | // 第一个参数:events,绑定事件的名称可以是由空格分隔的多个事件(标准事件或者自定义事件) |
解除绑定
unbind方式(不用)
1 | $(selector).unbind(); //解绑所有的事件 |
undelegate方式(不用)
1 | $( selector ).undelegate(); //解绑所有的delegate事件 |
off方式(推荐)
1 | 与on搭配的off |
触发事件
1 | $(selector).click(); //触发 click事件 |
jQuery事件对象
jQuery事件对象其实就是js事件对象的一个封装,处理了兼容性。
1 | //各种事件 |
事件冒泡
当点击子元素的时候,子元素和父元素都触发点击事件
1 | <style> |
事件委托
1 | $('div').on('click','button',{'a':'b'},function (event) { |
jQuery中 onclick
与 click
click
和onclick
的区别:
- onclick是绑定事件,告诉浏览器在鼠标点击时候要做什么;click本身是方法作用是触发onclick事件,只要执行了元素的click()方法,就会触发onclick事件。
- click()方法的主要作用是触发调用click方法元素onclick事件,实际上是模拟了鼠标的点击动作。此外,如果在click括号内定义了其他可执行语句,则click方法会在执行完onclick事件之后执行括号内部的语句。
- 在js中我们在
onclick
绑定事件中定义所做的事情; 在jq中我们在click
方法中定义触发该事件后所作的事情。
页面的加载
1 | document.onload = function(){ |
each
由于jQuery隐式循环,所以实际中还是很少使用的。
1 | <body> |
练习
选择框插件
做一个选择框的插件
可以全选,可以反选,可以取消选择
1 |
|
遇到的问题
- 全选时,不知道该怎样去选中
- 方法一:在checkbox中设置value,然后 使用 val方法,参数为列表,列表中为选择的value值。
- 方法二:遍历,然后利用prop方法,设置 checked属性 为 true
- 不知道如何获取勾选的checkbox, 遍历checkbox,利用prop挨个检查 checked 属性。
小结
prop对于checkbox, radio 这类是一个神器。
tab栏选项卡
- 将列表横向
- 清除浮动
- 设置动作
1 |
|
form表单验证
- 用户输入用户名和密码,需要对用户名,密码的内容以及长度进行检查,如果检查通过则可以跳转。
- 用到的方法:hide,show,RegExp.test
1 |
|
计时器
该计时器包含 时,分,秒,毫秒
在对div进行文本操作时 要用 text 先开始用的 innerText,记混了。
1 |
|
模态框
- 除了点击按钮可以退出
- 按 ESC也可以退出
1 |
|
遇到的问题
- 父元素设置透明度,子元素会继承透明度,我的解决办法是将父子关系变成兄弟关系。
- 这时由于设置为兄弟,不再直接用body了,那我的高就变小了。希望和body是一样的,可以在body中设置高度100% ,然后再子元素里设置高度 100% 。
表单操作
- 使用时间委托——每一行有一个button,点击删除整行。
方法一:利用克隆
1 |
|
方法二:事件委托
1 |