jQuery本质和隐式迭代
本质
- Jquery对象本质“可以看成”是一个包含一个dom数组和所有Jquery方法的容器(方法在所有jq对象共享的jq原型属性prototype中,jq对象本质是一个“类数组”)
- 每当我们调用选择器方法查找dom树里的元素时,其实就是把找到的dom元素存入一个JQ对象里的dom数组中,然后再把这个JQ对象返回
隐式迭代
- 当我们调用Jquery方法时(如 html()),jq方法会遍历内部dom数组,并调用每个dom元素的对应的dom属性或方法(如innerHTML),完成操作
|
|
jQuery选择器、DOM操作、样式、事件、动画
库和框架的区别
库
- 更像是工具,把原生代码功能封装成很多便捷的api,要用的时候再去调用封装的api,需要用到的时候查看文档
框架
- 更像是一种解决方案,有其自定义的语法,然后用这些语法去填充模板,实现效果。需要用到就了解文档,了解在这个框架下解决问题的模式
jQuery的作用
- jQuery是一个轻量级的”写得少,做得多(Write less, do more)”的JavaScript库
jQuery库包含以下功能
- 选择网页元素
- 改变结果集
- 元素的操作:取值和赋值
- 元素的操作:移动
- 元素的操作:复制、删除和创建
- 工具方法
- 事件操作
- 特殊效果
- AJAX
jquery对象和原生DOM对象的转化
- DOM原生对象:通过原生JS获取的对象,使用原生JS的属性和方法
- jQuery对象:通过jQuery获取的对象,是一个类数组对象,只能使用jQuery自己封装属性和方法
|
|
jQuery对象转换为DOM原生对象
- jQuery对象[0]—>DOM原生对象
|
|
DOM原生对象转换为jQuery对象
- $(DOM原生对象)—>jQuery对象
|
|
jQuery绑定事件
- jQuery中可以使用bind()/delegate()/live()/on()绑定事件,unbind()和off()对应bind()和on()解除绑定
- 推荐使用on()事件绑定,off()事件解除绑定,on()提供了绑定事件处理的所有功能,方便快捷
on()绑定事件
|
|
- 上面点击会生成多个’我是li4’,但是无法在生成出来的’我是li4’添加事件,所以点击’我是li4’文本,console.log无反应.要解决这个问题可以用事件代理来解决
on()事件代理
- 用父级元素来代理监听子集事件的一种方式
|
|
off()解除绑定事件
通过传入的第三个参数,仅移除先前绑定的事件处理函数
|
|
通过指定名字空间,解除绑定表单上所有的事件
|
|
- 下面来个综合常用的解除绑定事件的例子
|
|
事件绑定的一些常用操作
向事件处理函数中传入数据,并且在事件处理函数中通过名字来获取传入的数据
|
|
通过使用 .preventDefault(),仅取消默认的动作
|
|
通过使用 .stopPropagation(),防止提交事件的冒泡行为,但是并不禁止提交行为
|
|
其它绑定事件
bind()
- 给元素绑定一个或多个事件,元素必须存在
|
|
unbind()
- 给元素解绑事件
|
|
delegate()
- 用于事件代理,为指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序,并规定当这些事件发生时运行的函数
|
|
等同于下面on()的写法
|
|
undelegate()
- 给元素解绑代理事件
|
|
live()
- 这种方法是将页面的document元素作为事件代理元素,太消耗资源,已经过时
- 推荐使用on方法,因为既能普通绑定事件,也能事件代理绑定
jQuery展示/隐藏元素
改变元素的CSS中的display属性
|
|
用jQuery的show()、hide()方法
|
|
用jQuery的fadeIn()、fadeOut()方法
|
|
jQuery动画
自定义动画
- jquery使用animate()生成各种动画效果
animate参数说明
- $(selector).animate(styles,speed,easing,callback);
- styles: 必需,规定产生动画效果的CSS
- speed: 可选,规定动画的速度,默认是normal,可能的值:数字(毫秒)、slow、normalfast
- easing: 可选,规定在不同的动画点中设置动画速度的 easing 函数。内置的 easing 函数: swing linear
- callback: 可选,animate 函数执行完之后,要执行的函数。
|
|
停止动画stop()
- $(selector).stop(stopAll,goToEnd)
- 可选的 stopAll 参数规定是否应该清除动画队列。默认是 false
- 可选的 goToEnd 参数规定是否立即完成当前动画。默认是 false。
|
|
动画效果的链式操作
- 可以将animate()的队列功能使用链式方法呈现,因为每次使用animate()方法后返回的还是这个被查询的节点
|
|
jQuery设置和获取元素内部HTML内容、text文本
获取内容、text文本
- $(“.box”).html();获取元素内部的html内容,类似于innerHTML
- $(“.box”).text();获取元素内部的text文本,类似于innerText
|
|
设置内容、text文本
- $(“.box”).html(“p设置了一个段落/p”);设置了元素内部的html内容,标签生效
- $(“.box”).text(“设置了一个文本”);设置了元素内部的text文本,标签不生效
|
|
jQuery属性操作
表单内容value值
- $(“input”).val();获得表单的value内容
- $(“inout”).val(“改变后的表单”);设置表单
|
|
元素的属性
- $(“input”).attr(“type”);获取元素的 type 属性的值
- $(“input”).attr(“type”, “password”);设置元素的type属性值为password
|
|
val()和attr(“value”)的区别
- .val() 能够取到 针对text,hidden可输入的文本框的value值
- .attr(‘value’) 可以取到html元素中所设置的属性 value的值,不能获取动态的如input type=”text” 的文本框手动输入的值
code:jquery实现二级菜单效果
explain
|
|
code:商品tab切换、添加更多效果
explain
|
|
jQuery常用方法
$(document).ready()
- DOM加载完毕后,指定一个函数来执行
|
|
区别window.onload
- window.onload只能编写一个,即使编写多个也只执行一个,而$(document).ready()则可编写多个并且都可得到执行
- window.onload需要等到页面所有的元素(含图片的加载)加载完成后才执行,而$(document).ready()
只需等到DOM准备就绪时就执行(不必等待所有元素加载完后再执行) - window.onload是原生js中的,而 $(document).ready()需在调用jquery库后才能使用
- window.onload不可简写,而$(document).ready()可简写成
$node.html()、$node.text()
- $node.html()是获取集合中第一个匹配元素的html内容;当()里面含有参数时则表示设置每个匹配元素的html内容
- text()方法返回一个字符串,包含所有匹配元素的合并文本;当()里含有参数时,表示设置每个匹配元素的文本内容为指定文本内容
|
|
extend()
- 将两个或更多对象的内容合并到第一个对象
- $.extend( object1, object2)
- 默认情况下是浅拷贝,想要深拷贝,就传入true参数,$.extend( true, object1, object2)
|
|
|
|
- 浅拷贝,对象的相同属性的值会被替换,不相同的属性保留第一个;如果属性的值是对象,完全替换第二个的属性的值
- 深拷贝,对象的相同属性的值会被替换,不相同的属性保留第一个;如果属性的值是对象,相同属性的值会被替换,不相同的属性保留第一个
链式调用
- 使用jQuery方法时,对象方法返回的是对象本身,可以调用对此对象的其他jQuery方法,实现连续调用多个方法
|
|
链式调用的实现原理
- $(“选择器”).方法1(回调函数1).方法2(回调函数2).方法N(回调函数N);
- 通过对象的方法最后将对象再返回回来(return this)继续被其他方法调用
|
|
each()
- 遍历一个jQuery对象,为每个匹配元素执行一个函数
|
|
隐式迭代
- jQuery的方法,返回一个jQuery对象遍历jQuery集合中的元素,被称为隐式迭代的过程。当这种情况发生时,它通常不需要显式地循环的.each()方法
|
|
data()
- data()实际上是对js对象或DOM对象的额外属性做一个集中管理,来避免内存泄漏
|
|
jQuery常用DOM操作
给元素增加/删除class类
- addClass(“active”):给元素 $node 添加 class active
- $node.removeClass(“active”):给元素 $noed 删除 class active
|
|
|
|
展示元素/隐藏元素(上面有例子)
- show():显示元素
- hide():隐藏元素
- css(“display”, “block”):给元素css属性设置display为block
- css(“display”, “none”):给元素css属性设置display为none
- fadeIn():通过淡入的方式显示匹配元素
- fadeOut():通过淡出的方式隐藏匹配元素
获取/设置元素属性(上面有例子)
- attr(“id”):获取元素的id属性的值
- attr(“src”):获取元素的src属性的值
- attr(“title”):获取元素的title属性的值
- attr(“id”, “new-id”):设置元素的id属性值为new-id
- attr(“src”, “new-src”):设置元素的src属性值为new-src
- attr(“title”, “new-title”):设置元素的title属性值为new-title
给元素添加自定义属性
- attr(“data-src”, “new-data”):设置元素的自定义data-src属性值为new-data
在父元素内部最开头添加元素
- $ct.prepend($node):将参数内容插入到每个匹配元素的前面(元素内部)
- $node.prependTo($ct):将所有元素插入到目标前面(元素内)
|
|
在父元素内部最末尾添加元素
- $ct.append($node):将参数内容插入到每个匹配元素的后面(元素内部)
- $node.prependTo($ct):将匹配的元素插入到目标元素的最后面(元素内部)
|
|
删除元素
- remove():将匹配元素集合从DOM中删除(同时移除元素上的事件及 jQuery 数据)
- detach():从DOM中去掉所有匹配的元素(保存所有jQuery数据和被移走的元素相关联)
|
|
|
|
删除元素子节点
- empty():从DOM中移除集合中匹配元素的所有子节点
|
|
父元素里设置html(上面有例子)
- html():获取集合中第一个匹配元素的HTML内容或设置每一个匹配元素的html内容
获取、设置元素的宽度、高度
- width():获取元素content的宽
- width(200):设置元素content的宽
- height():获取元素content的高
- height(200):设置元素content的高
- innerWidth():获取元素content+padding的宽
- innerWidth(200):设置元素content+padding的宽
- innerHeight():获取元素content+padding的高
- innerHeight(200):设置元素content+padding的高
- outerWidth():获取元素content+padding+border的宽
- outerWidth(200):设置元素content+padding+border的宽
- outerHeight():获取元素content+padding+border的高
- outerHeight(200):设置元素content+padding+border的高
- outerWidth(true):获取元素content+padding+border+margin的宽(不能设置)
- outerHeight(true):获取元素content+padding+border+margin的高(不能设置)
获取/设置窗口滚动条垂直滚动距离
- $(window).scrollTop()或者$(document).scrollTop():获取匹配的元素集合中第一个元素的当前垂直滚动条的位置
- $(window).scrollTop(200)或者$(document).scrollTop(200):设置每个匹配元素的垂直滚动条位置
|
|
|
|
获取/设置元素到根节点水平、垂直偏移距离
- offset():获取到根节点水平、垂直偏移距离
- offset({left: 500, top: 300}):设置到根节点水平、垂直偏移距离
|
|
|
|
元素样式
- css(‘background-color’):获取元素样式
- css(‘backgroundColor’,’red’):设置元素样式
- css({color: “red”,fontSize: “14px”}):设置多个元素样式
|
|
|
|
|
|
遍历节点(上面有例子)
- each():遍历一个jQuery对象,为每个匹配元素执行一个函数
|
|
从父元素查找子元素
- children(‘.item’):获得匹配元素集合中每个元素的子元素,选择器选择性筛选
|
|
查找元素的父元素
- parent():取得匹配元素集合中,每个元素的父元素,可以提供一个可选的选择器
|
|
获取元素的数量
- length:在jQuery对象中元素的数量
|
|
获取元素的索引值
- index():从匹配的元素中搜索给定元素的索引值,从0开始计数
|
|
code:用jQuery实现以下操作
- 当点击$btn 时,让 $btn 的背景色变为红色再变为蓝色
- 当窗口滚动时,获取垂直滚动距离
- 当鼠标放置到$div 上,把$div 背景色改为红色,移出鼠标背景色变为白色
- 当鼠标激活 input 输入框时让输入框边框变为蓝色,当输入框内容改变时把输入框里的文字小写变为大写,当输入框失去焦点时去掉边框蓝色,控制台展示输入框里的文字
- 当选择 select 后,获取用户选择的内容
explain
|
|
code:jQuery ajax实现加载更多
explain
前端代码
|
|
后端代码
|
|
常见组件
懒加载
图片懒加载的原理
- 图片地址先放在自定义的属性data-src中,这样图片不会加载
- 判断,当图片位置出现在窗口可视范围时候,获取data-src中的地址,写入src属性中生效加载
code:如何判断一个元素是否出现在窗口可视范围(浏览器的上边缘和下边缘之间,肉眼可视)。写一个函数 isVisible实现
explain
|
|
code:当窗口滚动时,判断一个元素是不是出现在窗口可视范围。每次出现都在控制台打印 true 。用代码实现
explain
|
|
code:当窗口滚动时,判断一个元素是不是出现在窗口可视范围。在元素第一次出现时在控制台打印 true,以后再次出现不做任何处理。用代码实现
|
|
轮播
实现原理
- 轮播是把图片浮动水平排列
- 然后设置一个视窗,大小等于一张图片
- 视窗的overflow设置为hideen,溢出部分不可见
- 点击下一页,所有图片就水平移动一个宽度
抽象出的函数组件
- playNext():下一页
- playPre():上一页
- setBullet():设置底部的小方块