1.3 第一个jQuery驱动的页面

了解jQuery能够提供的丰富特性之后,我们可以来看一看这个库的实际应用了。为此,我们需要下载一个jQuery的副本。

1.3.1 下载jQuery

jQuery不需要安装,要使用它只需该文件的一个副本,该副本可以放在外部站点上,也可以放在自己的服务器上。由于JavaScript是一种解释型语言,所以不必担心编译和构建。什么时候需要使用jQuery,只要在HTML文档中使用<script>元素把它导入进来即可。
jQuery官方网站始终都包含该库最新的稳定版本,通过官网的首页就可以下载。官方网站在任何时候都会提供几种不同版本的jQuery库,但其中最适合我们的是该库最新的**未压缩版(uncompressed)**。而在正式发布的页面中,则可以使用压缩版(minified)。
随着jQuery的日益流行,很多公司都通过自己的CDN(Content Delivery Networks,内容分发网络)来托管其库文件,让开发人员能更方便地使用它。最典型的就是谷歌(https://developers.google.com/speed/libraries/devguide)和微软(http://www.asp.net/ajaxlibrary/cdn.ashx)和jQuery项目自己的服务器(http://code.jquery.com/),jQuery库文件被放在了强劲、低延时的服务器上,这些服务器遍布全球各地,无论用户在哪个国家,都能以最快速度下载到jQuery。虽然托管在CDN上的文件由于分布式和缓存的原因有速度优势,但在实际开发中还是使用本地副本更方便一些。

1.3.2 本书使用jQuery的哪个版本

为了确保在现代浏览器中速度更快,代码更简洁,jQuery从2.0版开始不再支持IE6IE7IE8
不过支持这些老版本浏览器也很重要。正因为如此,jQuery开发团队还会继续维护jQuery 1.x版。
如果项目中有针对jQuery 1.9之前的版本编写的代码,可以使用jQuery迁移插件实现与jQuery 1.10兼容。

1.3.3 在HTML文档中引入jQuery

下载示例代码

如同本书其他HTMLCSS以及JavaScript示例一样,上面的标记只是完整文档的一个片段。如果读者想试一试这些示例,可以从本书网站下载随书代码.

引用jQuery库文件的<script>标签,必须放在引用自定义脚本文件的<script>标签之前。否则,在我们编写的代码中将引用不到jQuery框架。

1.3.4 编写jQuery代码

1. 查找诗歌文本

jQuery中基本的操作就是选择文档中的某一部分,这是通过$()函数来完成的。通常,$()函数需要一个字符串参数,该字符串参数中可以包含任何**CSS选择符表达式。在这个例子中,我们想要找到带有poem-stanza类的所有<div>元素,因此选择符非常简单。不过,在本书其他章中,我们还会介绍很多更复杂的选择符表达式。在第2章中,我们要讨论的就是查找文档部分的不同方式。
这里用到的
$()函数会返回一个新的jQuery对象实例**,它是我们从现在开始就要打交道的基本的构建块。**jQuery对象中会封装零个或多个DOM元素,并允许我们以多种不同的方式与这些DOM元素进行交互**。在这个例子中,我们希望修改页面中这些部分的外观,而为了完成这个任务,就需要改变应用到诗歌文本的类。

2. 加入新类

1本例中,.addClass()方法会将一个CSS类应用到我们选择的页面元素.addClass()方法唯一的参数就是要添加的类名。 .addClass()方法及其反方法.removeClass(),为我们探索jQuery支持的各种选择符表达式提供了便利。现在,这个例子只是简单地添加了highlight类,而我们的样式表中为这个类定义的是带边框和灰色背景的斜体文本样式。
我们注意到,无需迭代操作就能为所有诗歌中的添加这个类(所谓就是类为.poem-stanza的文档部分.)。前面我们提到过,jQuery.addClass()等方法中使用了隐式迭代机制,因此一次函数调用就可以完成对所有选择的文档部分的修改

3. 执行代码

综合起来,$().addClass()对我们修改诗歌中文本的外观已经够用了。但是,如果将这行代码单独插入文档的头部,不会有任何效果。通常,JavaScript代码在浏览器初次遇到它们时就会执行,而在浏览器处理头部时,HTML还不会呈现样式。因此,我们需要将代码延迟到DOM可用时再执行。
通过使用$(document).ready()方法, jQuery支持我们预定在DOM加载完毕后调用某个函数,而不必等待页面中的图像加载。尽管不使用jQuery,也可以做到这种预定,但$(document).ready()为我们提供了很好的跨浏览器解决方案,涉及如下功能:

  • 尽可能使用浏览器原生的DOM就绪实现,并以window.onload事件处理程序作为后备;
  • 可以多次调用$(document).ready()并按照调用它们的顺序执行;
  • 即便是在浏览器事件发生之后把函数传给$(document).ready(), 这些函数也会执行;
  • 异步处理事件的预定,必要时脚本可以延迟执行;
  • 通过重复检查一个几乎与DOM同时可用的方法,在较早版本的浏览器中模拟DOM就绪事件。

$(document).ready()方法的参数可以函数名称,如下面的代码所示

1
2
3
4
5
function addHighlightClass()  { 
$('div.poem-stanza').addClass('highlight');
}
// 使用函数的引用(函数名)作为参数
$(document).ready(addHighlightClass);

这个方法也可以接收一个匿名函数.

1
2
3
$(document).ready(function() {  
$('div.poem-stanza').addClass('highlight');
});

这种匿名函数的写作在jQuery中十分方便,特别适合传递那些不会被重用的函数。而且,与此同时创建的闭包也是一种非常高级和强大的工具。但是,假如处理不当的话,闭包也会给我们带来意想不到的后果以及内存占用问题。附录A详细介绍了闭包。

1.3.5 最终结果

在编写好JavaScript代码之后,现在的页面如下图:

由于JavaScript插入了highlight类,页面中的两节诗歌文本变成了斜体,带有了灰色背景,并且被包含在方框中;这些样式来源于01.css样式表。

1.2 jQuery为什么如此出色

jQuery策略

jQuery采用了如下策略。

  1. 利用CSS的优势。通过将查找页面元素的机制构建于CSS选择符之上,jQuery继承了简明清晰地表达文档结构的方式。由于进行专业Web开发的一个必要条件是掌握CSS语法,因而jQuery成为希望向页面中添加行为的设计者们的切入点。
  2. 支持扩展。为了避免特性蠕变(feature creep)①,jQuery将特殊情况下使用的工具归入插件当中。创建新插件的方法很简单,而且拥有完备的文档说明,这促进了大量有创意且有实用价值的模块的开发。甚至在下载的基本jQuery库文件当中,多数特性在内部都是通过插件架构实现的。而且,如有必要,可以移除这些内部插件,从而生成更小的库文件.
  3. 抽象浏览器不一致性Web开发领域中一个令人遗憾的事实是,每种浏览器对颁布的标准都有自己的一套不太一致的实现方案。 任何Web应用程序中都会包含一个用于处理这些平台间特性差异的重要组成部分。虽然不断发展的浏览器前景,使得为某些高级特性提供浏览器中立的完美的基础代码(code base)变得不大可能,但jQuery添加一个抽象层来标准化常见的任务,从而有效地减少了代码量,同时,也极大地简化了这些任务。
  4. 总是面向集合。当我们指示jQuery“找到带有collapsible类的全部元素,然后隐藏它们”时,不需要循环遍历每一个返回的元素。相反,.hide()之类的方法被设计成自动操作对象集合,而不是单独的对象。利用这种称作隐式迭代(implicit iteration)的技术,就可以抛弃那些臃肿的循环结构,从而大幅地减少代码量。
  5. 将多重操作集于一行。为了避免过度使用临时变量或不必要的代码重复,jQuery在其多数方法中采用了一种称作连缀(chaining)②的编程模式。这种模式意味着基于一个对象进行的多数操作的结果,都会返回这个对象自身,以便为该对象应用下一次操作。

这些策略不仅保证了jQuery包的小型化,也为我们使用这个库创建简洁的自定义代码提供了技术保障。
jQuery库的适用性一方面要归因于其设计理念,另一方面则得益于围绕这个开源项目涌现出的活跃社区的促进作用。jQuery用户聚集到一起,不仅会讨论插件的开发,也会讨论如何增强核心库。用户和开发人员也对jQuery的官方文档给予了持续的帮助,该文档的地址为http://api.jquery.com
jQueryWeb开发人员提供了灵活且健壮的系统,而且它对所有人都是免费的。这个开源项目遵循MIT License发布,任何站点和专有的软件都可以自由使用它。如果项目需要,还可以基于GNU Public License重新发布它,以便与其他基于GNU许可的开源项目整合。

脚注说明

① 术语feature creep(特性蠕变)也有人译为特性蔓延,指软件应用开发中过分强调新的功能以至于损害了其他的设计目标,例如简洁性、轻巧性、稳定性及错误出现率等。
② 术语chaining(连缀)也可译为链接,但为避免与人们耳熟能详的超链接混淆(如常见的”单击链接”等),所以才译为更贴切的连缀。

第1章 jQuery入门

本章将介绍如下内容:

  1. jQuery的主要特点;
  2. 建立jQuery编码环境;
  3. 简单jQuery脚本示例;
  4. 选择jQuery而不是纯JavaScript的理由;
  5. 常用JavaScript开发工具.

1.1 jQuery能做什么

  1. 取得文档中的元素。如果不使用JavaScript库,遍历DOM(Document Object Model,文档对象模型)树, 以及查找HTML文档结构中某个特殊的部分,必须编写很多行代码。 jQuery为准确地获取需要检查或操纵的文档元素,提供了可靠而富有效率的选择符机制。
    1
    $('div.content').find('p');
  2. 修改页面的外观CSS虽然为影响文档呈现的方式提供了一种强大的手段,但当所有浏览器不完全支持相同的标准时,单纯使用CSS就会显得力不从心。 jQuery可以弥补这一不足,它提供了跨浏览器的标准解决方案。而且,即使在页面已经呈现之后,jQuery仍然能够改变文档中某个部分的类或者个别的样式属性。
    1
    $('ul > li:first').addClass('active');
  3. 改变文档的内容。jQuery能够影响的范围并不局限于简单的外观变化,使用少量的代码,jQuery就能改变文档的内容。可以改变文本、插入或翻转图像、列表重新排序,甚至对HTML文档的整个结构都能重写和扩充——所有这些只需一个简单易用的API。
    1
    $('#container').append('<a href="more.html">more</a>');
  4. 响应用户的交互操作。即使是最强大和最精心设计的行为,如果我们无法控制它何时发生,那它也毫无用处。jQuery提供了截获形形色色的页面事件(比如用户单击某个链接)的适当方式,而不需要使用事件处理程序拆散HTML代码。此外,它的事件处理API也消除了经常困扰Web开发人员浏览器的不一致性。
    1
    2
    3
    $('button.show-details').click(function() {
    $('div.details').show();
    });
  5. 为页面添加动态效果。为了实现某种交互式行为,设计者也必须向用户提供视觉上的反馈。jQuery中内置的一批淡入、擦除之类的效果,以及制作新效果的工具包,为此提供了便利.
    1
    $('div.details').slideDown();
  6. 无需刷新页面从服务器获取信息。这种编程模式就是众所周知的Ajax(Asynchronous JavaScript and XML,异步JavaScriptXML),它是一系列在客户端和服务器之间传输数据的强大技术。jQuery通过消除这一过程中的浏览器特定的复杂性,使开发人员得以专注于服务器端的功能设计,从而得以创建出反应灵敏、功能丰富的网站。
    1
    $('div.details').load('more.html #content');
  7. 简化常见的JavaScript任务。除了这些完全针对文档的特性之外,jQuery也改进了对基本的JavaScript数据结构的操作(例如迭代和数组操作等)。
    1
    2
    3
    4

    $.each(obj, function(key, value) {
    total += value;
    });

    小结

    使用jQuery可以做如下事情:
  8. 取得文档中的元素
  9. 修改页面的外观
  10. 改变文档的内容
  11. 响应用户的交互操作
  12. 为页面添加动态效果
  13. 无需刷新页面从服务器获取信息
  14. 简化常见的JavaScript任务

jQuery基础教程 第4版 目录

第1章 jQuery入门

  • 1.1 jQuery能做什么
  • 1.2 jQuery为什么如此出色
  • 1.3 第一个 jQuery驱动的页面
    • 1.3.1 下载 jQuery
    • 1.3.2 本书使用 jQuery的哪个版本
    • 1.3.3 在 HTML文档中引入 jQuery
    • 1.3.4 编写 jQuery代码
    • 1.3.5 最终结果
  • 1.4 纯 JavaScript与 jQuery
  • 1.5 使用开发工具
  • 1.6 小结

第2章 选择元素

  • 2.1 理解DOM
  • 2.2 使用$()函数
  • 2.3 CSS选择符
  • 2.4 属性选择符
  • 2.5 自定义选择符
    • 2.5.1 每隔一行为表格添加样式
    • 2.5.2 基于上下文内容选择元素
    • 2.5.3 基于表单的选择符
  • 2.6 DOM遍历方法
    • 2.6.1 为特定单元格添加样式
    • 2.6.2 连缀
  • 2.7 访问 DOM元素
  • 2.8 小结
  • 2.9 练习

第3章 事件

  • 3.1 在页面加载后执行任务
    • 3.1.1 代码执行的时机选择
    • 3.1.2 基于一个页面执行多个脚本
    • 3.1.3 .ready()的简写形式
    • 3.1.4 向.ready()回调函数中传入参数
  • 3.2 处理简单的事件
    • 3.2.1 简单的样式转换器
    • 3.2.2 启用其他按钮
    • 3.2.3 利用事件处理程序的上下文
    • 3.2.4 使用事件上下文进一步减少代码
    • 3.2.5 简写的事件
    • 3.2.6 显示和隐藏高级特性
  • 3.3 事件传播
    • 3.3.1 事件的旅程
    • 3.3.2 事件冒泡的副作用
  • 3.4 通过事件对象改变事件的旅程
    • 3.4.1 事件目标
    • 3.4.2 停止事件传播
    • 3.4.3 阻止默认操作
    • 3.4.4 事件委托
    • 3.4.5 使用内置的事件委托功能
  • 3.5 移除事件处理程序
    • 3.5.1 为事件处理程序添加命名空间
    • 3.5.2 重新绑定事件
  • 3.6 模仿用户操作
  • 3.7 小结
  • 3.8 练习

第4章 样式与动画

  • 4.1 修改内联CSS
    • 4.1.1 设置计算的样式属性值
    • 4.1.2 带厂商前缀的样式属性
  • 4.2 隐藏和显示元素
  • 4.3 效果和时长
    • 4.3.1 指定显示速度
    • 4.3.2 淡入和淡出
    • 4.3.3 滑上和滑下
    • 4.3.4 切换可见性
  • 4.4 创建自定义动画
    • 4.4.1 手工创建效果
    • 4.4.2 一次给多个属性添加动画效果
  • 4.5 并发与排队效果
    • 4.5.1 处理一组元素
    • 4.5.2 处理多组元素
    • 4.5.3 简单概括
  • 4.6 小结
  • 4.7 练习

第5章 操作DOM

  • 5.1 操作属性
    • 5.1.1 非类属性
    • 5.1.2 DOM元素属性
    • 5.1.3 表单控件的值
  • 5.2 DOM树操作
    • 5.2.1 重新认识$()函数
    • 5.2.2 创建新元素
    • 5.2.3 插入新元素
    • 5.2.4 移动元素
    • 5.2.5 包装元素
    • 5.2.6 使用反向插入方法
  • 5.3 复制元素
  • 5.4 内容setter和getter方法
  • 5.5DOM操作方法的简单归纳
  • 5.6 小结
  • 5.7 练习

第6章 通过Ajax发送数据

  • 6.1 基于请求加载数据
    • 6.1.1 追加HTML
    • 6.1.2 操作JavaScript对象
    • 6.1.3 加载XML文档
  • 6.2 选择数据格式
  • 6.3 向服务器传递数据
    • 6.3.1 执行GET 请求
    • 6.3.2 执行POST 请求
    • 6.3.3 序列化表单
  • 6.4 为Ajax请求提供不同的内容
  • 6.5 关注请求
  • 6.6 错误处理
  • 6.7 Ajax和事件
  • 6.8 安全限制
  • 6.9 其他工具
    • 6.9.1 低级Ajax方法
    • 6.9.2 修改默认选项
    • 6.9.3 部分加载HTML页面
  • 6.10 小结
  • 6.11 练习

第7章 使用插件

  • 7.1 查找插件和帮助
  • 7.2 使用插件
    • 7.2.1 下载并包含Cycle插件
    • 7.2.2 调用插件提供的方法
    • 7.2.3 为插件方法指定参数
    • 7.2.4 修改参数默认值
  • 7.3 其他形式的插件
    • 7.3.1 自定义选择符
    • 7.3.2 全局函数插件
  • 7.4 jQuery UI插件库
    • 7.4.1 效果
    • 7.4.2 交互组件
    • 7.4.3 部件
    • 7.4.4 jQuery UI主题卷轴
  • 7.5 jQuery Mobile插件库
    • 7.5.1 HTML5自定义数据属性
    • 7.5.2 移动导航
    • 7.5.3 一个文档支持多个页面
    • 7.5.4 交互式元素
    • 7.5.5 高级功能
  • 7.6 小结
  • 7.7 练习

第8章 开发插件

  • 8.1 在插件中使用$别名
  • 8.2 添加新的全局函数
  • 8.3 添加jQuery 对象方法
    • 8.3.1 对象方法的上下文
    • 8.3.2 隐式迭代
    • 8.3.3 方法连缀
  • 8.4 提供灵活的方法参数
    • 8.4.1 参数对象
    • 8.4.2 默认参数值
    • 8.4.3 回调函数
    • 8.4.4 可定制的默认值
  • 8.5 使用jQueryUI部件工厂创建插件
    • 8.5.1 创建部件
    • 8.5.2 销毁部件
    • 8.5.3 启用和禁用部件
    • 8.5.4 接受部件选项
    • 8.5.5 添加子方法
    • 8.5.6 触发部件事件
  • 8.6 插件设计建议
  • 8.7 小结
  • 8.8 练习

第9章 高级选择符与遍历

  • 9.1 深入选择与遍历
    • 9.1.1 动态筛选表格内容
    • 9.1.2 为表格行添加条纹效果
    • 9.1.3 组合筛选与条纹
    • 9.1.4 更多选择符与遍历方法
  • 9.2 定制与优化选择符
    • 9.2.1 编写定制的选择符插件
    • 9.2.2 选择符的性能问题
  • 9.3 DOM遍历背后的秘密
    • 9.3.1 jQuery对象属性
    • 9.3.2 DOM元素栈
    • 9.3.3 编写DOM遍历方法插件
    • 9.3.4DOM遍历的性能问题
  • 9.4 小结
  • 9.5 练习

第10章 高级事件处理

  • 10.1 再谈事件
    • 10.1.1 追加数据页面
    • 10.1.2 悬停时显示数据
  • 10.2 事件委托
    • 10.2.1 使用jQuery的委托方法
    • 10.2.2 选择委托的作用域
    • 10.2.3 早委托
  • 10.3 自定义事件
    • 10.3.1 无穷滚动
    • 10.3.2 自定义事件参数
  • 10.4 节流事件
  • 10.5 扩展事件
  • 10.6 小结
  • 10.7 练习

第11 章高级效果

  • 11.1 再谈动画
  • 11.2 观测及中断动画
    • 11.2.1 确定动画状态
    • 11.2.2 中止运行的动画
  • 11.3 全局效果属性
    • 11.3.1 禁用所有效果
    • 11.3.2 定义效果时长
  • 11.4 多属性缓动
  • 11.5 使用延迟对象
  • 11.6 精细地控制动画
  • 11.7 小结
  • 11.8 练习

第12章 高级DOM操作

  • 12.1 排序表格行
    • 12.1.1 服务器端排序
    • 12.1.2 Ajax排序
    • 12.1.3 JavaScript排序
  • 12.2 移动和插入元素
    • 12.2.1 为已有的文本添加链接
    • 12.2.2 简单的JavaScript数组排序
    • 12.2.3 对DOM元素排序
  • 12.3 在DOM元素中保存数据
    • 12.3.1 执行预先计算
    • 12.3.2 存储非字符串数据
    • 12.3.3 变换排序方向
  • 12.4 使用HTML5自定义数据属性
  • 12.5 使用JSON排序和构建行
    • 12.5.1 修改JSON对象
    • 12.5.2 按需重新构建内容
  • 12.6 高级属性操作
    • 12.6.1 简捷地创建元素
    • 12.6.2 DOM创建挂钩
  • 12.7 小结
  • 12.8 练习

第13章 高级Ajax

  • 13.1 渐进增强与Ajax
  • 13.2 处理Ajax错误
  • 13.3 jqXHR 对象
    • 13.3.1 Ajax承诺
    • 13.3.2 缓存响应
  • 13.4 截流Ajax请求
  • 13.5 扩展Ajax功能
    • 13.5.1 数据类型转换器
    • 13.5.2 Ajax预过滤器
    • 13.5.3 替代传输方式
  • 13.6 小结
  • 13.7 练习

附录A JavaScript闭包

  • A.1 创建内部函数
  • A.1.1 在任何地方调用内部函数
  • A.1.2 理解变量作用域
  • A.2 处理闭包之间的交互
  • A.3 在jQuery中创建闭包
    • A.3.1 $(document).ready()的参数
    • A.3.2 绑定事件处理程序
    • A.3.3 在循环中绑定处理程序
    • A.3.4 命名及匿名函数
  • A.4 应对内存泄漏的风险
    • A.4.1 避免意外的引用循环
    • A.4.2 控制DOM与JavaScript的循环
  • A.5 小结

附录B 使用QUnit测试JavaScript

  • B.1 下载QUnit
  • B.2 设置文档
  • B.3 组织测试
  • B.4 添加和运行测试
  • B.5 其他测试类型
  • B.6 最佳实践
  • B.7 小结

附录C 简明参考

  • C.1 选择符表达式
    • C.1.1 简单的CSS选择符
    • C.1.2 在同辈元素间定位
    • C.1.3 在匹配的元素间定位
    • C.1.4 属性
    • C.1.5 表单
    • C.1.6 其他自定义选择符
  • C.2 DOM遍历方法
    • C.2.1 筛选元素
    • C.2.2 后代元素
    • C.2.3 同辈元素
    • C.2.4 祖先元素
    • C.2.5 集合操作
    • C.2.6 操作选中的元素
  • C.3 事件方法
    • C.3.1 绑定
    • C.3.2 简写绑定
    • C.3.3 触发事件
    • C.3.4 简写触发方法
    • C.3.5 实用方法
  • C.4 效果方法
    • C.4.1 预定义效果
    • C.4.2 自定义动画
    • C.4.3 队列操作
  • C.5 DOM操作方法
    • C.5.1 特性与属性
    • C.5.2 内容
    • C.5.3 CSS
    • C.5.4 尺寸
    • C.5.5 插入
    • C.5.6 替换
    • C.5.7 删除
    • C.5.8 复制
    • C.5.9 数据
  • C.6 Ajax方法
    • C.6.1 发送请求
    • C.6.2 监视请求
    • C.6.3 配置
    • C.6.4 实用方法
  • C.7 延迟方法
    • C.7.1 创建对象
    • C.7.2 延迟对象的方法
    • C.7.3 承诺对象的方法
  • C.8 其他方法
    • C.8.1 jQuery对象的属性
    • C.8.2 数组和对象
    • C.8.3 对象内省
    • C.8.4 其他

内容提要

  • 本书是jQuery经典技术教程的最新升级版,涵盖jQuery 1.10.xjQuery 2.0.x
  • 本书前6章以通俗易懂的方式讲解了jQuery的核心组件,包括jQuery的选择符、事件、动画、DOM操作、Ajax支持等。
  • 第7章和第8章介绍了jQuery UIjQuery Mobile及利用jQuery强大的扩展能力开发自定义插件。
  • 随后的几章更加深入地探讨了jQuery的各种特性及一些高级技术。
  • 附录A特别讲解了JavaScript中闭包的概念,以及如何在jQuery中有效地使用闭包。
  • 附录B讲解了使用QUnit测试JavaScript代码的必备知识。
  • 附录C给出了jQuery API的快速参考。