简介
虽然jQuery在近几年已经不再那么火热,伴随着新兴框架VUE/React等框架的崛起,jQuery的作用正在被弱化,传统的jQuery已经被新兴的框架化工程化所代替。但jQuery中的一些优秀的思想、特质,还是非常值得我们学习的。本文主要讲述这些优秀的思想。
jQ的版本和下载
jQuery的版本
1.x:兼容IE6~8浏览器,是目前PC端开发常用的类库
2.x/3.x:不支持IE6~8的兼容,目前市场上应用的特别少(移动端开发一般用zepto.js)
jquery-1.9.3.min.js
jquery-1.11.3.min.js
jquery.min.js下载
官网下载:http://jquery.com/
Github:https://github.com/jquery/jquery
基于NODE的npm下载jQuery
1 | //=>查jquery版本信息存放在jquery.version.json文件中 |
如何学习jQuery
研究JQ的源码:研究的过程是学习JQ的精华,促进自己的原生JS能力以及插件或者类库的封装能力
看JQ的API手册: http://jquery.cuishifeng.cn/
锋利的JQ第二版:对于JQ的基础知识和实战应用讲解得非常好点击下载.zip
JQ的核心原理解读(分析源代码)
jQuery 是一个常用方法类库,提供了很多真是项目中需要使用的属性和方法(这些方法jQ已经帮我们完善了浏览器兼容处理以及一些细节的优化)
jQuery本身就是一个类(jQ是基于构造函数模式构建的)
1 | var jQuery = function(selector, context){ |
当我们在js中执行
\$()
jQuery()
都是在创建一个jQ类的实例($===jQuery),这些实例都是一个类数组(我们把这个类数组称之为JQ对象),JQ的实例可以使用JQ原型上提供的共有属性和方法
项目中我们把\$()称之为JQ选择器,因为执行这个方法可以传递一个selector参数进去,通过selector我们可以获取到需要操作的DOM元素集合(JQ类数组集合),传递的第二个参数context它是当前获取元素的上下文(不传递默认是document,如果传递一个JS元素对象即可)
但是把它叫做JQ选择器有点笼统,因为传递的selector支持三种格式
传递的是个字符串,就是我们所谓的选择器,能够通过选择器获取元素
传递的是一个元素对象,它的意思是把JS原生对象转换为JQ对象
传递的是个函数,它代表等DOM结构加载完成在执行对应的JS代码(类似于window.onload)
1 | $ === jQuery; // true |
第一个参数[selector]传递的是一个字符串,就是通过选择器获取到的元素集合(获取的结果都是类类数组集合;获取多个元素也就是索引多点,获取一个元素就只有索引0,一个都没获取到就是一个空的类数组集合【而不是null】)
一般css或者css3中支持的选择器,jq都支持
1 | //=> 基本选择器 |
jQ对象和原生js对象转换
JQ对象:通过$()获取的JQ实例(类数组)
原生JS对象:通过ES中提供的属性或者方法获取的JS元素对象(nodeType === 1)把原生JS对象转换为JQ对象
1 | var oBox = document.getElementById('box'); //=> 原生JS对象 |
把JQ对象转换为原生JS对象
1 | var $body = $('body'); |
selector是一个方法
1 | $(function(){ |
和window.onload不太一样
1、$(function(){}) 可以在同一个页面使用多次,多次都生效(所以在使用jQuery完成代码的时候,我们一般都会把代码放在回调函数中;首先不仅是等到结构加载完在执行,而且还形成了一个闭包)
原理:利用了DOM二级事件绑定(可执行多次),监听的是DOMContentLoaded时间(DOM结构加载完成就会触发)2、window.onload 本身就是资源都加载完成才会执行,使用的是DOM零级事件,在同一个页面中只能使用一次
1 | window.onload = function(){}; |
JQ既是一个类也是一个对象
jQuery.prototype上设置了很多的属性和方法,这些是供JQ实例(DOM集合或DOM元素)使用的属性和方法
addClass
css
removeClass
attr
…jQuery也是一个普通的对象,在对象上也有一些自己的属性和方法(和实例没有任何关系),这些都是工具类的方法
ajax
isFunction
unique
…
jQuery.prototype
1 | $('#box').index(); //=> 获取当前元素的索引(是在自己兄弟元素中的索引,它有几个哥哥,索引就是几) |
写在对象上的方法
1 | var j = $,noConflict(); //=> 如果当前项目中引入了两个类库,都是使用$操作的,为了防止$使用权的冲突,jQ做了一个处理,转让使用权;此处返回的j就是代表原始$的变量,以后可以使用j()执行 |
筛选方法
filter: 同级过滤
children: 子集过滤
find: 后代过滤
1 | var $links = $('a'); |
each
JQ中的each有两种
1、 写在原型上的each: 遍历JQ对象中的每一项
2、 写在对象上的each: 工具方法,可以用来遍历数组、类书组、对象等
3、 内置的each其实也是调用原型上的each处理的,只不过JQ在处理的时候会内部自己调用
1 | $('a').addClass('select'); //=> 我们获取的a可能有很多个,执行一次addClass,相当于给每个获取的a都增加一个叫做select的样式类(JQ中大部分方法在执行的时候,都会把获取的JQ集合中的每一项调用each进行遍历,把需要操作的任务对每一个遍历一边的元素进行操作) |
animate
JQ中提供了元素运动的动画库
stop: 结束当前元素正在运行的动画,继续执行下一个新的动画(一般我们实现动画,stop方法基本必然执行)
finish: 和stop类似,finish需要让元素立即运动到上一个动画的目标位置,从目标位置执行下一个动画,而stop是从上一个动画停止的位置执行下一个动画
animate([target],[duration],[effect],[callBack]):
[target] 对象
[duration] 时间
[effect] linear/ease/ease-in/ease-out/ease-in-out
[callBack] 回调函数,动画结束做的事情
快捷动画
show(1000/fast/slow)
hide
togglefadeIn
fadeOut
fadeToggleslideUp
slideDown
slideToggle