一、jQuery简介
- jQuery作者John Resig,于2006年发布第1个版本。后续版本陆续增加了大量新的API、并优化性能。
- jQuery是一个轻量级的开源js库,拥有强大的选择器,出色的DOM操作,可靠的事件处理,完善的Ajax,出色的兼容性和链式操作。
- write less,do more。加一句,learn more。
- jQuery只建立一个名为jQuery的对象,别名用$表示,所有的函数方法都在这个对象之下,也可以随时交出控制权,不会污染其他的对象。
hello world
1 | <html> |
jQquery对象和DOM对象转换
1 |
|
二、jQuery选择器
- jQuery支持CSS1到CSS3选择器。
- 如出现特殊字符,如点、井号、括号等特殊字符,需要使用\\字符进行转义。
- 选择器中含有空格和不含有空格是两个意义。比如带空格为后代选择器,不带空格为过滤选择器。
基本选择器
选择器 | 说明 | 返回 | 示例 |
---|---|---|---|
#id | 根据id匹配一个元素 | 单个元素 | $(“#test”) |
.class | 根据类名匹配元素 | 集合元素 | $(“.test”) |
element | 根据元素名匹配元素 | 集合元素 | $(“p”) |
* | 匹配所有元素 | 集合元素 | $(“*”) |
selector1,selector2 | 将所有选择器的元素合并后一起返回 | 集合元素 | $(“div,p.myClass”) |
层次选择器
选择器 | 说明 | 返回 | 替代 |
---|---|---|---|
$(“div span”) | 选取div元素里所有span(后代)元素 | 集合元素 | |
$(“div > span”) | 选取div元素里所有span(子)元素 | 集合元素 | |
$(“div + span”) | 选取紧接在div元素后的下一个span(同辈)元素 | 集合元素 | $(“div”).next(“span”) |
$(“div ~ span”) | 选取紧接在div元素后的所有span(同辈)元素 | 集合元素 | $(“div”).nextAll(“span”) |
选取div元素前后的所有span(同辈)元素 | 集合元素 | $(“div”).siblings(“span”) |
过滤选择器
包括基本过滤选择器、内容过滤选择器、可见性过滤选择器、属性过滤选择器、子元素过滤选择器和表单对象属性过滤选择器。
选择器 | 说明 | 返回 | 示例 |
---|---|---|---|
:first | 选择第1个元素 | 单个元素 | $(“div:first”)选取所有div元素中第一个div元素 |
:last | 选择最后1个元素 | 单个元素 | $(“div:last”)选取所有div元素中最后一个div元素 |
:not(selector) | 去除所有与selector匹配的元素 | 集合元素 | $(“div:not(.myClass)”)选取class不是myClass的div元素 |
:even | 选取索引是偶数的所有元素,索引从0开始 | 集合元素 | $(“div:even”)选取索引是偶数的div元素 |
:odd | 选取索引是奇数的所有元素,索引从0开始 | 集合元素 | $(“div:odd”)选取索引是奇数的div元素 |
:eq(index) | 选取索引等于index的元素 | 单个元素 | $(“div:eq(1)”)选取索引是1的div元素 |
:gt(index) | 选取索引大于index的元素 | 集合元素 | $(“div:gt(1)”)选取索引大于1的div元素 |
:lt(index) | 选取索引小于index的元素 | 集合元素 | $(“div:lt(5)”)选取索引小于5的div元素 |
:header | 选取所有标题元素 | 集合元素 | $(“:header”)选取所有标题元素h1,h2,h3 |
:animated | 选取所有正在执行动画的元素 | 集合元素 | $(“div:animated”)选取所有执行动画的div元素 |
:focus | 选取当前获取焦点的元素 | 集合元素 | $(“:focus”)选取所有获取焦点的元素 |
:contains(text) | 选取含有文本内容为text的元素 | 集合元素 | $(“div:contains(‘test’)”)选取所有含有文本test的div元素 |
:empty | 选取不包含子元素活文本的元素 | 集合元素 | $(“div:empty”)选取不包含子元素的div元素 |
:has(selector) | 选取含有选择器匹配的元素的元素 | 集合元素 | $(“div:has(p)”)选取含有p元素的div元素 |
:parent | 选取含有子元素活文本的元素 | 集合元素 | $(“div:parent”)选取含有子元素的div元素 |
:hidden | 选取所有不可见的元素 | 集合元素 | $(“:hidden”)选取不可见的元素,包括input的type为hidden,display为none,visibility为hidden等 |
:visible | 选取所有可见的元素 | 集合元素 | $(“div:visible”)选取可见的div元素 |
[attribute] | 选取拥有此属性的元素 | 集合元素 | $(“div[id]”)选取拥有属性id的div元素 |
[attribute=value] | 选取拥有此属性值为value的元素 | 集合元素 | $(“div[title=’test’]”)选取拥有属性title为test的div元素 |
[attribute!=value] | 选取拥有此属性值不等于value的元素 | 集合元素 | $(“div[title!=’test’]”)选取拥有属性title不是test的div元素 |
[attribute^=value] | 选取拥有此属性值以value开始的元素 | 集合元素 | $(“div[title^=’test’]”)选取拥有属性title以test开始的div元素 |
[attribute$=value] | 选取拥有此属性值以value结束的元素 | 集合元素 | $(“div[title$=’test’]”)选取拥有属性title以test结束的div元素 |
[attribute*=value] | 选取拥有此属性值含有value的元素 | 集合元素 | $(“div[title*=’test’]”)选取拥有属性title含有test的div元素 |
[attribute|=value] | 选取属性等于value或者value-开始的元素 | 集合元素 | $(“div[title|=’test’]”)选取属性title为test或test-开始的div元素 |
[attribute~=value] | 选取拥有属性值用空格分隔的值中包含value的元素 | 集合元素 | $(“div[title~=’test’]”)选取拥有属性title用空格分隔的值中包含test的div元素 |
[attribute1][attribute2] | 用属性选择器合并成一个复合选择器,同时满足多个条件 | 集合元素 | $(“div[id][title$=’test’]”)选取拥有属性id,并且属性title以test结束的div元素 |
:nth-child(index/even/odd/equation) | 选择每个父元素下的第index个子元素或者奇偶元素或者3n元素(index从1开始,n从1开始) | 集合元素 | :eq只返回单个元素,:nth-child为每个父元素匹配子元素。 |
:first-child | 选择每个父元素下的第1个子元素 | 集合元素 | :first只返回单个元素,:first-child为每个父元素匹配第1个子元素。 |
:last-child | 选择每个父元素下的最后1个子元素 | 集合元素 | :last只返回单个元素,:first-child为每个父元素匹配最后1个子元素。 |
:only-child | 选择每个父元素下的唯一的子元素 | 集合元素 | $(“ul li:only-child”)是在ul中选取是唯一子元素的li元素 |
:enabled | 选取所有可用的元素 | 集合元素 | $(“#form1:enabled”)选取id为form1的表单内的所有可用元素 |
:disabled | 选取所有不可用的元素 | 集合元素 | $(“#form1:disabled”)选取id为form1的表单内的所有不可用元素 |
:checked | 选取所有被选中的元素(单选复选框) | 集合元素 | $(“input:checked”)选取所有被选中的元素 |
:selected | 选取所有被选中的选项元素 | 集合元素 | $(“select option:selected”)选取所有被选中的选项元素 |
表单选择器
| 选择器 | 说明 | 返回 |
| :input | 选取所有input、textarea、select和button元素 | 集合元素 |
| :text | 选取所有单行文本框 | 集合元素 |
| :password | 选取所有密码框 | 集合元素 |
| :radio | 选取所有单选框 | 集合元素 |
| :checkbox | 选取所有复选框 | 集合元素 |
| :submit | 选取所有提交按钮 | 集合元素 |
| :image | 选取所有图片按钮 | 集合元素 |
| :reset | 选取所有重置按钮 | 集合元素 |
| :button | 选取所有按钮 | 集合元素 |
| :file | 选取所有上传域 | 集合元素 |
| :hidden | 选取所有不可见元素 | 集合元素 |
三、jQuery的DOM操作
- DOM(Document Object Model),文档对象模型,是一种与浏览器、平台、语言无关的接口,通过该接口进访问页面中的所有标准组件。
- DOM分为DOM Core、HTML-DOM和CSS-DOM。
1 | //DOM Core |
插入节点
1 |
|
删除节点
1 |
|
复制、替换节点
1 |
|
包裹节点
1 |
|
属性操作
1 |
|
样式操作
1 |
|
设置和获取HTML、文本和值
1 |
|
遍历节点
1 |
|
CSS-DOM操作
1 |
|
三、jQuery的事件处理
点击事件绑定
1 | <html> |
合成事件
- 合成事件:jQuery有2个合成事件,hover()方法和toggle()方法。
- hover模拟光标悬停事件,移动上去触发第1个函数,移出后触发第2个函数。
- toggle方法,用于模拟鼠标连续点击事件,轮番调用。
1 | <html> |
事件冒泡
- 页面上有多个事件,也可以多个元素相应同一个事件。每一个元素会按照向上冒泡的顺序响应click事件。
- jQuery对事件进行了拓展和封装,可以通过event获取事件对象。
- jQuery通过event.stopPropagation()方法来停止事件冒泡。
- jQuery通过event.preventDefault()方法来阻止元素默认行为,如表单的提交行为。
- 如需要同时对事件对象停止冒泡和默认行为,可以直接return false;
1 | <head> |
事件移除
1 |
|
模拟操作
1 | <head> |
四、jQuery的动画
常用动画
1 | <html> |
自定义动画
- 使用animate方法来自定义动画。
1 | <html> |
五、jQuery与Ajax
- Asynchronous JavaScript and XML(Ajax),异步JavaScript和XML,开启了无刷新更新页面的时代。
- Ajax优势:不需要插件,优秀的用户体验,提高Web程序的性能,减轻服务器压力
- Ajax不足:浏览器对XMLHTTPRequest对象的支持度不足,破坏浏览器前进后退,对搜索引擎支持不友好,开发和调试工具缺乏。
- Ajax核心是XMLHTTPRequest对象,用来发送异步请求,接收响应和执行回调。
传统JS实现ajax
1 | <html> |
jQuery的load方法
用于远程载入HTML代码并插入DOM。
1 | <html> |
jQuery的$.get()、$.post()、$.getJSON()和$.ajax()方法
- 返回的数据格式可以是HTML片段,可以是XML格式,可以是JSON格式(常用)。ajax的dataType可以xml、html、script、json、jsonp、text等。
- ajax提供表单的serialize和serializeArray方法,用于将表单DOM元素序列化为字符串或json格式,用于ajax请求。
- ajax请求时会触发全局回调函数,用于jQuery元素绑定。如ajaxComplete、ajaxError、ajaxSend和ajaxSuccess等。
1 | <html> |
跨域问题
- 因为浏览器的同源策略,非简单请求的Ajax可能存在跨域问题。
- 简单请求是HEAD、GET和POST请求,且header字段为Accept、Accept-Language、Content-Language、Last-Event-ID、以及Content-Type只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain。在这个范围内的请求为简单请求。其他的为非简单请求
遇到跨域问题的浏览器报错如下:
- No ‘Access-Control-Allow-Origin’ header is present on the requested resource。The response had HTTP status code 404。非简单请求需要发送options预检请求,后台无options接口则报错。
- No ‘Access-Control-Allow-Origin’ header is present on the requested resource。The response had HTTP status code 405。非简单请求发送了options预检请求,但因后台options接口安全配置问题阻止了预检。
- No ‘Access-Control-Allow-Origin’ header is present on the requested resource。The response had HTTP status code 200。非简单请求发送了options预检请求,后台options接口允许了预检,但可能header不匹配导致浏览器端报错。
- header contains multiple values ‘,‘。响应头包含了多个Access-Control-Allow-Origin:*。为后台配置错误。
解决方案:
1、jsonp,利用script脚本拥有跨域能力来实现。需要前端添加script脚本向服务器发送请求,后台将数据包裹在一个函数里返回,前端执行该函数解析数据。只能是GET请求,基本不常使用了。
1 | <html> |
2、前端代理,常用于vue等开发环境。
3、后台配置,以java为例。
1 | import org.springframework.context.annotation.Configuration; |
六、jQuery插件
常用插件
插件名称 | 说明 |
---|---|
Validation | 表单验证 |
Form | 表单 |
SimpleModal | 模态窗口 |
Cookie | 管理Cookie |
jQuery UI | 交互、组件、效果库 |
编写插件
- jQuery.fn.extend(object) 为拓展jQuery元素,提供新的方法。
- jQuery.extend(object)为拓展jQuery元素本身,将函数添加到jQuery命名空间中。
1、jquery.color.js
1 | //插件编写 |
2、使用
1 | <html> |
七、jQuery总结
性能优化
- 使用最新的版本类库
- 使用合适的选择器,优先使用id选择器,尽量给选择器指定上下文。
- 缓存对象
- 注意循环时的DOM操作开销
- 尽量用数组方式(while或for)使用jQuery对象,而不是使用$.each()。
- 事件代理,每个事件都会冒泡到父级节点,可以通过父级节点的一次绑定,来解决子元素多次绑定。
- 将自己的代码封装成jQuery插件
- 使用join拼接字符串,替代加号
- 尽量使用原生的JS方法,有时你根本不需要使用jQuery。
- 压缩JavaScript,使用Gzip,或者压缩版。
小技巧
- 禁用页面的右键菜单,绑定事件contextmenu返回false
- 新窗口打开页面,使用this.target=”_blank”
- 判断浏览器类型,使用$.brower对象
- 返回头部滑动动画,使用animate
- 获取鼠标位置,使用mousemove的event的pageX和pageY
- 判断元素是否存在,使用length属性
- 设置div在屏幕中央,使用jQuery.fn.center进行拓展
- 自定义选择器,$.extend拓展
- 关闭所有动画效果,使用jQuery.fx.off
- 检测鼠标左右键,使用mousedown的event的which
- 回车提交表单,使用keyup事件。
- 设置全局ajax参数,ajax的4个全局事件
- 选择同辈元素,使用sliblings
- 进行本地存储,使用localStorage
- 进行Cookie管理,可使用jQuery插件,$.cookie(‘key’,’value’,{expires:7,path:’/‘})
jQuery概览
1、基础
- 核心函数
- 多库共存
- 对象访问
- 插件机制
2、选择器
- 基本
- 层级
- 基本过滤器
- 内容过滤器
- 表单过滤器
- 可见过滤器
- 属性过滤器
- 子元素过滤器
- 表单
3、属性
- 属性
- 类
- HTML
- 文本
- 值
4、筛选
- 过滤
- 查找
- 串联
5、文档处理
- 内部插入
- 外部插入
- 包裹
- 替换
- 删除
- 复制
6、CSS
- css
- 定位
- 高宽
7、事件
- 页面载入
- 事件绑定
- 动态事件
- 事件交互
- 错误
- 键盘事件
- 鼠标事件
- 窗口操作
8、动画效果
- 基本
- 滑动
- 淡入淡出
- 自定义
- 设置
9、Ajax
- Ajax请求
- Ajax事件
- 其他
10、其他实用项
- 浏览器和特性检测
- 数组和对象操作
- 测试操作
- 字符串操作
- URLs
- 数据功能
- 事件对象