Jquery 介绍

一、实验介绍

1.1 实验内容

本节实验将带领大家了解 jQuery 的定义,它有什么作用,我们为什么要学它,以及如何使用它,它的语法是什么,最后对比了 jQuery 对象和 DOM 对象的区别。

由于实验楼使用是 WebIDE 的在线环境,所以有不熟悉对同学请阅读:实验楼 WebIDE 使用指南 的前端部分。

1.2 实验知识点

  • 什么是 jQuery
  • jQuery 特色
  • 为什么要学习 jQuery
  • 配置 jQuery 环境
  • jQuery 语法
  • jQuery 代码风格
  • jQuery 对象和 DOM 对象
  • 解决 jQuery 和其他库的冲突

1.3 实验环境

  • Theia: 一款前后端分离的、基于 web 的 云 IDE。
  • Preview 或 Mini Browser:浏览器,右键点击目标 html 文件,选择 open with 下的 Preview 或 Mini Browser 即可在 IDE 中打开浏览器。

1.4 参考链接

二、jQuery 简介

2.1 什么是 jQuery

jQuery 是开源软件,使用 MIT 许可证授权。jQuery 的语法设计使得许多操作变得容易,如操作文档对象(document)、选择文档对象模型(DOM)元素、创建动画效果、处理事件、以及开发 Ajax 程序。jQuery 也给开发人员提供了在其上创建插件的能力。这使开发人员可以对底层交互与动画、高级效果和高级主题化的组件进行抽象化。模块化的方式使 jQuery 函数库能够创建功能强大的动态网页以及网络应用程序。

微软和诺基亚已宣布在他们的平台上绑定 jQuery。微软最初在 Visual Studio 中集成了 jQuery 以便在微软自己的 ASP.NET AJAX 框架和 ASP.NET MVC Framework 中使用,而诺基亚则在他的 Web 运行时组件开发平台中集成了 jQuery。MediaWiki 自从 1.16 版本后也开始使用 jQuery。

jQuery 1.3 版以后,引入全新的层叠样式表(CSS)选择器引擎 Sizzle。同时不再提供 Packed 版本,因为解压缩所消耗的时间,远大于所节省的下载时间,且不利于调试,且已有 Google AJAX Libraries API 等公开站台提供 jQuery 的 js 的引用服务,故 Packed 版本原本的优点已荡然无存。

注:定义来自维基百科。

我们可以简单的理解为 jQuery 是一个 JavaScript 函数库。jQuery 是一个轻量级的”写的少,做的多”的 JavaScript 库。

2.2 特色

  • 使用多浏览器开源选择器引擎 Sizzle(jQuery 项目的派生产品)进行 DOM 元素选择
  • 基于 CSS 选择器的 DOM 操作,使用元素的名称和属性(如 id 和 class)作为选择 DOM 中节点的条件
  • 事件
  • 特效和动画
  • Ajax
  • Deferred 和 Promise 对象来控制异步处理
  • JSON 解析
  • 通过插件扩展
  • 工具函数,如特征检测
  • 现代浏览器中本地的兼容性方法,但对于旧版浏览器需要后备(fallback)方法,比如 inArray()和 each()
  • 多浏览器(不要与跨浏览器混淆)支持

三、为什么要学习 jQuery

新闻一:

2018 年 7 月 25 日,Mislav Marohnić 发了一条推文,宣布 GitHub.com 前端已经彻底删除了 jQuery。而且,还自问自答地解释,删除 jQuery 之后也没用其他框架,而是全部依赖原生 API。

新闻二:

Bootstrap 发布了最新版本 4.3.0(https://blog.getbootstrap.com/2019/02/11/bootstrap-4-3-0/),作为 Bootstrap 4.3 发布的一部分,团队也公布了下一个主要版本 Bootstrap 5 的开发计划。

开发团队表示在发布 v4.3 版本后,将会在开发 Bootstrap 5 的过程中实现一些关键变化,或许会是重大的变化,而这也将被认为是 Bootstrap 5 的基础。开发团队重点提到了以下几方面:

放弃 jQuery:Bootstrap 5 将删除 jQuery 作为依赖项。开发团队已经在这方面工作了很长时间,PR 也是处于正在进行中并已接近完成的状态(https://github.com/twbs/bootstrap/pull/23586)

改进开发分支:v3-dev 分支将成为 master 分支;v4-dev 则保持原样,不过会从该分支切出一个新的 master 分支来开发 v5 版本

从 Jekyll 迁移到 Hugo:目前已有一个 PR 正在进行并且已接近完成(https://github.com/twbs/bootstrap/pull/28014)

移除 jQuery 这个最大的依赖之后,开发团队表示未来将使用原生的纯 JavaScript 来代替 jQuery。这和去年 GitHub 改版重构页面时移除了 jQuery 的举措有点像。

当时 GitHub 的前端团队趁着改版的机会,在重构页面时乘机移除了其中的 jQuery,并且没有使用其它框架来代替 jQuery,而是使用原生 JS:

  • 用 querySelectorAll 来查询 DOM 节点
  • 使用 fetch 代替 ajax(在不支持的浏览器上使用 XHR)
  • 使用代理事件来进行事件处理
  • 为一些尚未实现的 DOM 标准写了 polyfill
  • 更多地使用自定义元素 (CustomElement)

从这些信息来看,jQuery 正在一步步走向消亡,那么我们还有必要学习 jQuery 吗?首先我们来回顾一下 jQuery 的辉煌。

3.1 jQuery 的辉煌

jQuery 最初诞生于 2006 年 8 月,作者是 John Resig(https://zh.wikipedia.org/wiki/JQuery)。10 多年前,网页开发者(当时还没有“前端”这个概念)深受浏览器不兼容性之苦。以 jQuery 为代表的一批 JavaScript 库/框架应运而生。

jQuery 官网是这样描述的:

  1. jQuery is a fast, small, and feature-rich JavaScript library. It makes things like HTML document traversal and manipulation, event handling, animation, and Ajax much simpler with an easy-to-use API that works across a multitude of browsers. With a combination of versatility and extensibility, jQuery has changed the way that millions of people write JavaScript.

jQuery 强调的理念就是写的少,做的多(write less,do more)。它有如下的优势:

  • 轻量级。
  • 强大的选择器。
  • 出色的 DOM 操作的封装。
  • 可靠的事件机制。
  • 完善的 ajax。
  • 不污染顶级变量。
  • 出色的浏览器兼容性。
  • 链式操作方式。
  • 隐式迭代。
  • 行为层与结构层的分离。
  • 丰富的插件支持。
  • 完善的文档。
  • 开源。

2011 年新版的“犀牛书”第 6 版——JavaScript: The Definitive Guide, 6th(JavaScript 权威指南第六版)甚至拿出第 19 章整整 64 页篇幅隆重讲解了 jQuery(“Chapter 19. The jQuery Library”)。jQuery 从此走向鼎盛和辉煌。后来,随着前端交互越来越重和移动应用的普及,jQuery UI、jQuery Mobile 相继面世。时至今日,jQuery 仍然在支撑着数以千万计各种规模网站的运作——尽管聚光灯下已经不常看到她的身影。

最近 10 年,是“前端行业”有史以来发展最快的 10 年。

移动社交时代的到来不仅没有让桌面 Web 失色,反倒刺激了 Web 标准的迅猛改进。HTML5 不仅带来了极大的向后兼容性,也带来了更丰富的原生 DOM API。CSS 从 CSS3 开始走上模块化的快车道,文本样式、排版布局、媒体查询,各种新模块让人目不暇接。

各大主流浏览器也在快速跟进,Firefox、Chrome、Opera、Safari、IE 乃至 Edge,都在积极重构甚至重写内核,争做支持 Web 标准的“楷模”。在这个大背景下,各大互联网公司不断调高兼容的 IE 版本号,从 8 到 9 到 10,再到 11。

当然,还有 ECMAScript 语言标准。自从划时代的 ES6(ECMAScript 2015)发布之后,JavaScript 终于真正开始摆脱“玩具”语言的尴尬境地。更重要的,从 ES6 起,ECMAScript 也进入了快速迭代、每年发一版的节奏。ES7、ES8,以及 ES9,每次都会给这门语言注入更强大的语言特性。

与此同时,Node.js 和 Babel 等服务端运行时及转译工具的出现,也让前端工程化,以及向传统工业级软件开发最佳实践靠拢的速度日益加快。

谷歌主打 SPA(Single Page Application,单页应用)的 Angular 终于一枝独秀。不久,脸书推出的“在 JS 里写 HTML 一样优雅”的 React 则一路高歌猛进。最终,集各家所长且简单易用的 Vue 横空出世。

前端开发已经从后“刀耕火种”时代的“农业文明”,逐渐进化为以大规模、可扩展、规范化、自动化为特征的准“工业文明”。

俗话说:“皮之不存,毛将焉附。”随着时代变迁、技术进步,jQuery 赖以存在的环境正逐渐消失。如前所述,新的环境催生了一批框架新秀。曾经辉煌的 jQuery 终于走到了可以华丽谢幕的时刻。

注:以上文章部分摘取自知乎文章:再见 jQuery,我的老朋友。另外推荐一篇文章 jQuery 都过时了,那我还学它干嘛?

对于小白来说,还是可以简单的学一下 jQuery 的,因为 jQuery 真的很简单,甚至都不需要你会多少 JavaScript,你就可以学会,我们可以简单的学一下 jQuery 的思想,有利于我们去学习现在主流的三大框架:vue,react,angular。而且虽然 jQuery 已经渐渐的退出了历史舞台,新写的项目都很少会再使用 jQuery 了,但是其实很多大公司的一些老项目还是有用到 jQuery 的,不要以为大厂的技术栈就一定会很新很新,其实大厂会有很多老项目需要维护的,这个时候就算你懂前端所有的新技术,但是在大厂你负责的项目可能需要你对 jQuery 有深入的理解,这样你才能维护好这个项目。而创业公司为了快速适应市场,追求的是产品开发效率,vue,react 等则极大的提高了开发效率。在竞争日益激烈的互联网环境下,多学点东西总是没坏处的,而且它真的很简单,我们花了几天来学习一下又有何不可?简历上也能多写一项会的技能。

  • jQuery:我们考虑如何操作 DOM,jQuery 考虑如何让我们更方便地操作 DOM。
  • vue 和 React:我们考虑如何操作数据,框架考虑如何将改变后的数据更新到界面。

这里贴一张网络上的搞笑图:

JQuery - 图2

四、配置 jQuery 环境

进入 jQuery 的官方网站 http://jquery.com/,可以下载最新的 jQuery 文件到本地,然后再引入到项目即可。官方网站如下所示:

JQuery - 图3

引入代码示例:

  1. <head>
  2. <script type="text/javascript" src="jquery.js"></script>
  3. </head>

注意:这里的路径位置,请大家根据实际的情况自行调整。另外官方网站有两个版本的 jQuery 可供下载:一份是精简过的,另一份是未压缩的(供调试或阅读),请大家根据自己的需要自行选择下载。实验楼课程中可以通过命令下载:

  1. wget https://labfile.oss.aliyuncs.com/courses/22/jquery-3.3.1.js

当然如果我们不想把 jQuery 下载到本地,也可以使用 Google 的 CDN 或者使用 Microsoft 的 CDN:

使用 Google 的 CDN:

Google CDN 国内已经无法访问,以下内容仅作演示。

  1. <head>
  2. <script
  3. type="text/javascript"
  4. src="http://ajax.googleapis.com/ajax/libs
  5. /jquery/1.4.0/jquery.min.js"
  6. ></script>
  7. </head>

使用 Microsoft 的 CDN:

  1. <head>
  2. <script
  3. type="text/javascript"
  4. src="http://ajax.microsoft.com/ajax/jquery
  5. /jquery-1.4.min.js"
  6. ></script>
  7. </head>

注:实验楼的环境中不能连外网,所以大家本地可以使用 CDN 的方式,实验楼环境下,通过前面的命令下载下来然后引入的方式来使用。

五、jQuery 语法

jQuery 语法是为 HTML 元素的选取编制的,可以对元素执行某些操作。

基础语法是:

  1. $(selector).action();
  • 美元符号 $ 定义 jQuery。
  • 选择符(selector)“查询”和“查找” HTML 元素。
  • jQuery 的 action() 执行对元素的操作。

另外需要注意的是:在 jQuery 库中 $ 符号就是 jQuery 的一个简写形式,例如 $("#syl")jQuery("#syl") 是等价的,$.ajaxjQuery.ajax 是等价的,如果没有特别说明,程序中的 $ 符号都是 jQuery 的一个简写形式。

5.1 文档就绪函数

所有 jQuery 函数位于一个 document ready 函数中:

  1. $(document).ready(function(){
  2. });
  3. // 可以简写成
  4. $(funciton(){
  5. });

这是为了防止文档在完全加载(就绪)之前运行 jQuery 代码。如果在文档没有完全加载之前就运行函数,操作可能失败。下面是两个具体的例子:

  • 试图隐藏一个不存在的元素。
  • 获得未完全加载的图像的大小。

上面的这段代码其实有点类似于传统 JavaScript 中的 window.onload 方法,不过它们还是有一些区别的,简单对比如下所示:

window.onload $(doucment).ready()
执行时机 必须等待网页中所有的内容加载完毕后才能执行(包括图片) 网页中所有 DOM 结构绘制完毕后就执行,可能 DOM 元素关联的东西并没有加载完
编写个数 不能同时编写多个。 能同时编写多个。

编写个数的意思就是:

  1. window.onload = function () {
  2. alert("test1");
  3. };
  4. window.onload = function () {
  5. alert("test2");
  6. };
  7. //结果只会输出 test2。
  8. $(document).ready(function () {
  9. alert("test1");
  10. });
  11. $(document).ready(function () {
  12. alert("test2");
  13. });
  14. //结果两次都输出

5.2 编写我们的第一个 jQuery 程序

例子:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <!-- Google 的 CDN 的方式加载jQuery,请大家自行修改为本地 -->
  7. <script
  8. type="text/javascript"
  9. src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js"
  10. ></script>
  11. </head>
  12. <body>
  13. <script type="text/javascript">
  14. //等待dom元素加载完毕
  15. $(document).ready(function () {
  16. //弹出一个框:显示hello syl
  17. alert("hello syl");
  18. });
  19. </script>
  20. </body>
  21. </html>

请大家将加载 jQuery 的 Google 的 CDN 改为我们之前讲到的引入本地的 jQuery 文件,请大家将它下载下来然后做一个替换,因为在环境内无法访问到这些 CDN,之后的实验中同理,不再赘述。

修改内容为,将<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js"></script>修改为<script type="text/javascript" src="jquery.min.js"></script>。这里需要使用前面的命令,将 jquery.min.js 下载到与代码文件同一路径目录下。

运行效果为:

JQuery - 图4

六、jQuery 代码风格

良好的代码风格使得代码更加具有可读性,适当的注释代码,对于日后代码的维护也是非常有利的。来看个例子:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery.min.js"></script>
  7. </head>
  8. <body>
  9. <div class="box">
  10. <ul class="menu">
  11. <li class="level1">
  12. <a href="#">春天</a>
  13. <ul class="level2">
  14. <li>春意盎然</li>
  15. <li>春意盎然</li>
  16. <li>春意盎然</li>
  17. <li>春意盎然</li>
  18. </ul>
  19. </li>
  20. <li class="level1">
  21. <a href="#">夏天</a>
  22. <ul class="level2">
  23. <li>夏日炎炎</li>
  24. <li>夏日炎炎</li>
  25. <li>夏日炎炎</li>
  26. <li>夏日炎炎</li>
  27. </ul>
  28. </li>
  29. <li class="level1">
  30. <a href="#">秋天</a>
  31. <ul class="level2">
  32. <li>秋高气爽</li>
  33. <li>秋高气爽</li>
  34. <li>秋高气爽</li>
  35. <li>秋高气爽</li>
  36. </ul>
  37. </li>
  38. </ul>
  39. </div>
  40. <script type="text/javascript">
  41. //等待dom元素加载完毕
  42. $(document).ready(function () {
  43. $(".level1>a").click(function () {
  44. $(this)
  45. .addClass("current")
  46. .next()
  47. .show()
  48. .parent()
  49. .siblings()
  50. .children("a")
  51. .removeClass("current")
  52. .next()
  53. .hide();
  54. return false;
  55. });
  56. });
  57. </script>
  58. </body>
  59. </html>

代码很简单,我们没有加入 css 样式这些,主要还是讲解 jQuery,运行效果为:

JQuery - 图5

简单解释一下这段代码,当鼠标点击到 a 标签的时候给其添加一个名为 current 的 class,然后调用 next() 和 show() 将其后面的元素显示出来,然后调用 parent()、siblings()、children(“a”) 将它的父辈的同辈元素的内部的子元素 a 都去掉一个名为 current 的 class (removeClass("current")),并且将紧邻它们后面的元素都隐藏。

这就是 jQUery 的强大的链式操作,一行代码就完成了我们导航栏的功能,大家可以试着去写一下原生的 JavaScript 代码,看看需要写多少行,这也就是我们 jQuery 的魅力所在。当然上面的那些方法看不懂也没关系,后面都会讲解的。不过为了进一步改善代码的可读性和可维护性,推荐一种写法:

  1. $(document).ready(function () {
  2. $(".level1>a").click(function () {
  3. $(this)
  4. .addClass("current") //给当前元素添加"current"样式
  5. .next()
  6. .show() //下一个元素显示
  7. .parent()
  8. .siblings()
  9. .children("a")
  10. .removeClass("current") //父元素的同辈元素的子元素a移除"current"样式
  11. .next()
  12. .hide(); //它们的下一个元素隐藏
  13. return false;
  14. });
  15. });

也就是说适当的换行和添加注释可以让我们对代码作用一目了然,增加代码的可读性,便于日后的维护,提高开发效率。

七、jQuery 对象和 DOM 对象

7.1 DOM 对象

DOM (Document Object Model)对象,也就是我们经常说的文档对象模型,每一份 DOM 都可以表示成一棵 DOM 树:

JQuery - 图6

比如这样的一段代码:

  1. <h1></h1>
  2. <p></p>
  3. <ul>
  4. <li></li>
  5. </ul>

h1,p,ul 以及 li 标签都是 DOM 元素节点,我们可以通过 JavaScript 中的 document.getElementById()document.getElementsByTagName() 等来获取元素节点,像这样获取的 DOM 元素就是 DOM 对象,DOM 对象可以使用 JavaScript 中的方法,比如:

  1. var domObj = document.getElementById("id"); //获取DOM对象
  2. var objHtml = domObj.innerHTML; //使用JavaScript中的属性innerHTML

7.2 jQuery 对象

jQuery 对象就是通过 jQuery 包装 DOM 对象后产生的对象。jQuery 对象是 jQuery 独有的,如果一个对象是 jQuery 对象,那么它就可以使用 jQuery 里的方法,比如:

  1. $("#syl").html(); //获取id为syl的元素内的html代码,html()是jQuery中的方法

这段代码等同于:

  1. document.getElementById("syl").innerHTML;

在 jQuery 对象中无法使用 DOM 对象中的任何方法,例如 $("#syl").innerHTML; 之类的写法是错的,可以使用 $("#syl").html(); 之类的 jQuery 方法来代替,同样的道理,DOM 对象也不能使用 jQuery 里的方法,例如:document.getElementById("syl").html();也是会报错的。

注:用 #id 作为选择符取得的是 jQuery 对象而并非 document.getElementById("id"); 所得到的 DOM 对象,两者并不等价。我们一定要从开始就树立这样的一个观念:jQuery 对象和 DOM 对象是有区别的,它们并不是等价的。

jQuery 对象和 DOM 对象之间的相互转换

在讲解 jQuery 对象和 DOM 对象之间的相互转换之前,我们先约定好定义变量的风格,如果获取的是 jQuery 对象,那么我们在变量前面加上 $ 符号,例如:

  1. var $test = jQuery 对象;

如果获取的是 DOM 对象:

  1. var test = DOM 对象;

注:这里加个 只是为了区分变量是 jQuery 对象还是 DOM 对象并不是说所有使用 jQuery 的代码中变量声明都需要只是为了区分变量是jQuery对象还是_D_OM对象并不是说所有使用_j_Query的代码中变量声明都需要。

  1. jQuery 对象转换为 DOM 对象

我们前面说过 jQuery 对象不能使用 DOM 中的方法,但是如果我们又不得不使用 DOM 中的方法呢?比如:对 jQuery 对象所提供的方法不熟悉或者忘了但是知道 DOM 中的方法,自己又很懒不想去查 jQuery 手册或者 jQuery 本身就没有封装我们想要使用的方法。有以下的两种处理方法:

  • [index]:jQuery 对象是一个类似数组的对象,可以通过 [index] 的方法得到对应的 DOM 对象,比如:
  1. var $cr = $("#cr"); //jQuery 对象
  2. var cr = $cr[0]; //DOM 对象
  • 通过 get(index) 方法得到相应的 DOM 对象,比如:
  1. var $cr = $("#cr"); //jQuery 对象
  2. var cr = $cr.get(0); //DOM 对象
  1. DOM 对象转换为 jQuery 对象

对于一个 DOM 对象,只需要用 $() 把 DOM 对象包装起来,就可以获得一个 jQuery 对象了,比如:

  1. var cr = document.getElementById("cr"); //DOM 对象
  2. var $cr = $(cr); //jQuery 对象

注:这里再次强调一次,DOM 对象才能使用 DOM 中的方法,jQuery 对象不可以使用 DOM 中的方法,但 jQuery 对象提供了一套更加完善的工具用于操作 DOM,在后面的学习中,我们都会为大家一一的进行讲解。我们平时用到的 jQuery 对象都是通过 () 函数制造出来的,()函数制造出来的,() 函数就是一个 jQuery 对象的制造工厂。

下面我们来看个例子:

DOM 方式判断复选框是否被选中:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <input type="checkbox" id="cr" /><label for="cr">我已阅读协议</label>
  10. <script type="text/javascript">
  11. //等待dom元素加载完毕
  12. $(document).ready(function () {
  13. var $cr = $("#cr"); //jQuery对象
  14. var cr = $cr[0]; //DOM对象,或者$cr.get(0)
  15. $cr.click(function () {
  16. if (cr.checked) {
  17. //DOM方式判断
  18. alert("你已同意本协议");
  19. }
  20. });
  21. });
  22. </script>
  23. </body>
  24. </html>

JQuery - 图7

jQuery 方式判断复选框是否被选中:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <input type="checkbox" id="cr" /><label for="cr">我已阅读协议</label>
  10. <script type="text/javascript">
  11. //等待dom元素加载完毕
  12. $(document).ready(function () {
  13. var $cr = $("#cr");
  14. $cr.click(function () {
  15. if ($cr.is(":checked")) {
  16. alert("你已同意本协议");
  17. }
  18. });
  19. });
  20. </script>
  21. </body>
  22. </html>

注:上面的例子简单的演示了 DOM 对象和 jQuery 对象的不同,但是最终的运行效果是一样的。

八、解决 jQuery 和其他库的冲突

jQuery 使用 符号作为 jQuery 的简写。如果其他 JavaScript 框架也使用符号作为jQuery的简写。如果其他_J_avaScript框架也使用 符号作为简写怎么办?

其他一些 JavaScript 框架包括:MooTools、Backbone、Sammy、Cappuccino、Knockout、JavaScript MVC、Google Web Toolkit、Google Closure、Ember、Batman 以及 Ext JS。

其中某些框架也使用 $ 符号作为简写(就像 jQuery),如果您在用的两种不同的框架正在使用相同的简写符号,有可能导致脚本停止运行。

jQuery 的团队考虑到了这个问题,并实现了 noConflict() 方法。

noConflict() 方法会释放对 $ 标识符的控制,这样其他脚本就可以使用它了。当然,我们仍然可以通过全名替代简写的方式来使用 jQuery:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <p>这是一个段落。</p>
  10. <button>点我</button>
  11. <script type="text/javascript">
  12. //等待dom元素加载完毕
  13. $.noConflict();
  14. jQuery(document).ready(function() {
  15. jQuery("button").click(function() {
  16. jQuery("p").text("jQuery 仍然在工作!");
  17. });
  18. });
  19. </script>
  20. </body>
  21. </html>

我们也可以创建自己的简写。noConflict() 可返回对 jQuery 的引用,我们可以把它存入变量,以供稍后使用:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <p>这是一个段落。</p>
  10. <button>点我</button>
  11. <script type="text/javascript">
  12. //等待dom元素加载完毕
  13. var jq = $.noConflict();
  14. jq(document).ready(function () {
  15. jq("button").click(function () {
  16. jq("p").text("jQuery 仍然在工作!");
  17. });
  18. });
  19. </script>
  20. </body>
  21. </html>

如果你的 jQuery 代码块使用 简写,并且您不愿意改变这个快捷方式,那么您可以把简写,并且您不愿意改变这个快捷方式,那么您可以把 符号作为变量传递给 ready 方法。这样就可以在函数内使用 $ 符号了,而在函数外,依旧不得不使用 “jQuery”:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <p>这是一个段落。</p>
  10. <button>点我</button>
  11. <script type="text/javascript">
  12. //等待dom元素加载完毕
  13. $.noConflict();
  14. jQuery(document).ready(function ($) {
  15. $("button").click(function () {
  16. $("p").text("jQuery 仍然在工作!");
  17. });
  18. });
  19. </script>
  20. </body>
  21. </html>

运行效果都为:

JQuery - 图8

九、总结

在本节实验中我们主要学习了以下内容:

  • 什么是 jQuery
  • jQuery 特色
  • 为什么要学习 jQuery
  • 配置 jQuery 环境
  • jQuery 语法
  • jQuery 代码风格
  • jQuery 对象和 DOM 对象
  • 解决 jQuery 和其他库的冲突

通过本节的学习我们初步熟悉了 jQuery 的定义以及语法,并且完成了第一个 jQuery 例子的编写,感受到了 jQuery 的魅力所在,下一节我们将学习 jQuery 选择器的内容。

jQuery 选择器

一、实验介绍

1.1 实验内容

本节实验将带领大家学习 jQuery 选择器的使用。

1.2 实验知识点

  • jQuery 选择器是什么
  • jQuery 选择器的优势
  • 基本选择器
  • 层次选择器
  • 表单选择器
  • 过滤选择器

1.3 实验环境

  • Theia: 一款前后端分离的、基于 web 的 云 IDE。
  • Preview 或 Mini Browser:浏览器,右键点击目标 html 文件,选择 open with 下的 Preview 或 Mini Browser 即可在 IDE 中打开浏览器。

1.4 参考链接

二、jQuery 选择器是什么

  • jQuery 中 的选择器完全继承了 CSS 的风格,通过使用 jQuery 选择器,我们可以快速的找到目标 DOM 元素,然后对它们进行一系列操作,学会使用选择器是学习 jQuery 的基础,jQuery 的行为规则都必须在获取到元素后才能生效。
  • jQuery 选择器允许您对 HTML 元素组或单个元素进行操作。
  • jQuery 选择器基于元素的 id、类、类型、属性、属性值等”查找”(或选择)HTML 元素。 它基于已经存在的 CSS 选择器,除此之外,它还有一些自定义的选择器。
  • jQuery 中所有选择器都以美元符号开头:$()
  • jQuery 选择器的写法和 CSS 选择器的写法十分相似,只不过两者的作用效果不同,CSS 选择器找到元素后是添加样式,而 jQuery 选择器找到元素后是添加行为,jQuery 中涉及操作 CSS 样式的部分比单纯的 CSS 功能更为强大,并且拥有跨浏览器的兼容性。

jQuery 选择器的优势

  • 简洁的写法。
  • 支持 CSS1 到 CSS3 选择器。兼容性良好,可以直接使用而无需考虑浏览器的兼容性。
  • 完善的处理机制。使用 jQuery 选择器不仅比使用传统的 DOM 对象方法简洁得多,而且还能避免某些错误,比如:
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <div id="">实验楼</div>
  10. <script type="text/javascript">
  11. document.getElementById("syl").style.color = "red";
  12. </script>
  13. </body>
  14. </html>

运行后是会报错的,这是因为网页中并没有 id 名为 “syl” 的元素,报错如下所示:

JQuery - 图9

改进一下后的代码如下:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <div id="">实验楼</div>
  10. <script type="text/javascript">
  11. if (document.getElementById("syl")) {
  12. document.getElementById("syl").style.color = "red";
  13. }
  14. </script>
  15. </body>
  16. </html>

这样就不会报错了,但是如果要操作的元素很多,对每个元素都进行一次判断,显然是不合理的,不判断的话,以后因为某种原因删除了网页上某个以前使用的元素,再来改也会很麻烦,而使用 jQuery 选择器的话,则不用担心这个问题:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <div id="">实验楼</div>
  10. <script type="text/javascript">
  11. $("#syl").css("color", "red");
  12. </script>
  13. </body>
  14. </html>

另外需要特别注意的是,$('#syl') 获取的永远是对象,即使网页上没有此元素,因为当要用 jQuery 来检查某个元素再网页上是否存在时,不能使用下面的代码:

  1. if ($("#syl")) {
  2. }

而应该根据获取到元素的长度来判断,代码如下所示:

  1. if ($("#syl").length > 0) {
  2. }

或者转化成 DOM 对象来判断,代码如下:

  1. if ($("#syl")[0]) {
  2. }

三、基本选择器

基本选择器是 jQuery 中最常用的选择器,也是最简单的选择器,它通过元素 id、class 和 标签名等来查找 DOM 元素。

(1)ID Selector ("#id") 选择一个具有给定 id 属性的单个元素

对于 ID 选择,jQuery 使用 JavaScript 函数 document.getElementById(),这是非常有效的。当另一个选择是附加到 ID 选择器,比如 h2#pageTitle,在确定作为匹配的元素前,jQuery 执行一个额外的检查。

调用 jQuery() (或 $()) 带上一个选择器作为它的参数,将返回一个 jQuery 对象包含零个或一个 DOM 元素的集合。

每个 id 值在一个文件中只能使用一次。如果多个元素分配了相同的 ID,将只匹配该 ID 选择集合的第一个 DOM 元素。但这种行为不应该发生;有超过一个元素的文件使用相同的 ID 是无效的。

如果 ID 包含点号或冒号,你必须将 这些字符用反斜杠转义。

例子:

选择 id 为 demo 的元素,并为此元素设置长、宽、背景色。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <div id="demo"></div>
  10. <script type="text/javascript">
  11. $(document).ready(function () {
  12. $("#demo").css({
  13. width: "100px",
  14. height: "100px",
  15. "background-color": "red",
  16. });
  17. });
  18. </script>
  19. </body>
  20. </html>

运行效果为:

JQuery - 图10

(2)Class Selector (".class") 选择给定样式类名的所有元素

对于类选择器,如果浏览器支持,jQuery 使用 JavaScript 的原生 getElementsByClassName() 函数来实现。

例子:

选择 class 为 demo 的元素,并为此元素设置长、宽、背景色。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <div class="demo"></div>
  10. <script type="text/javascript">
  11. $(document).ready(function () {
  12. $(".demo").css({
  13. width: "100px",
  14. height: "100px",
  15. "background-color": "red",
  16. });
  17. });
  18. </script>
  19. </body>
  20. </html>

注:运行效果同上。

(3)Element Selector ("element") 根据给定(html)标记名称选择所有的元素

调用 JavaScript 的 getElementsByTagName() 函数,当该表达式使用时返回相应的元素。

例子:

选择所有 div 元素,并为所有元素设置长、宽、背景色。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <div>shiyanlou1</div>
  10. <div>shiyanlou2</div>
  11. <script type="text/javascript">
  12. $(document).ready(function () {
  13. $("div").css({
  14. width: "100px",
  15. height: "100px",
  16. "background-color": "red",
  17. });
  18. });
  19. </script>
  20. </body>
  21. </html>

运行效果为:

JQuery - 图11

(4)All Selector ("*") 选择所有元素

选择页面所有元素,包括 body。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <div>shiyanlou1</div>
  10. <div>shiyanlou2</div>
  11. <script type="text/javascript">
  12. $(document).ready(function () {
  13. $("*").css({
  14. width: "100px",
  15. height: "100px",
  16. "background-color": "red",
  17. });
  18. });
  19. </script>
  20. </body>
  21. </html>

运行效果为:

JQuery - 图12

警告: 除非被它自己使用,否则 * 选择器或通用选择器,其速度是极其慢的。

(5)Multiple Selector ("selector1, selector2, selectorN") 将每一个选择器匹配到的元素合并后一起返回

您可以指定任何数量的选择器组合成一个单一的结果。这个多个表达组合是一种有效的方法来选择不同的元素。因为他们将按在文件的顺序,DOM 元素的顺序在返回的 jQuery 象中可能不相同。另一种选择器组合是 .add() 方法。

例子:

用 “,” 分隔开然后再拼成一个选择器字符串,同时选择多个匹配的选择器的内容 选择页面所有元素,并设置字体大小。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <div>shiyanlou</div>
  10. <a href="https://www.lanqiao.cn/">https://www.lanqiao.cn/</a>
  11. <script type="text/javascript">
  12. $(document).ready(function () {
  13. $("div,a").css({
  14. "font-size": "30px",
  15. });
  16. });
  17. </script>
  18. </body>
  19. </html>

运行效果为:

JQuery - 图13

四、 层次选择器

如果想通过 DOM 元素之间的层次关系来获取特定元素,例如后代元素、子元素、相邻元素和同辈元素等,那么我们可以使用 jQuery 层次选择器。

(1)Descendant Selector ("ancestor descendant")

选中给定的祖先元素的 ancestor 中的所有 descendant 元素(后代元素)。一个元素的后代可能是该元素的一个孩子,孙子,曾孙等。

例子:

选择类名为 demo 的元素的所有后代 a 元素,并设置字体大小。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <div class="demo">
  10. <a href="https://www.lanqiao.cn/">shiyanlou</a>
  11. <div class="innerDemo">
  12. <a href="https://www.lanqiao.cn/">SHIYANLOU</a>
  13. </div>
  14. </div>
  15. <script type="text/javascript">
  16. $(document).ready(function () {
  17. $(".demo a").css({
  18. "font-size": "30px",
  19. });
  20. });
  21. </script>
  22. </body>
  23. </html>

运行效果为:

JQuery - 图14

(2)Child Selector ("parent > child")

选择所有指定“parent”元素中指定的”child”的直接子元素。

作为一个 CSS 选择器,这个子元素组合器被 Safari, Firefox, Opera, Chrome, 和 Internet Explorer 7 及以上版本等现代浏览器支持,但尤其不被 Internet Explorer6 及以下版本支持。然而在 jQuery 中,这个选择器(与其他所有选择器)能在所有支持的浏览器中工作,包括 IE6。

这个子元素组合器(E > F)和(E F)都作为后代组合,但是他们有所不同,更具体的是(E > F)它只会选择第一级的后代。

注:选择的是子元素,注意跟后代元素的区别。

例子:

选择类名为 demo 的子元素 a,并设置字体大小。(此时只有第一个 a 元素的字体会改变)

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <div class="demo">
  10. <a href="https://www.lanqiao.cn/">shiyanlou</a>
  11. <div class="innerDemo">
  12. <a href="https://www.lanqiao.cn/">SHIYANLOU</a>
  13. </div>
  14. </div>
  15. <script type="text/javascript">
  16. $(document).ready(function () {
  17. $(".demo>a").css({
  18. "font-size": "30px",
  19. });
  20. });
  21. </script>
  22. </body>
  23. </html>

运行效果为:

JQuery - 图15

(3)Next Adjacent Selector ("prev + next")

prev 和 next 是两个同级别的元素,选中在 prev 元素后面的 next 元素。

例子:

选中 class 为 demo 后面的 a 元素,并设置字体大小。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <div class="demo">
  10. <div class="demo">shiyanlou</div>
  11. <a href="https://www.lanqiao.cn/">SHIYANLOU</a>
  12. </div>
  13. <script type="text/javascript">
  14. $(document).ready(function () {
  15. $(".demo+a").css({
  16. "font-size": "30px",
  17. });
  18. });
  19. </script>
  20. </body>
  21. </html>

运行效果为: JQuery - 图16

(4)Next Siblings Selector ("prev ~ siblings")

匹配 “prev” 元素之后的所有 兄弟元素。具有相同的父元素,并匹配过滤“siblings”选择器。

prev + nextprev ~ siblings 之间最值得注意的不同点是他们各自的可及之范围。前者只达到紧随的同级元素,后者扩展了该达到跟随其的所有同级元素。

例子:

选中 class 为 demo 的 div 元素后面的所有 a 同辈元素,并设置字体大小。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <div class="demo">demo</div>
  10. <a href="https://www.lanqiao.cn/">shiyanlou</a>
  11. <a href="https://www.lanqiao.cn/">SHIYANLOU</a>
  12. <script type="text/javascript">
  13. $(document).ready(function () {
  14. $(".demo~a").css({
  15. "font-size": "30px",
  16. });
  17. });
  18. </script>
  19. </body>
  20. </html>

运行效果为:

JQuery - 图17

在层次选择器中,第 1 个和第 2 个选择器比较常用,而后面两个因为在 jQuery 里面可以用更加简单的方法来代替,所以使用的几率相对会少些:

  • 可以使用 next() 方法来代替 JQuery - 图18%20%E9%80%89%E6%8B%A9%E5%99%A8%E3%80%82%E6%AF%94%E5%A6%82%20%60#card=math&code=%28%27prev%2Bnext%27%29%20%E9%80%89%E6%8B%A9%E5%99%A8%E3%80%82%E6%AF%94%E5%A6%82%20%60)(“.one + div);$(“.one”).next(“div”);` 是等价的。
  • 可以使用 nextAll() 方法来代替 JQuery - 图19%20%E9%80%89%E6%8B%A9%E5%99%A8%E3%80%82%E6%AF%94%E5%A6%82%20%60#card=math&code=%28%27prevsiblings%27%29%20%E9%80%89%E6%8B%A9%E5%99%A8%E3%80%82%E6%AF%94%E5%A6%82%20%60)(“#prevdiv”);$(“#prev”).nextAll(“div”);` 是等价的。

简单提一下后面要讲解的 siblings() 方法,$("#prev~div"); 选择器只能选择 “prev” 元素后面的同辈 div 元素,而 siblings() 方法与前后位置无关,只要是同辈节点都能匹配。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <div id="">
  10. </div>
  11. <div id="prev">
  12. </div>
  13. <div id="">
  14. </div>
  15. <script type="text/javascript">
  16. $(document).ready(function() {
  17. //选取#prev之后的所有同辈div元素
  18. $("#prev~div").css("background", "#bbffaa");
  19. //同上
  20. $("#prev").nextAll("div").css("background", "#bbffaa");
  21. //选取#prev所有的同辈div元素,无论前后位置
  22. $("#prev").siblings("div").css({
  23. "width": "100px",
  24. "height": "100px",
  25. "border": "1px solid red"
  26. })
  27. });
  28. </script>
  29. </body>
  30. </html>

运行效果为:

JQuery - 图20

五、表单选择器

为了使用户能够更加灵活的操作表单,jQuery 中专门加入了表单选择器,利用这个选择器,我们能够特别方便的获取到表单的某个或某类型的元素。

  • :input 选取所有的 、和 元素。
  • :text 选取所有的单行文本框。
  • :password 选取所有的密码框
  • :radio 选取所有的单选框
  • :checkbox 选取所有的多选框
  • :submit 选取所有的提交按钮
  • :image 选取所有的图像
  • :reset 选取所有的重置按钮
  • :button 选取所有的按钮
  • :file 选取所有的上传域
  • :hidden 选取所有不可见元素

示例:选取所有的 input 元素,并设置高度。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <input text="text" />
  10. <input text="textaera" />
  11. <script type="text/javascript">
  12. $(document).ready(function () {
  13. $(":input").css({
  14. height: "300px",
  15. });
  16. });
  17. </script>
  18. </body>
  19. </html>

运行效果为:

JQuery - 图21

另外需要注意的是 $("#form1 :input")$("#form1 input") 的区别,这里就不过多的说明,大家可以先看自己的理解,然后写个测试页面验证一下。

如果想要获得表单内单行文本框的个数,可以这么写:

  1. //假定已经有一个id名为form1的表单
  2. $("#form1 :text").lenth;

同理,其他的表单选择器的操作与此类似大家可以自行尝试着去写一写体验一番。更多例子可以访问 jQuery 中文官网表单

六、 过滤选择器

过滤选择器主要是通过特定的过滤规则来筛选出所需要的 DOM 元素,过滤规则与 CSS 中的伪类选择器语法相同,即选择器都以一个冒号 : 开头,按照不同的过滤规则,过滤选择器可以分为:

  • 基本过滤选择器
  • 内容过滤选择器
  • 可见性过滤选择器
  • 属性过滤选择器
  • 子元素过滤选择器
  • 表单对象属性过滤选择器

(1)基本过滤选择器

  • :animated Selector 选择所有正在执行动画效果的元素.
  • :eq() Selector 在匹配的集合中选择索引值为 index 的元素。
  • :even Selector 选择索引值为偶数的元素,从 0 开始计数。 也可以查看 odd.
  • :first Selector 选择第一个匹配的元素。
  • :focus Selector 选择当前获取焦点的元素。
  • :gt() Selector 选择匹配集合中所有大于给定 index(索引值)的元素。
  • :header Selector 选择所有标题元素,像 h1, h2, h3 等.
  • :lang() Selector 选择指定语言的所有元素。
  • :last Selector 选择最后一个匹配的元素。
  • :lt() Selector 选择匹配集合中所有索引值小于给定 index 参数的元素。
  • :not() Selector 选择所有元素去除不匹配给定的选择器的元素。
  • :odd Selector 选择索引值为奇数元素,从 0 开始计数。同样查看偶数 even.
  • :root Selector 选择该文档的根元素。
  • :target Selector 选择由文档 URI 的格式化识别码表示的目标元素。

示例:选取所有的 input 元素中的第一个 input 元素,并设置高度。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <input text="text" />
  10. <input text="textaera" />
  11. <script type="text/javascript">
  12. $(document).ready(function () {
  13. $("input:first").css({
  14. height: "300px",
  15. });
  16. });
  17. </script>
  18. </body>
  19. </html>

运行效果为:

JQuery - 图22

想要了解更多基本过滤选择器的实例可以访问jQuery 中文官网基础过滤

(2)内容过滤选择器

内容过滤选择器的过滤规则主要体现在它所包含的子元素或文本内容上。

  • :contains() Selector 选择所有包含指定文本的元素。
  • :empty Selector 选择所有没有子元素的元素(包括文本节点)。
  • :has() Selector 选择元素其中至少包含指定选择器匹配的一个种元素。
  • :parent Selector 选择所有含有子元素或者文本的父级元素。

示例:选取包含文本“shiyanlou”的 div 元素,并设置字体大小。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <div>demo</div>
  10. <div>shiyanlou</div>
  11. <script type="text/javascript">
  12. $(document).ready(function () {
  13. $("div:contains('shiyanlou')").css({
  14. "font-size": "30px",
  15. });
  16. });
  17. </script>
  18. </body>
  19. </html>

运行效果为:

JQuery - 图23

想要了解更多内容过滤选择器的实例可以访问jQuery 中文官网内容过滤

(3)可见性过滤选择器

可见性过滤选择器是根据元素的可见和不可见状态来选择相应的元素。

  • :hidden Selector 选择所有隐藏的元素。
  • :visible Selector 选择所有可见的元素。

示例:选取所有可见的 div 元素,并设置字体大小。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <div>demo</div>
  10. <div>shiyanlou</div>
  11. <script type="text/javascript">
  12. $(document).ready(function () {
  13. $("div:visible").css({ "font-size": "30px" });
  14. });
  15. </script>
  16. </body>
  17. </html>

运行效果为:

JQuery - 图24

注意:在可见性选择器中,需要特别注意的是选择器 :hidden,它不仅包括样式属性 display 为 “none” 的元素,也包括文本隐藏域()和 visibility:hidden; 之类的元素。

想要了解更多可见性过滤选择器的实例可以访问jQuery 中文官网可见性过滤

(4)属性过滤选择器

属性过滤选择器的过滤规则是通过元素的属性来获取相应的元素。

  • Attribute Contains Prefix Selector [name|="value"] 选择指定属性值等于给定字符串或以该字符串为前缀(该字符串后跟一个连字符“-” )的元素。
  • Attribute Contains Selector [name*="value"] 选择指定属性具有包含一个给定的子字符串的元素。(选择给定的属性是以包含某些值的元素)
  • Attribute Contains Word Selector [name~="value"] 选择指定属性用空格分隔的值中包含一个给定值的元素。
  • Attribute Ends With Selector [name$="value"] 选择指定属性是以给定值结尾的元素。这个比较是区分大小写的。
  • Attribute Equals Selector [name="value"] 选择指定属性是给定值的元素。
  • Attribute Not Equal Selector [name!="value"] 选择不存在指定属性,或者指定的属性值不等于给定值的元素。
  • Attribute Starts With Selector [name^="value"] 选择指定属性是以给定字符串开始的元素
  • Has Attribute Selector [name] 选择所有具有指定属性的元素,该属性可以是任何值。
  • Multiple Attribute Selector [name="value"][name2="value2"] 选择匹配所有指定的属性筛选器的元素

示例:选取拥有 class 属性的 div 元素,并设置字体大小。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <div>demo</div>
  10. <div class="shiyanlou">shiyanlou</div>
  11. <script type="text/javascript">
  12. $(document).ready(function () {
  13. $("div[class]").css({
  14. "font-size": "30px",
  15. });
  16. });
  17. </script>
  18. </body>
  19. </html>

运行效果为:

JQuery - 图25

想要了解更多属性过滤选择器的实例可以访问jQuery 中文官网属性过滤

(5)子元素过滤选择器

  • :first-child Selector 选择所有父级元素下的第一个子元素。
  • :first-of-type Selector 选择所有相同的元素名称的第一个兄弟元素。
  • :last-child Selector 选择所有父级元素下的最后一个子元素。
  • :last-of-type Selector 选择的所有元素之间具有相同元素名称的最后一个兄弟元素。
  • :nth-child() Selector 选择的他们所有父元素的第 n 个子元素。
  • :nth-last-child() Selector 选择所有他们父元素的第 n 个子元素。计数从最后一个元素开始到第一个。
  • :nth-last-of-type() Selector 选择的所有他们的父级元素的第 n 个子元素,计数从最后一个元素到第一个。
  • :nth-of-type() Selector 选择同属于一个父元素之下,并且标签名相同的子元素中的第 n 个。
  • :only-child Selector 如果某个元素是其父元素的唯一子元素,那么它就会被选中。
  • :only-of-type Selector 选择所有没有兄弟元素,且具有相同的元素名称的元素。

示例:选取类名为 demo 的元素的第一个子 div 元素,并设置字体大小。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <div class="demo">
  10. <div>shiyanlou</div>
  11. <div>SHIYANLOU</div>
  12. </div>
  13. <script type="text/javascript">
  14. $(document).ready(function () {
  15. $(".demo div:first-child").css({
  16. "font-size": "30px",
  17. });
  18. });
  19. </script>
  20. </body>
  21. </html>

运行效果为:

JQuery - 图26

想要了解更多子元素过滤选择器的实例可以访问jQuery 中文官网子元素过滤

(6)表单对象属性过滤选择器

  • :enabled Selector 选择所有可用的(注:未被禁用的元素)元素。
  • :disabled Selector 选择所有被禁用的元素。
  • :checked Selector 匹配所有勾选的元素。
  • :selected Selector 获取 select 元素中所有被选中的元素。

示例:选择被选中元素,并设置宽度。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <div class="demo">
  10. <input type="checkbox" checked="checked" />
  11. <input type="checkbox" />
  12. </div>
  13. <script type="text/javascript">
  14. $(document).ready(function () {
  15. $("input:checked").css({
  16. width: "300px",
  17. });
  18. });
  19. </script>
  20. </body>
  21. </html>

运行效果为:

JQuery - 图27

注:特别需要注意的是选择器中的空格是不容忽视的,多一个空格或者少一个空格也许得到的结果就截然不同了,比如 $('.test :hidden'); 带空格的是后代选择器,表示选取 class 为 test 的元素里面的隐藏元素,而 $('.test:hidden'); 不带空格的是过滤选择器,表示选取隐藏的 class 为 test 的元素。

七、总结

本节实验我们主要学习了 jQuery 选择器的内容,包含以下知识点:

  • jQuery 选择器是什么
  • jQuery 选择器的优势

Query 中的 DOM 操作

一、实验介绍

1.1 实验内容

本节实验将带领大家学习 jQuery 中的 DOM 操作。

1.2 实验知识点

  • DOM 介绍
  • 查找节点
  • 创建节点
  • 插入节点
  • 删除节点
  • 复制节点
  • 替换节点
  • 包裹节点
  • 属性操作
  • 样式操作
  • 设置和获取 HTML、文本和值
  • 遍历节点
  • CSS-DOM 操作

1.3 实验环境

  • Theia: 一款前后端分离的、基于 web 的 云 IDE。
  • Preview 或 Mini Browser:浏览器,右键点击目标 html 文件,选择 open with 下的 Preview 或 Mini Browser 即可在 IDE 中打开浏览器。

1.4 参考链接

二、jQuery 中的 DOM 操作

下面我们来介绍一下 jQuery 中的 DOM 操作。

2.1 DOM 介绍

文档对象模型(Document Object Model,简称 DOM),是 W3C 组织推荐的处理可扩展标志语言的标准编程接口。DOM 定义了访问 HTML 和 XML 文档的标准。DOM 可以把 HTML 看做是文档树,通过 DOM 提供的 API 可以对树上的节点进行操作。下面我们来看一下 W3C 上的 dom 树:

JQuery - 图28

2.2 查找节点

使用 jQuery 在文档树上查找节点非常容易,我们可以通过第二个实验所学的 jQuery 选择器来完成。

(1)查找元素节点

  1. var $li = $("ol li:eq(0)"); //获取<ol>里第一个<li>节点
  2. var li_txt = $li.text(); //获取第一个<li>元素节点的文本内容
  3. alert(li_txt); //打印文本内容

(2)查找属性节点

利用 jQuery 选择器查找到需要的元素之后,就可以使用 attr() 方法来获取它的各种属性的值。attr() 方法的参数可以是一个,也可以是两个。当参数是一个时,则是要查询的属性的名字,比如:

  1. var $para = $("p"); //获取<p>节点
  2. var p_txt = $para.attr("title"); //获取<p>元素节点属性title
  3. alert(p_txt); //打印title属性值

注:下面属性操作的部分会具体讲解 attr()方法。

2.3 创建节点

(1)创建元素节点

创建元素节点可以用 $(html) 函数。$(html) 方法会根据传入的 HTML 标记字符串,创建一个 DOM 对象,并将这个 DOM 对象包装成一个 jQuery 对象后返回。首先创建一个 li 元素如下所示:

  1. var $li = $("<li></li>"); //创建一个<li>元素

当然上面只是创建出来了,要使用的话,还需要使用 append() 等方法将该元素插入文档中(下面会讲插入节点)。

(2)创建文本节点

创建文本节点就是在创建元素节点时直接把文本内容写出来,然后使用 append() 等方法将它们添加到文档中就可以了,例如:

  1. var $li = $("<li>syl</li>"); //创建一个<li>元素,包括元素节点和文本节点,“syl”就是创建的文本节点

(3)创建属性节点

创建属性节点和创建文本节点类似,也是直接在创建元素节点时一起创建,比如:

  1. var $li = $("<li title='syl'>syl</li>"); //创建一个<li>元素,包括元素节点和文本节点和属性节点,“syl”就是创建的文本节点,title='syl' 就是创建的属性节点

示例:将新建的 li 元素插入到 ul 中

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <ul>
  10. <li>blue</li>
  11. <li>white</li>
  12. <li>red</li>
  13. </ul>
  14. <script type="text/javascript">
  15. $(document).ready(function () {
  16. var li_obj = $("<li>黄色</li>");
  17. $("ul").append(li_obj);
  18. });
  19. </script>
  20. </body>
  21. </html>

运行效果为:

JQuery - 图29

2.4 插入节点

(1) DOM 插入现有元素内:

  • .append() 在每个匹配元素里面的末尾处插入参数内容。
  • .appendTo() 将匹配的元素插入到目标元素的最后面。
  • .html() 获取集合中第一个匹配元素的 HTML 内容 设置每一个匹配元素的 html 内容。
  • .prepend() 将参数内容插入到每个匹配元素的前面(元素内部)。
  • .prependTo() 将所有元素插入到目标前面(元素内)。
  • .text() 得到匹配元素集合中每个元素的合并文本,包括他们的后代设置匹配元素集合中每个元素的文本内容为指定的文本内容。

(2) DOM 插入现有元素外:

  • .after() 在匹配元素集合中的每个元素后面插入参数所指定的内容,作为其兄弟节点。
  • .before() 根据参数设定,在匹配元素的前面插入内容。
  • .insertAfter() 在目标元素后面插入集合中每个匹配的元素(注:插入的元素作为目标元素的兄弟元素)。
  • .insertBefore() 在目标元素前面插入集合中每个匹配的元素(注:插入的元素作为目标元素的兄弟元素)。

注:这些插入节点的方法不仅能将新创建的 DOM 元素插入到文档中,也能对原有的 DOM 元素进行移动。

插入节点示例:将新建的 li 元素插入到 ul 中

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <ul>
  10. <li>blue</li>
  11. <li>white</li>
  12. <li>red</li>
  13. </ul>
  14. <script type="text/javascript">
  15. $(document).ready(function () {
  16. $("<li>yellow</li>").appendTo("ul");
  17. });
  18. </script>
  19. </body>
  20. </html>

运行效果为:

JQuery - 图30

移动节点示例:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <ul>
  10. <li>blue</li>
  11. <li>white</li>
  12. <li>red</li>
  13. <h1>I like</h1>
  14. </ul>
  15. <script type="text/javascript">
  16. $(document).ready(function () {
  17. var $li = $("ul li:eq(1)"); //获取<ul>节点中的第2个<li>元素节点
  18. var $h1 = $("h1"); //获取<h1>节点
  19. $h1.insertBefore($li); //移动节点
  20. });
  21. </script>
  22. </body>
  23. </html>

运行效果为:

JQuery - 图31

想要查看更多关于插入节点的实例,可以访问 jQuery 中文官网 DOM 插入现有元素内jQuery 中文官网 DOM 插入现有元素外

2.5 删除节点

如果文档中某一个元素多余,那么我们可以使用 jQuery 中的 remove(),detach()empty() 方法删除节点。

(1)detach() 方法

从 DOM 中去掉所有匹配的元素。.detach() 方法和 .remove() 一样, 除了 .detach() 保存所有 jQuery 数据而且和被移走的元素相关联。当需要移走一个元素,不久又将该元素插入 DOM 时,这种方法很有用。

例子:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <ul>
  10. <li>blue</li>
  11. <li title="syl">white</li>
  12. <li>red</li>
  13. </ul>
  14. <script type="text/javascript">
  15. $(document).ready(function () {
  16. $("ul li").click(function () {
  17. alert($(this).html());
  18. });
  19. var $li = $("ul li:eq(1)").detach(); //删除元素
  20. $li.appendTo("ul"); //重新追加此元素,发现它之前绑定的事件还在,如果使用remove()方法删除元素的话,那么它之前绑定的事件将失效
  21. });
  22. </script>
  23. </body>
  24. </html>

运行效果为:

JQuery - 图32

(2)empty() 方法

从 DOM 中移除集合中匹配元素的所有子节点。这个方法不接受任何参数。这个方法不仅移除子元素(和其他后代元素),同样移除元素里的文本。因为,根据说明,元素里任何文本字符串都被看做是该元素的子节点。

例子:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <ul>
  10. <li>blue</li>
  11. <li title="syl">white</li>
  12. <li>red</li>
  13. </ul>
  14. <script type="text/javascript">
  15. $(document).ready(function () {
  16. $("ul li:eq(1)").empty(); //获取第二个<li>元素节点后,清除此元素里的内容,注意是元素里
  17. });
  18. </script>
  19. </body>
  20. </html>

JQuery - 图33

注:如果你想删除元素,不破坏他们的数据或事件处理程序(这些绑定的信息还可以在之后被重新添加回来),请使用 .detach()

(3)remove() 方法

将匹配元素集合从 DOM 中删除。(注:同时移除元素上的事件及 jQuery 数据。)和 .empty() 相似。.remove() 将元素移出 DOM。 当我们想将元素自身移除时我们用 .remove(),同时也会移除元素内部的一切,包括绑定的事件及与该元素相关的 jQuery 数据。在要删除元素同时保留数据和事件的情况下,使用 .detach() 来代替。

例子:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <ul>
  10. <li>blue</li>
  11. <li>white</li>
  12. <li>red</li>
  13. </ul>
  14. <script type="text/javascript">
  15. $(document).ready(function () {
  16. var $li = $("ul li:eq(1)").remove(); //获取<ul>节点中的第2个<li>元素节点后,将它从网页中删除
  17. $li.appendTo("ul"); //把刚才删除的节点又重新添加到 <ul> 元素里
  18. //可以直接使用 appendTo() 方法来简化上面的代码
  19. //appendTo() 方法也可以用来移动元素,移动元素时首先将文档上删除此元素,然后讲该元素插入得到文档中的指定节点
  20. //$("ul li:eq(1)").appendTo("ul");
  21. });
  22. </script>
  23. </body>
  24. </html>

运行效果为:

JQuery - 图34

从运行效果来看也验证了我们所说的元素用 remove() 方法删除后,还是可以继续使用的。

另外 remove() 方法也可以通过传递参数来选择性的删除元素。比如:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <ul>
  10. <li>blue</li>
  11. <li title="syl">white</li>
  12. <li>red</li>
  13. </ul>
  14. <script type="text/javascript">
  15. $(document).ready(function () {
  16. $("ul li").remove("li[title!=syl]"); //将<li>元素中属性title不等于'syl'的<li>元素删除
  17. });
  18. </script>
  19. </body>
  20. </html>

运行效果为:

JQuery - 图35

想要了解更多关于删除节点的例子,可以访问 jQuery 中文官网 DOM 移除

2.6 复制节点

复制节点可以通过 clone() 方法来实现, 当 clone() 中传递了参数 true 时,代表复制元素的同时复制其所绑定的元素。

示例:点击 li 元素即可复制其本身到 ul 中

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <ul>
  10. <li>blue</li>
  11. <li title="syl">white</li>
  12. <li>red</li>
  13. </ul>
  14. <script type="text/javascript">
  15. $(document).ready(function () {
  16. $("ul li").on("click", function () {
  17. $(this).clone().appendTo("ul");
  18. });
  19. });
  20. </script>
  21. </body>
  22. </html>

运行效果为:

JQuery - 图36

想要了解更多关于复制节点的操作,可以访问 jQuery 中文官网 复制元素

2.7 替换节点

  • .replaceAll() 用集合的匹配元素替换每个目标元素。
  • .replaceWith() 用提供的内容替换集合中所有匹配的元素并且返回被删除元素的集合。

注:.replaceAll().replaceWith() 功能一样,但是目标和源相反。

示例:替换 p 元素

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <p>shiyanlou</p>
  10. <script type="text/javascript">
  11. $(document).ready(function () {
  12. $("p").replaceWith("<p>SHIYANLOU</p>");
  13. //注释代码与上面的代码作用一样
  14. // $("<p>SHIYANLOU</p>").replaceAll("p");
  15. });
  16. </script>
  17. </body>
  18. </html>

运行效果为:

JQuery - 图37

想要了解更多关于替换节点的例子,可以访问 jQuery 中文官网 DOM 替换

2.8 包裹节点

(1) wrap() 方法

每个匹配的元素外层包上一个 html 元素。.wrap() 函数可以接受任何字符串或对象,可以传递给 $() 工厂函数来指定一个 DOM 结构。这种结构可以嵌套了好几层深,但应该只包含一个核心的元素。每个匹配的元素都会被这种结构包裹。该方法返回原始的元素集,以便之后使用链式方法

例子:

用一个有边框的 DIV 将 P 元素包裹起来

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <p>shiyanlou</p>
  10. <p>shiyanlou</p>
  11. <script type="text/javascript">
  12. $(document).ready(function () {
  13. $("p").wrap("<div style='border:1px red solid;'></div>");
  14. });
  15. </script>
  16. </body>
  17. </html>

运行效果为:

JQuery - 图38

(2)wrapAll() 方法

在所有匹配元素外面包一层 HTML 结构。.wrapAll() 函数可以接受任何字符串或对象,可以传递给 \$() 工厂函数来指定一个 DOM 结构。这种结构可以嵌套多层,但是最内层只能有一个元素。所有匹配元素将会被当作是一个整体,在这个整体的外部用指定的 HTML 结构进行包裹。

注:该元素会将所有匹配的元素用一个元素来包裹,它不同于 wrap() 方法,wrap() 方法是将所有的元素进行单独的包裹。

例子:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <p>shiyanlou</p>
  10. <p>shiyanlou</p>
  11. <script type="text/javascript">
  12. $(document).ready(function () {
  13. $("p").wrapAll("<div style='border:1px red solid;'></div>");
  14. });
  15. </script>
  16. </body>
  17. </html>

运行效果为:

JQuery - 图39

(3)wrapInner() 方法

在匹配元素里的内容外包一层结构。.wrapInner() 函数可以接受任何字符串或对象,可以传递给 $() 工厂函数来指定一个 DOM 结构。这种结构可以嵌套多层,但是最内层只能有一个元素。每个匹配元素的内容都会被这种结构包裹。wrapInner() 方法将每一个匹配的元素的子内容(包括文本节点)用其他结构化的标记包裹起来。

例子:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <p>shiyanlou</p>
  10. <p>shiyanlou</p>
  11. <script type="text/javascript">
  12. $(document).ready(function () {
  13. $("p").wrapInner("<div style='border:1px red solid;'></div>");
  14. });
  15. </script>
  16. </body>
  17. </html>

运行效果为:

JQuery - 图40

想要了解更多关于包裹节点的实例,可以访问 jQuery 中文官网 DOM 插入并包裹现有内容

2.9 属性操作

在 jQuery 中, attr() 方法用来获取和设置元素的属性,removeAttr() 方法用来删除元素属性。

(1)获取元素属性

如果要获取元素的属性,那么只需要给 attr() 方法传递一个参数,即属性名称。

示例:获取 P 元素的 class 属性值,并追加到 div 中

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <p class="shiyanlou-class">shiyanlou</p>
  10. <div></div>
  11. <script type="text/javascript">
  12. $(document).ready(function () {
  13. var p_class = $("p").attr("class");
  14. $("div").append(p_class);
  15. });
  16. </script>
  17. </body>
  18. </html>

运行效果为:

JQuery - 图41

(2)设置元素属性

如果需要设置元素的属性值,也可以使用 attr() 方法,不同的是,需要传递两个参数即属性名称和对应的值。

示例:设置 div 的 class 值

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. <style type="text/css">
  8. .demo {
  9. border: 1px solid red;
  10. height: 100px;
  11. }
  12. </style>
  13. </head>
  14. <body>
  15. <div>shiyanlou</div>
  16. <script type="text/javascript">
  17. $(document).ready(function () {
  18. $("div").attr("class", "demo");
  19. });
  20. </script>
  21. </body>
  22. </html>

运行效果为:

JQuery - 图42

如果需要一次性为同一个元素设置多个元素,可以使用下面的代码来实现:

  1. $("div").attr({ class: "demo", name: "test" }); //将一个 “名/值” 形式的对象设置为匹配元素的属性

(3)删除元素属性

removeAttr() 方法来实现删除元素属性。.removeAttr() 方法使用原生的 JavaScript removeAttribute() 函数,但是它的优点是可以直接在一个 jQuery 对象上调用该方法,并且它解决了跨浏览器的属性名不同的问题。

示例:删除 div 的 class

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. <style type="text/css">
  8. .demo {
  9. border: 1px solid red;
  10. height: 100px;
  11. }
  12. </style>
  13. </head>
  14. <body>
  15. <div class="demo">shiyanlou</div>
  16. <script type="text/javascript">
  17. $(document).ready(function () {
  18. $("div").removeAttr("class");
  19. });
  20. </script>
  21. </body>
  22. </html>

运行效果为:

JQuery - 图43

想要了解更多关于属性操作的例子,可以访问 jQuery 中文官网通用属性操作

2.10 样式操作

(1)获取样式和设置样式

HTML 代码:

  1. <p class="syl">实验楼</p>

其中 class 也是 p 标签的属性,因此获取 class 和 设置 class 都可以使用我们前面所学的 attr() 方法。比如:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. <style type="text/css">
  8. .syl {
  9. background-color: red;
  10. }
  11. .SYL {
  12. background-color: yellow;
  13. }
  14. </style>
  15. </head>
  16. <body>
  17. <p class="syl">实验楼</p>
  18. <script type="text/javascript">
  19. $(document).ready(function() {
  20. var p_class = $("p").attr("class");//获取<p>元素的class
  21. console.log(p_class);//打印值为syl
  22. $("p").attr("class","SYL");//替换class样式,如果想要添加可以使用addClass()方法
  23. });
  24. </script>
  25. </body>
  26. </html>

运行效果为:

JQuery - 图44

(2)追加样式

.addClass() 方法为每个匹配的元素添加指定的样式类名,值得注意的是这个方法不会替换一个样式类名。它只是简单的添加一个样式类名到元素上。

示例:为 div 追加一个新样式 another

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. <style type="text/css">
  8. .demo {
  9. border: 1px solid red;
  10. height: 100px;
  11. }
  12. .another {
  13. width: 50%;
  14. }
  15. </style>
  16. </head>
  17. <body>
  18. <div class="demo">shiyanlou</div>
  19. <script type="text/javascript">
  20. $(document).ready(function () {
  21. $("div").addClass("another");
  22. });
  23. </script>
  24. </body>
  25. </html>

运行效果为:

JQuery - 图45

注:上例中 div 元素同时拥有两个 class 值,即 “demo” 和 “another” ,在 css 中有以下两条规定:

  • 如果给一个元素添加了多个 class 值,那么就相当于合并了它们的样式。
  • 如果有不同的 class 设定了同一样式属性,则后者覆盖前者。

(3)移除样式

.removeClass() 方法移除集合中每个匹配元素上一个,多个或全部样式。如果一个样式类名作为一个参数,只有这样式类会被从匹配的元素集合中删除 。如果没有样式名作为参数,那么所有的样式类将被移除。

示例:移除 div 的 another 样式

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. <style type="text/css">
  8. .demo {
  9. border: 1px solid red;
  10. height: 100px;
  11. }
  12. .another {
  13. width: 50%;
  14. }
  15. </style>
  16. </head>
  17. <body>
  18. <div class="demo another">shiyanlou</div>
  19. <script type="text/javascript">
  20. $(document).ready(function () {
  21. $("div").removeClass("another");
  22. });
  23. </script>
  24. </body>
  25. </html>

运行效果为:

JQuery - 图46

注:如果要删除多个 class 值,我们可以以空格的方式删除多个 class 名,比如:

  1. $("div").removeClass("another demo"); //删除 another 类和 demo 类

如果 removeClass() 方法不带参数,就会将 class 的值全部删除,比如:

  1. $("div").removeClass(); //删除<div>元素的所有class

(4)切换样式

.toggleClass() 在匹配的元素集合中的每个元素上添加或删除一个或多个样式类,取决于这个样式类是否存在或值切换属性。即:如果存在(不存在)就删除(添加)一个类。

例子:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. <style type="text/css">
  8. .main {
  9. color: red;
  10. }
  11. </style>
  12. </head>
  13. <body>
  14. <p>实验楼</p>
  15. <button class="btn1">切换段落的 "main" 类</button>
  16. <script type="text/javascript">
  17. $(document).ready(function () {
  18. $("button").click(function () {
  19. $("p").toggleClass("main");
  20. });
  21. });
  22. </script>
  23. </body>
  24. </html>

运行效果为:

JQuery - 图47

(5)判断是否含有某个样式

.hasClass() 可以用来判断元素中是否含有某个 class,如果有则返回 true,否则返回 false。比如:

  1. $("p").hasClass("another");

想要查看更多关于样式操作的实例,可以访问 jQuery 中文官网 class 属性

2.11 设置和获取 HTML、文本和值

(1).html() 方法

.html() 获取集合中第一个匹配元素的 HTML 内容 或 设置每一个匹配元素的 html 内容。类似于我们原生 JavaScript 中的 innerHTML 属性。

示例:获取 div 中的 HTML 内容

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <div><p>实验楼</p></div>
  10. <script type="text/javascript">
  11. $(document).ready(function () {
  12. var div_html = $("div").html(); //获取<div>元素的HTML代码
  13. alert(div_html); //打印<div>元素的HTML代码
  14. });
  15. </script>
  16. </body>
  17. </html>

运行效果为:

JQuery - 图48

示例:设置 div 中的 HTML 内容

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <div></div>
  10. <script type="text/javascript">
  11. $(document).ready(function () {
  12. $("div").html("<span>shiyanlou</span>");
  13. });
  14. </script>
  15. </body>
  16. </html>

运行效果为:

JQuery - 图49

(2).text() 方法

.text() 得到匹配元素集合中每个元素的文本内容结合,包括他们的后代,或设置匹配元素集合中每个元素的文本内容为指定的文本内容。类似于 JavaScript 中的 innerText 属性。

示例:获取 div 元素的文本内容

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <div>实验楼</div>
  10. <script type="text/javascript">
  11. $(document).ready(function () {
  12. var p_text = $("div").text();
  13. alert(p_text);
  14. });
  15. </script>
  16. </body>
  17. </html>

运行效果为:

JQuery - 图50

示例:设置 div 中的文本内容

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <div>实验楼</div>
  10. <script type="text/javascript">
  11. $(document).ready(function () {
  12. $("div").text("shiyanlou");
  13. });
  14. </script>
  15. </body>
  16. </html>

运行效果为:

JQuery - 图51

(3).val() 方法

.val() 获取匹配的元素集合中第一个元素的当前值或设置匹配的元素集合中每个元素的值。类似于 JavaScript 中的 value 属性。.val() 方法主要用于获取表单元素的值,比如 input, select 和 textarea。对于 <select multiple="multiple"> 元素, .val() 方法返回一个包含每个选择项的数组,如果没有选择性被选中,它返回 null。

示例:设置输入框的值

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <input type="text" value="" />
  10. <script type="text/javascript">
  11. $(document).ready(function () {
  12. $("input").val("shiyanlou");
  13. });
  14. </script>
  15. </body>
  16. </html>

运行效果为:

JQuery - 图52

2.12 遍历节点

(1).children() 方法

获得匹配元素集合中每个元素的子元素,选择器选择性筛选。

鉴于一个 jQuery 对象,表示一个 DOM 元素的集合,.children()方法允许我们通过在 DOM 树中对这些元素的直接子元素进行搜索,并且构造一个新的匹配元素的 jQuery 对象。.find().children() 方法是相似的,但后者只是针对向下一个级别的 DOM 树。还要注意的是和大多数的 jQuery 方法一样,.children() 不返回文本节点;让所有子元素包括使用文字和注释节点,建议使用 .contents()

.children() 方法选择性地接受同一类型选择器表达式,我们可以将参数传递给 $() 函数。如果提供选择器参数,将过滤出来的元素,测试它们是否匹配。

示例:获取 ul 的子元素 li 的文本值

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <ul>
  10. <li>blue</li>
  11. <li>white</li>
  12. <li>red</li>
  13. </ul>
  14. <script type="text/javascript">
  15. $(document).ready(function () {
  16. var ul_chlildList = $("ul").children();
  17. for (var i = 0, len = ul_chlildList.length; i < len; i++) {
  18. alert(ul_chlildList[i].innerHTML);
  19. }
  20. });
  21. </script>
  22. </body>
  23. </html>

运行效果为:

JQuery - 图53

(2).next() 方法

取得匹配的元素集合中每一个元素紧邻的后面同辈元素的元素集合。如果提供一个选择器,那么只有紧跟着的兄弟元素满足选择器时,才会返回此元素。

如果一个 jQuery 代表了一组 DOM 元素,.next() 方法允许我们找遍元素集合中紧跟着这些元素的直接兄弟元素,并根据匹配的元素创建一个新的 jQuery 对象。

该方法还可以接受一个可选的选择器表达式,该选择器表达式可以是任何可传给 $() 函数的选择器表达式。如果每个元素的直接兄弟元素满足所提供的选择器,那么它会保存在新生成的 jQuery 对象中,否则,不会包含该元素。

示例:获取 div 后面紧邻的同辈元素

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <div>shiyanlou</div>
  10. <p>SHIYANLOU</p>
  11. <script type="text/javascript">
  12. $(document).ready(function () {
  13. var div_next = $("div").next();
  14. alert(div_next.text());
  15. });
  16. </script>
  17. </body>
  18. </html>

运行效果为:

JQuery - 图54

(3).prev()

取得一个包含匹配的元素集合中每一个元素紧邻的前一个同辈元素的元素集合。选择性筛选的选择器。

如果提供的 jQuery 代表了一组 DOM 元素,.prev() 方法通过这些元素组合传递到方法构造一个新的 jQuery 对象。

该方法选择性地接受同一类型选择器表达式,我们可以传递给 $() 函数。如果提供了选择器表达式,那么会先测试该元素是否满足匹配的选择器表达式。

示例:获取 p 前面紧邻的同辈元素

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <div>shiyanlou</div>
  10. <p>SHIYANLOU</p>
  11. <script type="text/javascript">
  12. $(document).ready(function () {
  13. var p_prev = $("p").prev();
  14. alert(p_prev.text());
  15. });
  16. </script>
  17. </body>
  18. </html>

运行效果为:

JQuery - 图55

(4).siblings() 方法

获得匹配元素集合中每个元素的兄弟元素,可以提供一个可选的选择器。

如果提供的 jQuery 代表了一组 DOM 元素,.siblings() 方法通过这些元素组合传递到方法构造一个新的 jQuery 对象。

该方法选择性地接受同一类型选择器表达式,我们可以传递给 $() 函数。如果提供了选择器表达式,那么会先测试该元素是否满足匹配的选择器表达式。

示例:改变 p 元素前后所有的同辈元素的颜色

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <div>shiyanlou</div>
  10. <p>SHIYANLOU-P</p>
  11. <div>SHIYANLOU</div>
  12. <script type="text/javascript">
  13. $(document).ready(function () {
  14. $("p").siblings().css("background-color", "red");
  15. });
  16. </script>
  17. </body>
  18. </html>

运行效果为:

JQuery - 图56

(5).parent() 方法

取得匹配元素集合中,每个元素的父元素,可以提供一个可选的选择器。

如果提供的 jQuery 代表了一组 DOM 元素,.parent() 方法允许我们能够在 DOM 树中搜索到这些元素的父级元素,从有序的向上匹配元素,并根据匹配的元素创建一个新的 jQuery 对象。

.parents().parent() 方法是相似的,但后者只是进行了一个单级的 DOM 树查找(注:也就是只查找一层,直接的父元素,而不是更加上级的祖先元素)。此外,$( "html" ).parent() 方法返回一个包含 document 的集合,而 $( "html" ).parents() 返回一个空集合。

该方法还可以接受一个可选的选择器表达式,该选择器表达式可以是任何可传给 $() 函数的选择器表达式。如果提供了选择器表达式,那么会先测试该元素是否满足匹配的选择器表达式。

示例:获取 p 元素的父级元素的 class

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <div class="demo">
  10. <p>SHIYANLOU-P</p>
  11. </div>
  12. <script type="text/javascript">
  13. var p_pa = $("p").parent();
  14. alert(p_pa.attr("class"));
  15. </script>
  16. </body>
  17. </html>

运行效果为:

JQuery - 图57

另外还有两个方法 closest()parents() 方法大家可以了解一下:

  • closest() 方法从元素本身开始,逐级向上级元素匹配,并返回最先匹配的祖先元素。也就是说首先检查当前元素是否匹配,如果匹配则直接返回元素本身,如果不匹配则向上查找父级元素,逐级向上直到找到匹配选择器的元素,如果什么都没找到则返回一个空的 jQuery 对象。
  • parents() 获得集合中每个匹配元素的祖先元素。查找方式和 parent() 方法类似,不同点在于,当它找到第一个父节点时并没有停止查找,而是继续查找,最后返回多个父节点。

想要了解更多关于遍历节点的操作,可以访问 jQuery 中文官网遍历

2.13 CSS-DOM 操作

CSS-DOM 技术简单来说就是读取和设置 style 对象的各种属性。

(1).css()

获取匹配元素集合中的第一个元素的样式属性的值或设置每个匹配元素的一个或多个 CSS 属性。

.css() 方法可以非常方便地获取匹配的元素集合中第一个元素的样式属性值, 对于某些属性而言,浏览器访问样式属性的方式是不同的,该方法对于取得这些属性是非常方便的(例如,某些属性在标准浏览器下是通过的 getComputedStyle() 方法取得的,而在 Internet Explorer 下是通过 currentStyleruntimeStyle 属性取得的)并且,某些特定的属性,不同浏览器的写法不一。举个例子, Internet Explorer 的 DOM 将 float 属性写成 styleFloat 实现,W3C 标准浏览器将 float 属性写成 cssFloat。 为了保持一致性,您可以简单地使用”float”,jQuery 将为每个浏览器返回它需要的正确值。

另外,jQuery 同样可以解析 CSS 和 用 multiple-word 格式化(用横杠连接的词,比如:background-color)的 DOM 属性的不同写法。举个例子:jQuery 能解析 .css('background-color').css('backgroundColor') 并且返回正确的值。不同的浏览器可能会返回 CSS 颜色值在逻辑上相同,但在文字上表现不同,例如: #FFF, #ffffff, 和 rgb(255,255,255)。

简写速写的 CSS 属性(例如: margin, background, border) 是不支持的,例如,如果你想重新获取 margin,可以使用 $(elem).css('marginTop')$(elem).css('marginRight'),其他的也是如此。

从 jQuery 1.9 开始, 传递一个 CSS 的样式属性的数组给 .css() 将返回 属性 - 值 配对的对象。例如,要获取元素 4 个边距宽度值 border-width,你可以使用 $( elem ).css([ "borderTopWidth", "borderRightWidth", "borderBottomWidth", "borderLeftWidth" ]).

示例:获取 div 的背景颜色

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. <style type="text/css">
  8. div {
  9. background-color: red;
  10. }
  11. </style>
  12. </head>
  13. <body>
  14. <div>shiyanlou</div>
  15. <script type="text/javascript">
  16. alert($("div").css("background-color"));
  17. </script>
  18. </body>
  19. </html>

运行效果为:

JQuery - 图58

示例:为 div 设置边框和高度属性

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <div>shiyanlou</div>
  10. <script type="text/javascript">
  11. $("div").css({ border: "1px solid red", height: "100px" });
  12. </script>
  13. </body>
  14. </html>

运行效果为:

JQuery - 图59

对于透明度的设置,可以直接使用 opacity 属性,jQuery 已经处理好了兼容性的问题,比如:

  1. $("p").css("opacity", "0.5");

(2).height().width()

  • .height() 获取匹配元素集合中的第一个元素的当前计算高度值 或 设置每一个匹配元素的高度值。
  • .width() 为匹配的元素集合中获取第一个元素的当前计算宽度值 或 给每个匹配的元素设置宽度。

示例:获取 div 的高度和宽度

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. <style type="text/css">
  8. .demo {
  9. border: 1px solid red;
  10. height: 100px;
  11. width: 200px;
  12. }
  13. </style>
  14. </head>
  15. <body>
  16. <div class="demo">shiyanlou</div>
  17. <script type="text/javascript">
  18. alert($("div").height() + " && " + $("div").width());
  19. </script>
  20. </body>
  21. </html>

运行效果为:

JQuery - 图60

height() 方法也能用来设置元素的高度,如果传递的是一个数字,则默认单位是 px,如果要用其他单位,则必须传递一个字符串,比如:

  1. $("p").height(520);//设置<p>元素的高度值为520px
  2. $("p").height(10rem);//设置<p>元素的高度值为10rem

还可以通过 css 方法来获取高度值:

  1. $(element).css("height");

两者的区别是:css() 方法获取的高度值与样式的设置有关,可能会得到 “auto” ,也可能得到 “10px” 之类的字符串,而 height() 方法获取的高度值则是元素在页面中的实际高度,与样式的设置无关,而且不带单位。

同样的 width 方法也是相类似的,这里就不再重复的讲解了,大家可以自行尝试使用看看效果。

(3)元素定位

  • offset() 方法,在匹配的元素集合中,获取的第一个元素的当前坐标,或设置每一个元素的坐标,坐标相对于文档。这个方法不接受任何参数。.offset() 方法允许我们检索一个元素相对于文档(document)的当前位置。和 .position() 的差别在于:.position() 是相对于相对于父级元素的位移。当通过全局操作(特别是通过拖拽操作)将一个新的元素放置到另一个已经存在的元素的上面时,若要取得这个新的元素的位置,那么使用 .offset() 更合适。.offset() 返回一个包含 top 和 left 属性的对象 。比如:
  1. var p_offset = $("p").offset(); //获取<p>元素的offset()
  2. var p_offsetLeft = p_offset.left; //获取左偏移
  3. var p_offsetTop = p_offset.top; //获取右偏移
  • position() 方法,获取匹配元素中第一个元素的当前坐标,相对于 offset parent 的坐标。(offset parent 指离该元素最近的而且被定位过的祖先元素 ) .position() 方法可以取得元素相对于父元素的偏移位置。与 .offset() 不同, .offset() 是获得该元素相对于 documet 的当前坐标 当把一个新元素放在同一个容器里面另一个元素附近时,用 .position() 更好用。.position()返回一个包含 top 和 left 属性的对象。
  1. var position = $("p").position(); //获取<p>元素的position()
  2. var left = position.left; //获取左偏移
  3. var top = position.top; //获取右偏移
  • scrollTop() 方法和 scrollLeft() 方法,这两个方法的作用是分别获取元素的滚动条距顶端的距离和距左侧的距离。另外可以为这两个方法指定一个参数,控制元素的滚动条滚动到指定位置。比如:
  1. var $p = $("p");
  2. var scrollTop = $p.scrollTop(); //获取元素的滚动条距顶端的距离
  3. var scrollLeft = $p.scrollLeft(); //获取元素的滚动条距左侧的距离
  4. $("textarea").scrollTop(300); //元素的垂直滚动条滚动到指定的位置
  5. $("textarea").scrollLeft(300); //元素的横向滚动条滚动到指定的位置

想要了解更多关于 css 属性的操作可以访问 jQuery 中文官网 CSS 属性

三、总结

本节实验我们学习了 jQuery 中的 DOM 操作,主要知识点如下:

  • DOM 介绍
  • 查找节点
  • 创建节点
  • 插入节点
  • 删除节点
  • 复制节点
  • 替换节点
  • 包裹节点
  • 属性操作
  • 样式操作
  • 设置和获取 HTML、文本和值
  • 遍历节点
  • CSS-DOM 操作

在下一节我们将会学习 jQuery 中的事件和动画。想要了解更多 DOM 操作的知识,可以访问 jQuery 中文官网 DOM 操作

jQuery 中的事件和动画

一、实验介绍

1.1 实验内容

JavaScript 使我们有能力创建动态页面。事件是可以被 JavaScript 侦测到的行为。 网页中的每个元素都可以产生某些可以触发 JavaScript 函数的事件。比方说,我们可以在用户点击某按钮时产生一个 onClick 事件来触发某个函数。事件在 HTML 页面中定义。

注:定义来自搜狗百科。

除了使用传统的 JavaScript 事件来完成我们的交互,也可以使用 jQuery,jQuery 不仅提供了更加优雅的事件处理语法,而且极大的增强了事件处理能力。下面我们将分别学习 jQuery 中的事件和动画。

本节实验将带领大家学习 jQuery 中的事件和动画的操作。

1.2 实验知识点

  • 加载 DOM
  • 事件绑定
  • 合成事件
  • 事件冒泡
  • 事件对象的属性
  • 移除事件
  • 模拟操作
  • show()方法和 hide()方法
  • fadeIn() 方法和 fadeOut() 方法
  • slideUp() 方法和 slideDown() 方法
  • animate()方法
  • 动画回调函数
  • 停止动画和判断是否处于动画状态
  • 其他动画方法

1.3 实验环境

  • Theia: 一款前后端分离的、基于 web 的 云 IDE。
  • Preview 或 Mini Browser:浏览器,右键点击目标 html 文件,选择 open with 下的 Preview 或 Mini Browser 即可在 IDE 中打开浏览器。

1.4 参考链接

二、事件

现在我们来讲解 jQuery 事件。

2.1 加载 DOM

在第一个实验中,我们简单的对比了一下 JavaScript 中原生的 window.onload 方法和 jQuery 中 $(document).ready() 方法的区别,下面我们再详细的对比一下它们之间的区别。

(1)执行时机

window.onload 方法是在网页中所有的元素(包括元素的所有关联文件)完全加载到浏览器后才执行,也就是说这个时候 JavaScript 才可以访问网页中的任何元素。而通过 jQuery 中 $(document).ready() 方法注册的事件处理程序,在 DOM 完全就绪时就可以被调用,也就是说这个时候网页的所有元素对 jQuery 而言都是可以访问的,但是并不意味着这些元素相关联的文件都已经下载完毕了。

(2)多次使用

  1. window.onload = function () {
  2. alert("test1");
  3. };
  4. window.onload = function () {
  5. alert("test2");
  6. };
  7. //结果只会输出 test2。
  8. $(document).ready(function () {
  9. alert("test1");
  10. });
  11. $(document).ready(function () {
  12. alert("test2");
  13. });
  14. //结果两次都输出

(3)简写方式

  1. $(document).ready(function(){
  2. });
  3. // 可以简写成
  4. $(funciton(){
  5. })

另外 (document) 也可以简写成(documen*t)也可以简写成(),当 $() 不带参数时,默认参数就是 “document”,因此也可以简写为:

  1. $().ready(function () {});

2.2 事件绑定

  1. bind() 向元素添加事件处理程序(3.0 版本已经弃用)
  2. on() 向元素添加事件处理程序(`自 jQuery 版本 1.7 起,on() 方法是向被选元素添加事件处理程序的首选方法。`)
  3. one() 向被选元素添加一个或多个事件处理程序。该处理程序只能被每个元素触发一次

on() 方法在被选元素及子元素上添加一个或多个事件处理程序。自 jQuery 版本 1.7 起,on() 方法是 bind()live()delegate() 方法的新的替代品。该方法给 API 带来很多便利,我们推荐使用该方法,它简化了 jQuery 代码库。

注意:

  • 使用 on() 方法添加的事件处理程序适用于当前及未来的元素(比如由脚本创建的新元素)。
  • 如需移除事件处理程序,请使用 off() 方法。
  • 如需添加只运行一次的事件然后移除,请使用 one() 方法。

语法为:

  1. $(selector).on(event,childSelector,data,function)

参数说明:

  • event 必需。表示事件类型,规定要从被选元素移除的一个或多个事件或命名空间。由空格分隔多个事件值,也可以是数组。必须是有效的事件。事件类型包括:blur、focus、load、resize、scroll、unload、click、dbclick、mousedown、mouseup、mousemove、mouseover、mouseout、keydown、keypress 等,也可以为自定义名称。
  • childSelector 可选。规定只能添加到指定的子元素上的事件处理程序(且不是选择器本身,比如已废弃的 delegate() 方法)。
  • data 可选。规定传递到函数的额外数据。
  • function 可选。规定当事件发生时运行的函数。

(1)简单使用

示例:为 li 元素绑定 click 事件

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <title></title>
  6. <script type="text/javascript" src="jquery-3.3.1.js"></script>
  7. </head>
  8. <body>
  9. <ul>
  10. <li>blue</li>
  11. <li>white</li>
  12. <li>red</li>
  13. </ul>
  14. <script type="text/javascript">
  15. $(document).ready(function () {
  16. $("ul li").on("click", function () {
  17. $(this).clone().appendTo("ul");
  18. });
  19. });
  20. </script>
  21. </body>
  22. </html>

运行效果为:

JQuery - 图61

(2)简写绑定事件

clickmouseovermouseout 这类事件,我们经常会用到,jQuery 为此提供了一套简写的方法,使得我们能够减少代码量。

示例:将上节事件绑定的例子简写绑定事件

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
  </head>
  <body>
    <ul>
      <li>blue</li>
      <li>white</li>
      <li>red</li>
    </ul>
    <script type="text/javascript">
      $(document).ready(function () {
        $("ul li").click(function () {
          $(this).clone().appendTo("ul");
        });
      });
    </script>
  </body>
</html>

想要了解更多关于事件绑定的案例,可以访问 jQuery 中文网 绑定事件处理器

2.3 合成事件

hover() 方法的语法结构为:

$(selector).hover(inFunction, outFunction);

参数说明:

  • inFunction 必需。规定 mouseover 事件发生时运行的函数。
  • outFunction 可选。规定 mouseout 事件发生时运行的函数。

hover() 方法用于模拟光标悬停事件。当光标移动到元素上时,会触发指定的第 1 个函数,当光标移出这个元素时,会触发指定的第 2 个函数。

示例:当鼠标移动到 li 上时字体大小变成 24px,移开变为 14px。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
  </head>
  <body>
    <ul>
      <li>blue</li>
      <li>white</li>
      <li>red</li>
    </ul>
    <script type="text/javascript">
      $(document).ready(function () {
        $("ul li").hover(
          function () {
            $(this).css({
              "font-size": "24px",
            });
          },
          function () {
            $(this).css({
              "font-size": "14px",
            });
          }
        );
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图62

此外还有一个 toggle 事件也是合成事件,但是它在 jQuery 1.9 中已经移除,有兴趣了解的同学,可以访问 jQuery 中文网 toggle 事件

2.4 事件冒泡

(1)什么是事件冒泡

当事件发生后,这个事件就要开始传播(从里到外或者从外向里)。为什么要传播呢?因为事件源本身(可能)并没有处理事件的能力,即处理事件的函数(方法)并未绑定在该事件源上。例如我们点击一个按钮时,就会产生一个 click 事件,但这个按钮本身可能不能处理这个事件,事件必须从这个按钮传播出去,从而到达能够处理这个事件的代码中(例如我们给按钮的 onclick 属性赋一个函数的名字,就是让这个函数去处理该按钮的 click 事件),或者按钮的父级绑定有事件函数,当该点击事件发生在按钮上,按钮本身并无处理事件函数,则传播到父级去处理。

注:定义来自于搜狗百科。

来看个例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
  </head>
  <body>
    <div id="content">
      我是外层div元素
      <span>我是内部span元素</span>
      我是外层div元素
    </div>
    <script type="text/javascript">
      $(document).ready(function () {
        $("span").on("click", function () {
          alert("我是内部span元素,我被点击了");
        });
        $("#content").on("click", function () {
          alert("我是外部div元素,我被点击了");
        });
        $("body").on("click", function () {
          alert("我是body元素,我被点击了");
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图63

在点击 span 元素的时候,会触发 span 元素的 click 事件,会输出三条记录,如上图所示,这就是事件冒泡所引起的。span 元素的 click 事件按照以下的顺序冒泡:

  • span
  • div
  • body

之所以称为事件冒泡,是因为事件会按照 DOM 的层次结构像水泡一样不断向上直至顶端。

(2)事件冒泡引发的问题

事件冒泡可能会引起预料之外的结果,比如我们上面的例子中,需求是点击 span 元素,只触发 span 元素的 click 事件,然而 div 元素 和 body 元素的 click 事件也被触发了,因此,我们需要对事件的作用范围进行限制。

  • 事件对象:在程序中使用事件对象非常简单,只需要为函数添加一个参数。比如:
$("element").on("click", function (event) {
  //event 表示事件对象
});
  • 停止事件冒泡:停止事件冒泡可以阻止事件中其他对象的事件处理函数被执行,在 jQuery 中提供了 event.stopPropagation() 方法来停止冒泡。使用 event.isPropagationStopped() 方法来检查指定的事件上是否调用了该方法,如果 event.stopPropagation() 被调用则该方法返回 true,否则返回 false。前面的例子可以改写为:
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
  </head>
  <body>
    <div id="content">
      我是外层div元素
      <span>我是内部span元素</span>
      我是外层div元素
    </div>
    <script type="text/javascript">
      $(document).ready(function () {
        $("span").on("click", function (event) {
          alert("我是内部span元素,我被点击了");
          event.stopPropagation(); //停止事件冒泡
        });
        $("#content").on("click", function (event) {
          alert("我是外部div元素,我被点击了");
          event.stopPropagation(); //停止事件冒泡
        });
        $("body").on("click", function () {
          alert("我是body元素,我被点击了");
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图64

  • 阻止默认行为:网页中的元素都有自己默认的行为。比如单击超链接后会跳转,单击“提交”按钮后表单会提交,有时候我们需要阻止元素的默认行为。在 jQuery 中提供了 event.preventDefault() 方法阻止元素发生默认的行为。使用 event.isDefaultPrevented() 方法来检查指定的事件上是否调用了 preventDefault() 方法。

例子:阻止链接打开 url

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
  </head>
  <body>
    <a href="https://www.lanqiao.cn/">实验楼</a>
    <script type="text/javascript">
      $(document).ready(function () {
        $("a").click(function (event) {
          event.preventDefault();
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图65

另外表单中我们可以使用该方法来阻止表单的提交,比如当用户名为空时,点击提交按钮,出现提示信息让用户输入内容,并且表单不能提交,只有在用户名里输入内容时,才能提交表单。

  • 事件捕获:事件捕获和事件冒泡刚好是两个相反的过程,事件捕获是从最顶端往下开始触发。jQuery 不支持事件捕获,这里简单提一下它们的区别,如果想要使用事件捕获,请直接使用原生的 JavaScript。

2.5 事件对象的属性

jQuery 在遵循 W3C 规范的情况下,对事件对象的常用属性进行了封装,使得事件处理在各大浏览器下都可以正常运行而不需要进行浏览器类型判断。

(1)event.type 获取事件的类型。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
  </head>
  <body>
    <a href="https://www.lanqiao.cn/">实验楼</a>
    <script type="text/javascript">
      $(document).ready(function () {
        $("a").click(function (event) {
          event.preventDefault();
          alert(event.type);
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图66

(2)event.stopPropagation() 方法,防止事件冒泡到 DOM 树上,也就是不触发的任何前辈元素上的事件处理函数。参考上面。JavaScript 中符合 W3C 规范的 stopPropagation() 方法在 IE 浏览器下无效,jQuery 对其进行了封装,使之能兼容各种浏览器。

(3)event.preventDefault() 方法, 如果调用这个方法,默认事件行为将不再触发。参考上面。JavaScript 中符合 W3C 规范的 preventDefault() 方法在 IE 浏览器下无效,jQuery 对其进行了封装,使之能兼容各种浏览器。我们可以用 event.isDefaultPrevented() 来确定这个方法是否(在那个事件对象上)被调用过了。

(4)event.target 属性返回哪个 DOM 元素触发了事件。target 属性可以是注册事件时的元素,或者它的子元素。通常用于比较 event.targetthis 来确定事件是不是由于冒泡而触发的。经常用于事件冒泡时处理事件委托。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
  </head>
  <body>
    <h1>我是标题</h1>
    <p>我是段落</p>
    <button>我是按钮</button>
    <p>
      标题,段落和按钮元素设置了点击事件。分别点击元素查看是哪个元素的事件被触发了。
    </p>
    <div style="color:red;"></div>
    <script type="text/javascript">
      $(document).ready(function () {
        $("p, button, h1").click(function (event) {
          $("div").html("通过 " + event.target.nodeName + " 元素触发。");
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图67

(5)event.pageXevent.pageY 分别获取鼠标相对于文档的左边缘的位置(左边)和鼠标相对于文档的顶部边缘的位置(坐标)。如果没有使用 jQuery,那么在 IE 浏览器中使用 event.x/event.y,而在 Firefox 浏览器中使用 event.pageX/event.pageY,如果页面中有滚动条,则还要加上滚动条的宽度和高度。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
  </head>
  <body>
    <p>鼠标指针在: <span></span></p>

    <script type="text/javascript">
      $(document).ready(function () {
        $(document).mousemove(function (event) {
          $("span").text("X: " + event.pageX + ", Y: " + event.pageY);
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图68

想要了解更多关于事件对象的属性的知识,可以访问 jQuery 中文网事件对象

2.6 移除事件

在绑定事件的过程中,不仅可以为同一个元素绑定多个事件,也可以为多个元素绑定同一个事件。比如:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script type="text/javascript" src="jquery-3.3.1.js"></script>
    </head>
    <body>
        <button>点击按钮</button>
        <div id="test">

        </div>

        <script type="text/javascript">
            $(document).ready(function() {
                $("button").on("click", function() {
                    $('#test').append("<p>我是绑定函数1</p>");
                }).on("click", function() {
                    $('#test').append("<p>我是绑定函数2</p>");
                }).on("click", function() {
                    $('#test').append("<p>我是绑定函数3</p>");
                });

            });
        </script>
    </body>
</html>

运行效果为:

JQuery - 图69

on() 方法绑定事件相对应的 off() 方法用来移除事件。自 jQuery 版本 1.7 起,off() 方法是 unbind()die()undelegate() 方法的新的替代品。该方法给 API 带来很多便利,我们推荐使用该方法,它简化了 jQuery 代码库。

注:如需移除指定的事件处理程序,当事件处理程序被添加时,选择器字符串必须匹配 on() 方法传递的参数。

语法为:

$(selector).off(event,selector,function(eventObj),map)

参数说明:

  • event 必需。规定要从被选元素移除的一个或多个事件或命名空间。由空格分隔多个事件值。必须是有效的事件。
  • selector 可选。规定添加事件处理程序时最初传递给 on() 方法的选择器。
  • function(eventObj) 可选。规定当事件发生时运行的函数。
  • map 规定事件映射 ({event:function, event:function, …}),包含要添加到元素的一个或多个事件,以及当事件发生时运行的函数。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
  </head>
  <body>
    <p>点击这个段落修改它的背景颜色。</p>
    <p>点击一下按钮再点击这个段落( click 事件被移除 )。</p>
    <button>移除 click 事件</button>

    <script type="text/javascript">
      $(document).ready(function () {
        $("p").on("click", function () {
          $(this).css("background-color", "red");
        });
        $("button").click(function () {
          $("p").off("click");
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图70

注:如需添加只运行一次的事件然后移除,请使用 one() 方法。语法为:

$(selector).one(event,data,function)

参数说明:

  • event 必需。规定添加到元素的一个或多个事件。由空格分隔多个事件值。必须是有效的事件。
  • data 可选。规定传递到函数的额外数据。
  • function 必需。规定当事件发生时运行的函数。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
  </head>
  <body>
    <p>这是一个段落 。</p>
    <p>这是另外一个段落。</p>
    <p>点击任意一个段落来修改段落的字体大小,每个段落只会执行一次。</p>

    <script type="text/javascript">
      $(document).ready(function () {
        $("p").one("click", function () {
          $(this).animate({
            fontSize: "+=6px",
          });
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图71

2.7 模拟操作

(1)常用模拟

我们前面的例子中都是需要用户操作,比如 click 事件必须要用户单击才能触发,但有时候,我们需要通过模拟用户操作,来达到单击的效果。在 jQuery 中,可以使用 trigger() 方法来完成模拟操作。语法为:

$(selector).trigger(event,param1,param2,...)

参数说明:

  • event 必需。规定指定元素上要触发的事件。可以是自定义事件,或者任何标准事件。
  • param1,param2,… 可选。传递到事件处理程序的额外参数。额外的参数对自定义事件特别有用。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
  </head>
  <body>
    <p>这是一个段落 。</p>
    <p>这是另外一个段落。</p>
    <p>点击任意一个段落来修改段落的字体大小,每个段落只会执行一次。</p>

    <script type="text/javascript">
      $(document).ready(function () {
        $("p").one("click", function () {
          $(this).animate({
            fontSize: "+=6px",
          });
        });
        $("p").trigger("click");
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图72

(2)触发自定义事件

trigger() 方法不仅能触发浏览器支持的具有相同名称的事件,也可以触发自定义名称的事件。

例子:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script type="text/javascript" src="jquery-3.3.1.js"></script>

    </head>
    <body>
        <p>这是一个段落 。</p>
        <p>这是另外一个段落。</p>
        <p>点击任意一个段落来修改段落的字体大小,每个段落只会执行一次。</p>

        <script type="text/javascript">
            $(document).ready(function() {
                $("p").one("myClick", function() {
                    $(this).animate({
                        fontSize: "+=6px"
                    });
                });
                //触发自定义事件
                $("p").trigger("myClick");
            });
        </script>
    </body>
</html>

运行效果同上。

(3)传递数据

trigger(type,[data]) 方法有两个参数,第 1 个参数是要触发的事件类型,第 2 个参数是要传递给处理函数的附加数据,以数组形式传递。通常可以传递一个参数给回调函数来区别这次事件是代码触发的还是用户触发的。

例子:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script type="text/javascript" src="jquery-3.3.1.js"></script>

    </head>
    <body>
        <button id="btn">点击我</button>
        <div id="test"></div>

        <script type="text/javascript">
            $(document).ready(function() {
                $('#btn').on("myClick",function(event,message1,message2){
                    $('#test').append("<p>"+message1+message2+"</p>");
                });
                $('#btn').trigger("myClick",["我的自定义","事件"]);
            });
        </script>
    </body>
</html>

运行效果为:

JQuery - 图73

(4)执行默认操作

trigger() 方法触发事件后,会执行浏览器默认操作。例如:

$("input").trigger("focus");

以上代码不仅会触发为 input 元素绑定的 foucs 事件,也会使 input 元素本身得到焦点(浏览器的默认操作)。如果我们只想触发绑定的 focus 事件,而不想执行浏览器默认操作,我们可以使用 triggerHandler() 方法。它们之间的不同之处有:

  • triggerHandler() 不触发事件的默认行为。(比如表单提交)
  • .trigger() 会操作 jQuery 对象匹配的所有元素,而 .triggerHandler() 只影响第一个匹配元素。
  • .triggerHandler() 创建的事件不会在 DOM 树中冒泡;如果目标元素不直接处理它们,则不会发生任何事情。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
  </head>
  <body>
    <button id="old">.trigger( "focus" )</button>
    <button id="new">.triggerHandler( "focus" )</button><br /><br />
    <p>
      执行 .trigger 后 input 输入框自动获取焦点,触发事件的默认行为,而
      .triggerHandler 仅仅
      执行了指定的事件浏览器并未执行动作,输入框也没有获取焦点。
    </p>
    <input type="text" value="将获取焦点" />
    <script type="text/javascript">
      $(document).ready(function () {
        $("#old").click(function () {
          $("input").trigger("focus");
        });
        $("#new").click(function () {
          $("input").triggerHandler("focus");
        });
        $("input").focus(function () {
          $("<span>获取焦点!</span>").appendTo("body").fadeOut(1000);
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图74

三、动画

通过 jQuery 中的动画方法,我们能够轻松的为我们的页面添加非常棒的视觉效果。

3.1 show()方法和 hide()方法

(1)show() 方法

show() 方法显示隐藏的被选元素。另外需要注意的是 show() 适用于通过 jQuery 方法和 CSS 中 display:none 隐藏的元素(不适用于通过 visibility:hidden 隐藏的元素)。

语法为:

$(selector).show(speed, easing, callback);

参数说明:

  • speed 可选。规定显示效果的速度。可能的值:毫秒,”slow”,”fast”。
  • easing 可选。规定在动画的不同点上元素的速度。默认值为 “swing”。可能的值:”swing” 表示在开头/结尾移动慢,在中间移动快。”linear” 表示匀速移动。提示:扩展插件中提供更多可用的 easing 函数。
  • callback 可选。show() 方法执行完之后,要执行的函数。

注意: 如果使用!important 在你的样式中,比如 display: none !important,如果你希望.show() 方法才能正常工作,必须使用 .css('display', 'block !important') 重写样式。

(2)hide() 方法

show() 方法相对应的 hide() 方法隐藏被选元素。与 CSS 属性 display:none 类似。隐藏的元素不会被完全显示(不再影响页面的布局)。

语法为:

$(selector).hide(speed, easing, callback);

参数说明与 show() 方法一致。只不过是把显示改为了隐藏。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
  </head>
  <body>
    <p>我是测试段落</p>
    <button class="btn1">隐藏</button>
    <button class="btn2">显示</button>
    <script type="text/javascript">
      $(document).ready(function () {
        $(".btn1").click(function () {
          $("p").hide(1000, function () {
            $("p").css("background-color", "yellow");
          });
        });
        $(".btn2").click(function () {
          $("p").show(1000, function () {
            $("p").css("background-color", "red");
          });
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图75

想要了解更多关于 show()方法和 hide()方法的知识,可以访问 jQuery 中文网基本特效

3.2 fadeIn() 方法和 fadeOut() 方法

(1)fadeIn() 方法

fadeIn() 方法通过淡入的方式显示匹配元素。它逐渐改变被选元素的不透明度,从隐藏到可见(褪色效果)。隐藏的元素不会被完全显示(不再影响页面的布局)。该方法通常与 fadeOut() 方法一起使用。

语法:

$(selector).fadeIn(speed, easing, callback);

参数说明同上。

(2)fadeOut() 方法

fadeOut() 方法通过淡出的方式隐藏匹配元素。它逐渐改变被选元素的不透明度,从可见到隐藏(褪色效果)。隐藏的元素不会被完全显示(不再影响页面的布局)。该方法通常与 fadeIn() 方法一起使用。

语法:

$(selector).fadeOut(speed, easing, callback);

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
  </head>
  <body>
    <p>我是测试段落</p>
    <button class="btn1">隐藏</button>
    <button class="btn2">显示</button>
    <script type="text/javascript">
      $(document).ready(function () {
        $(".btn1").click(function () {
          $("p").fadeOut(2000, function () {
            $("p").css("background-color", "yellow");
          });
        });
        $(".btn2").click(function () {
          $("p").fadeIn(2000, function () {
            $("p").css("background-color", "red");
          });
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图76

想要了解更多关于淡入淡出的知识,可以访问 jQuery 中文网渐变

3.3 slideUp() 方法和 slideDown() 方法

(1)slideUp() 方法

slideUp() 方法以滑动方式隐藏被选元素。隐藏的元素不会被完全显示(不再影响页面的布局)。如需以滑动方式显示元素,请查看 slideDown() 方法。

语法为:

$(selector).slideUp(speed, easing, callback);

(2)slideDown() 方法

slideDown() 方法以滑动方式显示被选元素。slideDown() 适用于通过 jQuery 方法隐藏的元素,或在 CSS 中声明 display:none 隐藏的元素(不适用于通过 visibility:hidden 隐藏的元素)。

语法为:

$(selector).slideDown(speed, easing, callback);

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
  </head>
  <body>
    <p>我是测试段落</p>
    <button class="btn1">隐藏</button>
    <button class="btn2">显示</button>
    <script type="text/javascript">
      $(document).ready(function () {
        $(".btn1").click(function () {
          $("p").slideUp(2000, function () {
            $("p").css("background-color", "yellow");
          });
        });
        $(".btn2").click(function () {
          $("p").slideDown(2000, function () {
            $("p").css("background-color", "red");
          });
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图77

想要了解更多关于滑动的知识,可以访问 jQuery 中文网滑动

3.4 animate()方法

在前面我们已经讲了 3 种类型的动画,其中 show() 方法和 hide() 方法会同时修改元素的多个样式属性,即高度,宽度和不透明度。fadeIn() 方法和 fadeOut() 方法只会修改元素的不透明度。slideUp() 方法和 slideDown() 方法只会改变元素的高度。但是这远远不够满足用户的各种需求,因此我们需要使用 animate() 方法。

animate() 方法,用来实现自定义动画。该方法通过 CSS 样式将元素从一个状态改变为另一个状态。CSS 属性值是逐渐改变的,这样就可以创建动画效果。只有数字值可创建动画(比如 "margin:30px")。字符串值无法创建动画(比如 "background-color:red")。

提示:请使用 “+=” 或 “-=” 来创建相对动画。

语法:

$(selector).animate({ params }, speed, callback);

参数说明:

  • params 参数,必需的,定义形成动画的 CSS 属性。
  • speed 参数,可选的,规定效果的时长。它可以取以下值:”slow”、”fast” 或毫秒。
  • callback 参数,可选的,是动画完成后所执行的函数名称。

注:默认情况下,所有 HTML 元素都有一个静态位置,且无法移动。 如需对位置进行操作,比如使用 “top”,“right”,“bottom”,“left” 属性要记得首先把元素的 CSS position 属性设置为 relative、fixed 或 absolute!

(1)简单动画

示例:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <style type="text/css">
      .title {
        position: relative;
        border: 1px solid red;
        height: 100px;
        width: 200px;
      }
    </style>
  </head>
  <body>
    <div class="title">shiyanlou</div>
    <script type="text/javascript">
      $(document).ready(function () {
        $(".title").animate(
          {
            left: "500px",
          },
          3000
        );
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图78

(2)累加、累减动画

使用 “+=” 或 “-=” 来创建相对动画。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <style type="text/css">
      .title {
        position: relative;
        border: 1px solid red;
        height: 100px;
        width: 200px;
      }
    </style>
  </head>
  <body>
    <div class="title">shiyanlou</div>
    <script type="text/javascript">
      $(document).ready(function () {
        $(".title").animate(
          {
            left: "500px",
            height: "+=150px",
            width: "+=150px",
          },
          3000
        );
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图79

(3)多重动画

  • 同时执行多个动画。如上面的例子所示,div 元素在向右滑动的同时,也会放大。
  • 按顺序执行多个动画。我们只需要把上面的代码拆开即可,然后按照顺序写就可以了。
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <style type="text/css">
      .title {
        position: relative;
        border: 1px solid red;
        height: 100px;
        width: 200px;
      }
    </style>
  </head>
  <body>
    <div class="title">shiyanlou</div>
    <script type="text/javascript">
      $(document).ready(function () {
        $(".title").animate(
          {
            left: "500px",
          },
          3000
        );
        $(".title").animate(
          {
            height: "+=150px",
          },
          3000
        );
        $(".title").animate(
          {
            width: "+=150px",
          },
          3000
        );
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图80

因为 animate() 方法都是对同一个 jQuery 对象进行操作,所以也可以改成链式的写法,代码如下:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <style type="text/css">
      .title {
        position: relative;
        border: 1px solid red;
        height: 100px;
        width: 200px;
      }
    </style>
  </head>
  <body>
    <div class="title">shiyanlou</div>
    <script type="text/javascript">
      $(document).ready(function () {
        $(".title")
          .animate(
            {
              left: "500px",
            },
            3000
          )
          .animate(
            {
              height: "+=150px",
            },
            3000
          )
          .animate(
            {
              width: "+=150px",
            },
            3000
          );
      });
    </script>
  </body>
</html>

注:想要了解更多关于 animate() 的知识,可以访问 jQuery 中文网 animate

3.5 动画回调函数

在前面动画参数的说明中我们提到了一个 callback 回调函数,那么它到底是用来干什么的呢?来看个例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <style type="text/css">
      p {
        display: none;
      }
    </style>
  </head>
  <body>
    <button>显示</button>
    <p>我是测试段落</p>
    <script type="text/javascript">
      $(document).ready(function () {
        $("button").click(function () {
          $("p").show(1000);
          $("p").css("background-color", "red");
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图81

使用回调函数:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <style type="text/css">
      p {
        display: none;
      }
    </style>
  </head>
  <body>
    <button>显示</button>
    <p>我是测试段落</p>
    <script type="text/javascript">
      $(document).ready(function () {
        $("button").click(function () {
          $("p").show(1000, function () {
            $("p").css("background-color", "red");
          });
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图82

区别就是如果不使用回调函数,css() 方法并不会加入到动画队列中,而是立即执行,可以使用回调函数 callback 对非动画实现排队。只要把 css() 方法写在最后一个动画的回调函数里面即可。callback 函数适用于 jQuery 中所有的动画效果。

3.6 停止动画和判断是否处于动画状态

(1)停止动画

jQuery stop() 方法用于在动画或效果完成前对它们进行停止。stop() 方法适用于所有 jQuery 效果函数,包括滑动、淡入淡出和自定义动画。

语法:

$(selector).stop( [clearQueue ] [, jumpToEnd ] )

参数说明:

  • clearQueue 参数,可选值,规定是否应该清除动画队列。默认是 false,即仅停止活动的动画,允许任何排入队列的动画向后执行。
  • jumpToEnd 参数,可选值,规定是否立即完成当前动画。默认是 false。

例子:

只停止当前正在进行的动画,停止当前动画后,队列中的下一个动画开始进行:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <style type="text/css">
      #panel,
      #flip {
        padding: 10px;
        text-align: center;
        background-color: #e5eecc;
        border: solid 1px #c3c3c3;
      }

      #panel {
        padding: 20px;
        display: none;
      }
    </style>
  </head>
  <body>
    <button id="stop">停止滑动</button>
    <div id="flip">点我向下滑动面板</div>
    <div id="panel">Hello syl!</div>
    <script type="text/javascript">
      $(document).ready(function () {
        $("#flip").click(function () {
          $("#panel").slideDown(5000);
          $("#panel").slideUp(5000);
        });
        $("#stop").click(function () {
          $("#panel").stop();
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图83

请大家将例子中的 $("#panel").stop(); 改成 $("#panel").stop(true);$("#panel").stop(true,true); 分别看看效果。

(2)判断元素是否处于动画状态

在使用 animate() 方法的时候,要避免动画积累而导致的动画与用户的行为不一致,当用户快速在某个元素上执行 animate() 动画时,就会出现动画积累,解决方法是判断元素是否处于动画状态,如果元素不处于动画状态,才为元素添加新的动画,否则不添加,代码如下:

if (!$(element).is(":animated")) {
  //判断元素是否处于动画状态
  //如果当前没有进行动画,则添加新动画
}

(3)延迟动画

在动画执行的过程中,如果想对动画进行延迟操作,那么可以使用 delay() 方法。

语法为:

$(selector).delay(speed, queueName);

参数说明:

  • speed 可选。规定延迟的速度。可能的值:毫秒,”slow”,”fast”。
  • queueName 可选。规定队列的名称。默认是 “fx”,标准效果队列。

例子:

使用 delay() 方法来设置不同的速度值。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
  </head>
  <body>
    <button>点击按钮,显示多个的 div 框。</button>
    <br /><br />
    <div
      id="div1"
      style="width:90px;height:90px;display:none;background-color:black;"
    ></div>
    <br />
    <div
      id="div2"
      style="width:90px;height:90px;display:none;background-color:green;"
    ></div>
    <br />
    <div
      id="div3"
      style="width:90px;height:90px;display:none;background-color:blue;"
    ></div>
    <br />
    <div
      id="div4"
      style="width:90px;height:90px;display:none;background-color:red;"
    ></div>
    <br />
    <div
      id="div5"
      style="width:90px;height:90px;display:none;background-color:purple;"
    ></div>
    <br />
    <script type="text/javascript">
      $(document).ready(function () {
        $("button").click(function () {
          $("#div1").delay("slow").fadeIn();
          $("#div2").delay("fast").fadeIn();
          $("#div3").delay(800).fadeIn();
          $("#div4").delay(2000).fadeIn();
          $("#div5").delay(4000).fadeIn();
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图84

3.7 其他动画方法

除了上面我们所讲到的,jQuery 中还有四个专门用于交互的动画方法。

  • toggle() 方法:hide()show() 方法之间的切换。
  • slideToggle() 方法:slideUp()slideDown() 方法之间的切换。
  • fadeToggle() 方法:在 fadeIn()fadeOut() 方法之间进行切换。
  • fadeTo() 方法:把被选元素逐渐改变至给定的不透明度。

自己简单的提一下,有兴趣的可以访问 jQuery 中文网特效

另外我们特别需要注意的是 animate() 方法,因为它可以用来代替其他所有的动画方法。

四、总结

本节实验我们学习了 jQuery 中的事件和动画的操作,主要包括以下知识点:

  • 加载 DOM
  • 事件绑定
  • 合成事件
  • 事件冒泡
  • 事件对象的属性
  • 移除事件
  • 模拟操作
  • show()方法和 hide()方法
  • fadeIn() 方法和 fadeOut() 方法
  • slideUp() 方法和 slideDown() 方法
  • animate()方法
  • 动画回调函数
  • 停止动画和判断是否处于动画状态
  • 其他动画方法

在下一节实验中我们将学习 jQuery 对表单、表格的操作。

Query 对表单、表格的操作

一、实验介绍

1.1 实验内容

本节实验我们将带领大家学习 jQuery 对表单、表格的操作。

1.2 实验知识点

  • 单行文本框应用
  • 多行文本框应用
  • 复选框应用
  • 下拉框应用
  • 表单验证
  • 表格变色
  • 表格展开关闭
  • 表格内容筛选
  • 网页字体大小
  • 网页选项卡
  • 网页换肤

1.3 实验环境

  • Theia: 一款前后端分离的、基于 web 的 云 IDE。
  • Preview 或 Mini Browser:浏览器,右键点击目标 html 文件,选择 open with 下的 Preview 或 Mini Browser 即可在 IDE 中打开浏览器。

1.4 参考链接

二、表单应用

表单在网页中主要负责数据采集功能。一个表单有三个基本组成部分:

  • 表单标签:这里面包含了处理表单数据所用 CGI 程序的 URL 以及数据提交到服务器的方法。
  • 表单域:包含了文本框、密码框、隐藏域、多行文本框、复选框、单选框、下拉选择框和文件上传框等。
  • 表单按钮:包括提交按钮、复位按钮和一般按钮;用于将数据传送到服务器上的 CGI 脚本或者取消输入,还可以用表单按钮来控制其他定义了处理脚本的处理工作。

注:定义来自于搜狗百科。

2.1 单行文本框应用

文本框是表单域中最基本的元素。基于文本框的应用有很多,我们这里简单的介绍一个:获取和失去焦点改变样式。我们的需求是当文本框获取焦点后,改变它的颜色,当它失去焦点后,则要恢复到原来的样式,此功能使用户的操作可以得到及时的反馈,对于用户的体验特别好,我们可以使用原生 css 中的伪类选择器来实现这个功能,代码如下所示:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <style type="text/css">
      body {
        font: normal 12px/17px Arial;
      }

      div {
        padding: 2px;
      }

      input,
      textarea {
        width: 12em;
        border: 1px solid #888;
      }

      input:focus,
      textarea:focus {
        border: 1px solid #f00;
        background: #fcc;
      }
    </style>
  </head>
  <body>
    <form action="" method="post" id="regForm">
      <fieldset>
        <legend>个人基本信息</legend>
        <div>
          <label for="username">名称:</label>
          <input id="username" type="text" />
        </div>
        <div>
          <label for="pass">密码:</label>
          <input id="pass" type="password" />
        </div>
        <div>
          <label for="msg">详细信息:</label>
          <textarea id="msg" rows="2" cols="20"></textarea>
        </div>
      </fieldset>
    </form>
  </body>
</html>

运行效果为:

JQuery - 图85

但是这样有个问题,那就是 IE6 并不支持除超链接元素之外的 :hover 伪类选择符,所以我们可以用 jQuery 来弥补 IE6 对 CSS 支持的不足。来看看代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <style type="text/css">
      body {
        font: normal 12px/17px Arial;
      }

      div {
        padding: 2px;
      }

      input,
      textarea {
        width: 12em;
        border: 1px solid #888;
      }

      .focus {
        border: 1px solid #f00;
        background: #fcc;
      }
    </style>
  </head>
  <body>
    <form action="" method="post" id="regForm">
      <fieldset>
        <legend>个人基本信息</legend>
        <div>
          <label for="username">名称:</label>
          <input id="username" type="text" />
        </div>
        <div>
          <label for="pass">密码:</label>
          <input id="pass" type="password" />
        </div>
        <div>
          <label for="msg">详细信息:</label>
          <textarea id="msg" rows="2" cols="20"></textarea>
        </div>
      </fieldset>
    </form>
    <script type="text/javascript">
      $(document).ready(function () {
        $(":input")
          .focus(function () {
            $(this).addClass("focus");
          })
          .blur(function () {
            $(this).removeClass("focus");
          });
      });
    </script>
  </body>
</html>

当元素失去焦点时发生 blur 事件。当元素获得焦点时(当通过鼠标点击选中元素或通过 tab 键定位到元素时),发生 focus 事件。

2.2 多行文本框应用

对于多行文本框输入来说,我们可能会有这样的需求,比如我们需要做一个网站的评论框,然后这个评论框就是一个多行文本框,一般来说评论框的高度不会太高,但是如果我们评论的内容很多,那么我们就需要实现这样一个功能,能够放大缩小评论框,并且给评论框的大小一个限制,不是说无限放大缩小,这个放大缩小我们再加上前面说的 animate() 动画,使得效果更好,同样的我们再加一个滚动条的高度变化效果,也就是说拖动滚动条来让文本的内容也跟着滚动,来看看示例代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <style type="text/css">
      * {
        margin: 0;
        padding: 0;
        font: normal 12px/17px Arial;
      }

      .msg {
        width: 300px;
        margin: 100px;
      }

      .msg_caption {
        width: 100%;
        overflow: hidden;
        margin-bottom: 1px;
      }

      .msg_caption span {
        display: block;
        float: left;
        margin: 0 2px;
        padding: 4px 10px;
        background: #898989;
        cursor: pointer;
        color: white;
      }

      .msg textarea {
        width: 300px;
        height: 80px;
        height: 100px;
        border: 1px solid #000;
      }
    </style>
  </head>
  <body>
    <form action="" method="post">
      <div class="msg">
        <div class="msg_caption">
          <span class="bigger">放大</span>
          <span class="smaller">缩小</span>
          <span class="up">向上</span>
          <span class="down">向下</span>
        </div>
        <div>
          <textarea id="comment" rows="8" cols="20"> </textarea>
        </div>
      </div>
    </form>
    <script type="text/javascript">
      $(document).ready(function () {
        var $comment = $("#comment"); //获取评论框

        $(".bigger").click(function () {
          //放大按钮绑定单击事件
          if (!$comment.is(":animated")) {
            //判断是否处于动画
            if ($comment.height() < 600) {
              $comment.animate(
                {
                  height: "+=60",
                },
                400
              ); //重新设置高度,在原有的基础上加60
            }
          }
        });
        $(".smaller").click(function () {
          //缩小按钮绑定单击事件
          if (!$comment.is(":animated")) {
            //判断是否处于动画
            if ($comment.height() > 60) {
              $comment.animate(
                {
                  height: "-=60",
                },
                400
              ); //重新设置高度,在原有的基础上减60
            }
          }
        });

        $(".up").click(function () {
          //向上按钮绑定单击事件
          if (!$comment.is(":animated")) {
            //判断是否处于动画
            $comment.animate(
              {
                scrollTop: "-=60",
              },
              400
            );
          }
        });
        $(".down").click(function () {
          //向下按钮绑定单击事件
          if (!$comment.is(":animated")) {
            $comment.animate(
              {
                scrollTop: "+=60",
              },
              400
            );
          }
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图86

2.3 复选框应用

对复选框最基本的应用就是对复选框进行全选,全不选,反选等操作。复杂的操作需要与选项挂钩,来达到各种级联反应效果。

如果需要使复选框处于选择或者不选状态,必须通过控制元素的 checked 属性来达到目的,如果属性 checked 的值为 true,说明被选中,如果值为 false,说明没有被选中,因此我们可以基于这个属性来完成需求。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
  </head>
  <body>
    <form method="post" action="">
      你喜欢的季节是什么?
      <br />
      <input type="checkbox" name="items" value="春天" />春天
      <input type="checkbox" name="items" value="夏天" />夏天
      <input type="checkbox" name="items" value="秋天" />秋天
      <input type="checkbox" name="items" value="冬天" />冬天
      <br />
      <input type="button" id="CheckedAll" value="全 选" />
      <input type="button" id="CheckedNo" value="全不选" />
      <input type="button" id="CheckedRev" value="反 选" />

      <input type="button" id="send" value="提 交" />
    </form>
    <script type="text/javascript">
      $(document).ready(function () {
        //全选
        $("#CheckedAll").click(function () {
          $("[name=items]:checkbox").attr("checked", true);
        });
        //全不选
        $("#CheckedNo").click(function () {
          $("[type=checkbox]:checkbox").attr("checked", false);
        });
        //反选
        $("#CheckedRev").click(function () {
          $("[name=items]:checkbox").each(function () {
            //jQuery写法
            //$(this).attr("checked", !$(this).attr("checked"));
            //$(this).prop("checked", !$(this).prop("checked"));

            //原生js写法
            this.checked = !this.checked;
          });
        });
        //输出值
        $("#send").click(function () {
          var str = "你选中的是:\r\n";
          $("[name=items]:checkbox:checked").each(function () {
            str += $(this).val() + "\r\n";
          });
          alert(str);
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图87

上面的例子是通过两个复选框来控制全选和全不选,下面我们将其改成只能一个复选框来控制,也很简单,只要加个判断语句即可。比如:

$("#CheckedAll").click(function () {
  if (this.checked) {
    //如果当前点击的多选框被选中
    $("input[type=checkbox][name=items]").attr("checked", true);
  } else {
    $("input[type=checkbox][name=items]").attr("checked", false);
  }
});

我们发现所有复选框 checked 属性的值和控制全选的复选框的 checked 属性的值是是相同的,所以我们可以省略 if 判断,直接赋值,代码如下:

$("#CheckedAll").click(function () {
  $("input[type=checkbox][name=items]").attr("checked", this.checked);
});

另外我们需要增加一个需求,那就是复选框组是全选的时候,id 为“CheckedAll” 的复选框被选中,当复选框组里面只要有一个没有被选中的时候,那么 id 为“CheckedAll” 的复选框取消选中状态,也就是说我们要让这两个复选框联动起来。有如下两种思路:

  • 思路一:对复选框组绑定单击事件,定义一个 flag 变量,默认为 true,循环复选框组,当有没有被选中的项时,则把变量 flag 的值设置为 false,最后根据 flag 的值来设置 id 为“CheckedAll” 的复选框是否被选中。
  • 思路二:对复选框组绑定单击事件,判断复选框的总数是否等于选中的复选框的数量。

思路一代码:

这里可能 jQuery 版本的问题,所以我们先更换成低版本的,不然运行可能会有报错。大家可以自行尝试以前我们所用的 3.3.1 版本,看看效果。

wget https://labfile.oss.aliyuncs.com/courses/22/jquery-1.4.4.js
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-1.4.4.js"></script>
  </head>
  <body>
    <form method="post" action="">
      你喜欢的季节是什么?
      <input type="checkbox" id="CheckedAll" />全选/全不选
      <br />
      <input type="checkbox" name="items" value="春天" />春天
      <input type="checkbox" name="items" value="夏天" />夏天
      <input type="checkbox" name="items" value="秋天" />秋天
      <input type="checkbox" name="items" value="冬天" />冬天
      <br />
      <input type="button" id="send" value="提 交" />
    </form>
    <script type="text/javascript">
      $(document).ready(function () {
        //全选
        $("#CheckedAll").click(function () {
          if (this.checked) {
            //如果当前点击的多选框被选中
            $("input[type=checkbox][name=items]").attr("checked", true);
          } else {
            $("input[type=checkbox][name=items]").attr("checked", false);
          }
        });
        $("input[type=checkbox][name=items]").click(function () {
          var flag = true;
          $("input[type=checkbox][name=items]").each(function () {
            if (!this.checked) {
              flag = false;
            }
          });

          if (flag) {
            $("#CheckedAll").attr("checked", true);
          } else {
            $("#CheckedAll").attr("checked", false);
          }
        });
        //输出值
        $("#send").click(function () {
          var str = "你选中的是:\r\n";
          $("input[type=checkbox][name=items]:checked").each(function () {
            str += $(this).val() + "\r\n";
          });
          alert(str);
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图88

思路二代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
  </head>
  <body>
    <form method="post" action="">
      你喜欢的季节是什么?
      <input type="checkbox" id="CheckedAll" />全选/全不选
      <br />
      <input type="checkbox" name="items" value="春天" />春天
      <input type="checkbox" name="items" value="夏天" />夏天
      <input type="checkbox" name="items" value="秋天" />秋天
      <input type="checkbox" name="items" value="冬天" />冬天
      <br />
      <input type="button" id="send" value="提 交" />
    </form>
    <script type="text/javascript">
      $(document).ready(function () {
        //全选
        $("#CheckedAll").click(function () {
          //所有checkbox跟着全选的checkbox走。
          $("[name=items]:checkbox").attr("checked", this.checked);
        });
        $("[name=items]:checkbox").click(function () {
          //定义一个临时变量,避免重复使用同一个选择器选择页面中的元素,提升程序效率。
          var $tmp = $("[name=items]:checkbox");
          //用filter方法筛选出选中的复选框。并直接给CheckedAll赋值。
          $("#CheckedAll").attr(
            "checked",
            $tmp.length == $tmp.filter(":checked").length
          );

          /*
                        //一行做过多的事情需要写更多注释。复杂选择器还可能影响效率。因此不推荐如下写法。
                        $('#CheckedAll').attr('checked',!$('[name=items]:checkbox').filter(':not(:checked)').length);
                    */
        });
        //输出值
        $("#send").click(function () {
          var str = "你选中的是:\r\n";
          $("[name=items]:checkbox:checked").each(function () {
            str += $(this).val() + "\r\n";
          });
          alert(str);
        });
      });
    </script>
  </body>
</html>

2.4 下拉框应用

这里我们需要实现的功能如下:

  • 将选中的选项添加给对方。
  • 将全部选项添加给对方。
  • 双击某个选项将其添加给对方。

在实验三 jQuery 中的 DOM 操作章节里面我们讲过:删除追加可以用 appendTo() 方法直接完成。这里我们再次练习使用该方法,有遗忘的可以回过去再次复习一下实验三。另外 dblclick 是绑定双击事件用法和 click 事件相同。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <style type="text/css">
      * {
        margin: 0;
        padding: 0;
      }

      div.centent {
        float: left;
        text-align: center;
        margin: 10px;
      }

      span {
        display: block;
        margin: 2px 2px;
        padding: 4px 10px;
        background: #898989;
        cursor: pointer;
        font-size: 12px;
        color: white;
      }
    </style>
  </head>
  <body>
    <div class="centent">
      <select
        multiple="multiple"
        id="select1"
        style="width:100px;height:160px;"
      >
        <option value="1">选项1</option>
        <option value="2">选项2</option>
        <option value="3">选项3</option>
        <option value="4">选项4</option>
        <option value="5">选项5</option>
        <option value="6">选项6</option>
        <option value="7">选项7</option>
      </select>
      <div>
        <span id="add">选中添加到右边&gt;&gt;</span>
        <span id="add_all">全部添加到右边&gt;&gt;</span>
      </div>
    </div>

    <div class="centent">
      <select
        multiple="multiple"
        id="select2"
        style="width: 100px;height:160px;"
      >
        <option value="8">选项8</option>
      </select>
      <div>
        <span id="remove">&lt;&lt;选中删除到左边</span>
        <span id="remove_all">&lt;&lt;全部删除到左边</span>
      </div>
    </div>
    <script type="text/javascript">
      $(document).ready(function () {
        //移到右边
        $("#add").click(function () {
          //获取选中的选项,删除并追加给对方
          $("#select1 option:selected").appendTo("#select2");
        });
        //移到左边
        $("#remove").click(function () {
          $("#select2 option:selected").appendTo("#select1");
        });
        //全部移到右边
        $("#add_all").click(function () {
          //获取全部的选项,删除并追加给对方
          $("#select1 option").appendTo("#select2");
        });
        //全部移到左边
        $("#remove_all").click(function () {
          $("#select2 option").appendTo("#select1");
        });
        //双击选项
        $("#select1").dblclick(function () {
          //绑定双击事件
          //获取全部的选项,删除并追加给对方
          $("option:selected", this).appendTo("#select2"); //追加给对方
        });
        //双击选项
        $("#select2").dblclick(function () {
          $("option:selected", this).appendTo("#select1");
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图89

2.5 表单验证

验证表单元素步骤如下:

  • 判断当前失去焦点的元素是“用户名”还是“邮箱”,然后分别进行相应的处理。
  • 如果当前失去焦点的元素是“用户名”,则判断元素的值的长度是否小于 6,如果小于 6,则提醒用户输入不正确,反之提示输入正确。
  • 如果当前失去焦点的元素是是“邮箱”,则判断元素的值是否符合邮箱的格式,如果不符合,则提示用户输入不正确,反之提示输入正确。
  • 将提示信息追加到当前元素的父元素的最后。

另外需要注意的是这里我们没有加样式代码,有兴趣的同学,可以自行加上喜欢的样式。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
  </head>
  <body>
    <form method="post" action="">
      <div class="int">
        <label for="username">用户名:</label>
        <input type="text" id="username" class="required" />
      </div>
      <div class="int">
        <label for="email">邮箱:</label>
        <input type="text" id="email" class="required" />
      </div>
      <div class="int">
        <label for="personinfo">个人资料:</label>
        <input type="text" id="personinfo" />
      </div>
      <div class="sub">
        <input type="submit" value="提交" id="send" /><input
          type="reset"
          id="res"
        />
      </div>
    </form>
    <script type="text/javascript">
      $(document).ready(function () {
        //如果是必填的,则加星标识.
        $("form :input.required").each(function () {
          var $required = $("<strong class='high'> *</strong>"); //创建元素
          $(this).parent().append($required); //然后将它追加到文档中
        });
        //文本框失去焦点后
        $("form :input")
          .blur(function () {
            var $parent = $(this).parent();
            $parent.find(".formtips").remove();
            //验证用户名
            if ($(this).is("#username")) {
              if (this.value == "" || this.value.length < 6) {
                var errorMsg = "请输入至少6位的用户名.";
                $parent.append(
                  '<span class="formtips onError">' + errorMsg + "</span>"
                );
              } else {
                var okMsg = "输入正确.";
                $parent.append(
                  '<span class="formtips onSuccess">' + okMsg + "</span>"
                );
              }
            }
            //验证邮件
            if ($(this).is("#email")) {
              if (
                this.value == "" ||
                (this.value != "" && !/.+@.+\.[a-zA-Z]{2,4}$/.test(this.value))
              ) {
                var errorMsg = "请输入正确的E-Mail地址.";
                $parent.append(
                  '<span class="formtips onError">' + errorMsg + "</span>"
                );
              } else {
                var okMsg = "输入正确.";
                $parent.append(
                  '<span class="formtips onSuccess">' + okMsg + "</span>"
                );
              }
            }
          })
          .keyup(function () {
            $(this).triggerHandler("blur");
          })
          .focus(function () {
            $(this).triggerHandler("blur");
          }); //end blur

        //提交,最终验证。
        $("#send").click(function () {
          $("form :input.required").trigger("blur");
          var numError = $("form .onError").length;
          if (numError) {
            return false;
          }
          alert("注册成功,密码已发到你的邮箱,请查收.");
        });

        //重置
        $("#res").click(function () {
          $(".formtips").remove();
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图90

注:大家可以根据自己的实际需求修改验证规则。

三、表格应用

下面我们来学习表格的应用。

3.1 表格变色

(1)普通的隔行变色

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <style type="text/css">
      table {
        border: 0;
        border-collapse: collapse;
      }

      td {
        font: normal 12px/17px Arial;
        padding: 2px;
        width: 100px;
      }

      th {
        font: bold 12px/17px Arial;
        text-align: left;
        padding: 4px;
        border-bottom: 1px solid #333;
      }

      /* 偶数行样式*/
      .even {
        background: yellow;
      }

      /* 奇数行样式*/
      .odd {
        background: red;
      }

      /* 选中行样式 */
      .selected {
        background: green;
        color: #fff;
      }
    </style>
  </head>
  <body>
    <table>
      <thead>
        <tr>
          <th>姓名</th>
          <th>性别</th>
          <th>暂住地</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>周杰伦</td>
          <td>男</td>
          <td>台湾</td>
        </tr>
        <tr>
          <td>成龙</td>
          <td>男</td>
          <td>香港</td>
        </tr>
        <tr>
          <td>古天乐</td>
          <td>男</td>
          <td>香港</td>
        </tr>
        <tr>
          <td>PDD</td>
          <td>男</td>
          <td>成都</td>
        </tr>
        <tr>
          <td>大司马</td>
          <td>男</td>
          <td>芜湖</td>
        </tr>
        <tr>
          <td>皮皮虾</td>
          <td>略</td>
          <td>沙滩</td>
        </tr>
      </tbody>
    </table>
    <script type="text/javascript">
      $(document).ready(function () {
        $("tbody>tr:odd").addClass("odd"); //先排除第一行thead,然后给奇数行添加样式
        $("tbody>tr:even").addClass("even"); //先排除第一行thead,然后给偶数行添加样式
        $("tr:contains('PDD')").addClass("selected");
      });
    </script>
  </body>
</html>

注:$("tr:odd")$("tr:even") 选择器索引是从 0 开始的,因此第一行是偶数。另外我们使用 contains 选择器来讲某一行单独设置 CSS 样式。

运行效果为:

JQuery - 图91

(2)单选框控制表格行高亮

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <style type="text/css">
      table {
        border: 0;
        border-collapse: collapse;
      }

      td {
        font: normal 12px/17px Arial;
        padding: 2px;
        width: 100px;
      }

      th {
        font: bold 12px/17px Arial;
        text-align: left;
        padding: 4px;
        border-bottom: 1px solid #333;
      }

      /* 偶数行样式*/
      .even {
        background: yellow;
      }

      /* 奇数行样式*/
      .odd {
        background: red;
      }

      /* 选中行样式 */
      .selected {
        background: green;
        color: #fff;
      }
    </style>
  </head>
  <body>
    <table>
      <thead>
        <tr>
          <th>姓名</th>
          <th>性别</th>
          <th>暂住地</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>周杰伦</td>
          <td>男</td>
          <td>台湾</td>
        </tr>
        <tr>
          <td>成龙</td>
          <td>男</td>
          <td>香港</td>
        </tr>
        <tr>
          <td>古天乐</td>
          <td>男</td>
          <td>香港</td>
        </tr>
        <tr>
          <td>PDD</td>
          <td>男</td>
          <td>成都</td>
        </tr>
        <tr>
          <td>大司马</td>
          <td>男</td>
          <td>芜湖</td>
        </tr>
        <tr>
          <td>皮皮虾</td>
          <td>略</td>
          <td>沙滩</td>
        </tr>
      </tbody>
    </table>
    <script type="text/javascript">
      $(document).ready(function () {
        $("tbody>tr:odd").addClass("odd"); //先排除第一行thead,然后给奇数行添加样式
        $("tbody>tr:even").addClass("even"); //先排除第一行thead,然后给偶数行添加样式
        $("tbody>tr").click(function () {
          $(this)
            .addClass("selected")
            .siblings()
            .removeClass("selected")
            .end()
            .find(":radio")
            .attr("checked", true);
        });
        // 如果单选框默认情况下是选择的,则高色.
        // $('table :radio:checked').parent().parent().addClass('selected');
        //简化:parent()方法是逐步向父节点获取相应的元素,可以使用parents()方法直接获取
        $("table :radio:checked").parents("tr").addClass("selected");
        //通过has选择器再简化:
        //$('tbody>tr:has(:checked)').addClass('selected');
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图92

注:示例代码中我们使用了 end() 方法,当前对象是 $(this),当进行 addClass('selected') 操作时,对象并没有发生变化,当执行 siblings().removeClass('selected') 操作时,对象已经变成了 $(this).siblings(),因此后面的的操作都是针对这个对象的,如果需要重新返回到 $(this) 对象,我们就可以使用 end() 方法。这样后面的 .find(':radio').attr('checked', true); 操作就是 $(this).find(':radio').attr('checked', true);

(3)复选框控制表格行高亮

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <style type="text/css">
      table {
        border: 0;
        border-collapse: collapse;
      }

      td {
        font: normal 12px/17px Arial;
        padding: 2px;
        width: 100px;
      }

      th {
        font: bold 12px/17px Arial;
        text-align: left;
        padding: 4px;
        border-bottom: 1px solid #333;
      }

      /* 偶数行样式*/
      .even {
        background: yellow;
      }

      /* 奇数行样式*/
      .odd {
        background: red;
      }

      /* 选中行样式 */
      .selected {
        background: green;
        color: #fff;
      }
    </style>
  </head>
  <body>
    <table>
      <thead>
        <tr>
          <th>姓名</th>
          <th>性别</th>
          <th>暂住地</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>周杰伦</td>
          <td>男</td>
          <td>台湾</td>
        </tr>
        <tr>
          <td>成龙</td>
          <td>男</td>
          <td>香港</td>
        </tr>
        <tr>
          <td>古天乐</td>
          <td>男</td>
          <td>香港</td>
        </tr>
        <tr>
          <td>PDD</td>
          <td>男</td>
          <td>成都</td>
        </tr>
        <tr>
          <td>大司马</td>
          <td>男</td>
          <td>芜湖</td>
        </tr>
        <tr>
          <td>皮皮虾</td>
          <td>略</td>
          <td>沙滩</td>
        </tr>
      </tbody>
    </table>
    <script type="text/javascript">
      $(document).ready(function () {
        $("tbody>tr:odd").addClass("odd"); //先排除第一行thead,然后给奇数行添加样式
        $("tbody>tr:even").addClass("even"); //先排除第一行thead,然后给偶数行添加样式
        $("tbody>tr").click(function () {
          if ($(this).hasClass("selected")) {
            $(this)
              .removeClass("selected")
              .find(":checkbox")
              .attr("checked", false);
          } else {
            $(this)
              .addClass("selected")
              .find(":checkbox")
              .attr("checked", true);
          }
        });
        // 如果复选框默认情况下是选择的,则高色.
        // $('table :checkbox:checked').parent().parent().addClass('selected');
        //简化:
        $("table :checkbox:checked").parents("tr").addClass("selected");
        //$('tbody>tr:has(:checked)').addClass('selected');
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图93

3.2 表格展开关闭

默认展开代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <style type="text/css">
      table {
        border: 0;
        border-collapse: collapse;
      }

      td {
        font: normal 12px/17px Arial;
        padding: 2px;
        width: 100px;
      }

      th {
        font: bold 12px/17px Arial;
        text-align: left;
        padding: 4px;
        border-bottom: 1px solid #333;
        width: 100px;
      }

      .parent {
        background: red;
        cursor: pointer;
      }

      /* 偶数行样式*/
      .odd {
        background: blue;
      }

      /* 奇数行样式*/
      .selected {
        background: green;
        color: #fff;
      }
    </style>
  </head>
  <body>
    <table>
      <thead>
        <tr>
          <th>姓名</th>
          <th>性别</th>
          <th>暂住地</th>
        </tr>
      </thead>
      <tbody>
        <tr class="parent" id="row_01">
          <td colspan="3">前端工程师</td>
        </tr>
        <tr class="child_row_01">
          <td>尤雨溪</td>
          <td>男</td>
          <td>上海</td>
        </tr>
        <tr class="child_row_01">
          <td>阮一峰</td>
          <td>男</td>
          <td>上海</td>
        </tr>

        <tr class="parent" id="row_02">
          <td colspan="3">后端工程师</td>
        </tr>
        <tr class="child_row_02">
          <td>张三</td>
          <td>男</td>
          <td>湖南长沙</td>
        </tr>
        <tr class="child_row_02">
          <td>李四</td>
          <td>男</td>
          <td>浙江温州</td>
        </tr>

        <tr class="parent" id="row_03">
          <td colspan="3">运营小姐姐</td>
        </tr>
        <tr class="child_row_03">
          <td>Angelababy</td>
          <td>女</td>
          <td>浙江杭州</td>
        </tr>
        <tr class="child_row_03">
          <td>邓紫棋</td>
          <td>女</td>
          <td>浙江杭州</td>
        </tr>
      </tbody>
    </table>
    <script type="text/javascript">
      $(document).ready(function () {
        $("tr.parent").click(function () {
          // 获取所谓的父行
          $(this)
            .toggleClass("selected") // 添加/删除高亮
            .siblings(".child_" + this.id)
            .toggle(); // 隐藏/显示所谓的子行
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图94

默认收缩代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <style type="text/css">
      table {
        border: 0;
        border-collapse: collapse;
      }

      td {
        font: normal 12px/17px Arial;
        padding: 2px;
        width: 100px;
      }

      th {
        font: bold 12px/17px Arial;
        text-align: left;
        padding: 4px;
        border-bottom: 1px solid #333;
        width: 100px;
      }

      .parent {
        background: red;
        cursor: pointer;
      }

      /* 偶数行样式*/
      .odd {
        background: blue;
      }

      /* 奇数行样式*/
      .selected {
        background: green;
        color: #fff;
      }
    </style>
  </head>
  <body>
    <table>
      <thead>
        <tr>
          <th>姓名</th>
          <th>性别</th>
          <th>暂住地</th>
        </tr>
      </thead>
      <tbody>
        <tr class="parent" id="row_01">
          <td colspan="3">前端工程师</td>
        </tr>
        <tr class="child_row_01">
          <td>尤雨溪</td>
          <td>男</td>
          <td>上海</td>
        </tr>
        <tr class="child_row_01">
          <td>阮一峰</td>
          <td>男</td>
          <td>上海</td>
        </tr>

        <tr class="parent" id="row_02">
          <td colspan="3">后端工程师</td>
        </tr>
        <tr class="child_row_02">
          <td>张三</td>
          <td>男</td>
          <td>湖南长沙</td>
        </tr>
        <tr class="child_row_02">
          <td>李四</td>
          <td>男</td>
          <td>浙江温州</td>
        </tr>

        <tr class="parent" id="row_03">
          <td colspan="3">运营小姐姐</td>
        </tr>
        <tr class="child_row_03">
          <td>Angelababy</td>
          <td>女</td>
          <td>浙江杭州</td>
        </tr>
        <tr class="child_row_03">
          <td>邓紫棋</td>
          <td>女</td>
          <td>浙江杭州</td>
        </tr>
      </tbody>
    </table>
    <script type="text/javascript">
      $(document).ready(function () {
        $("tr.parent")
          .click(function () {
            // 获取所谓的父行
            $(this)
              .toggleClass("selected") // 添加/删除高亮
              .siblings(".child_" + this.id)
              .toggle(); // 隐藏/显示所谓的子行
          })
          .click();
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图95

3.3 表格内容筛选

利用 contains 选择器结合 jQuery 的 filter() 筛选方法,可以实现表格的过滤。

filter() 方法:

  • filter() 方法返回符合一定条件的元素。
  • 该方法让您规定一个条件。不符合条件的元素将从选择中移除,符合条件的元素将被返回。
  • 该方法通常用于缩小在被选元素组合中搜索元素的范围。
  • filter() 方法是与 not() 方法相对的。

语法为:

$(selector).filter(criteria,function(index))

参数说明:

  • criteria 可选。规定要从被选元素组合中返回的选择器表达式、jQuery 对象、一个或多个元素。如需规定多个条件,请使用逗号分隔。
  • function(index) 可选。为集合中的每个元素规定要运行的函数。如果返回 true,则保留元素,否则元素将被移除。index - 集合中元素的 index 位置。this 是当前的 DOM 元素。

例子:

// 返回带有类名 "syl" 的所有 <p> 元素,并设置其背景色为红色
$("p").filter(".syl").css("background-color", "red");
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
  </head>
  <body>
    <div>
      <br />
      筛选:
      <input id="filterName" />
      <br />
    </div>

    <table>
      <thead>
        <tr>
          <th>姓名</th>
          <th>性别</th>
          <th>暂住地</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>张一</td>
          <td>男</td>
          <td>浙江宁波</td>
        </tr>
        <tr>
          <td>张二</td>
          <td>女</td>
          <td>浙江杭州</td>
        </tr>
        <tr>
          <td>张三</td>
          <td>男</td>
          <td>湖南长沙</td>
        </tr>
        <tr>
          <td>李四</td>
          <td>男</td>
          <td>浙江温州</td>
        </tr>
        <tr>
          <td>李五</td>
          <td>男</td>
          <td>浙江杭州</td>
        </tr>
        <tr>
          <td>李六</td>
          <td>女</td>
          <td>浙江杭州</td>
        </tr>
        <tr>
          <td>王七</td>
          <td>男</td>
          <td>浙江杭州</td>
        </tr>
        <tr>
          <td>王八</td>
          <td>女</td>
          <td>浙江杭州</td>
        </tr>
        <tr>
          <td>王九</td>
          <td>男</td>
          <td>湖南长沙</td>
        </tr>
      </tbody>
    </table>
    <script type="text/javascript">
      $(document).ready(function () {
        $("#filterName").keyup(function () {
          $("table tbody tr")
            .hide()
            .filter(":contains('" + $(this).val() + "')")
            .show();
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图96

四、其他应用

我们再来看看其它的应用场景。

4.1 网页字体大小

有些网页经常会有“放大”和“缩小”字号的控制按钮,通过单击它们,我们可以使网页的文字呈现不同的大小,比如某某小说网站,爱看小说的同学一定深有体会。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <style type="text/css">
      * {
        margin: 0;
        padding: 0;
      }

      .msg {
        width: 300px;
        margin: 100px;
      }

      .msg_caption {
        width: 100%;
        overflow: hidden;
        margin-bottom: 1px;
      }

      .msg_caption span {
        display: block;
        float: left;
        margin: 0 2px;
        padding: 4px 10px;
        background: #898989;
        cursor: pointer;
        font-size: 12px;
        color: white;
      }

      .msg textarea {
        width: 300px;
        height: 80px;
        height: 100px;
        border: 1px solid #000;
      }
    </style>
  </head>
  <body>
    <div class="msg">
      <div class="msg_caption">
        <span class="bigger">放大</span>
        <span class="smaller">缩小</span>
      </div>
      <div>
        <p id="para">
          我爱学习天天向上。我爱学习天天向上。
          我爱学习天天向上。我爱学习天天向上。
          我爱学习天天向上。我爱学习天天向上。
          我爱学习天天向上。我爱学习天天向上。
          我爱学习天天向上。我爱学习天天向上。
          我爱学习天天向上。我爱学习天天向上。
          我爱学习天天向上。我爱学习天天向上。
        </p>
      </div>
    </div>
    <script type="text/javascript">
      $(document).ready(function () {
        $("span").click(function () {
          var thisEle = $("#para").css("font-size");
          //使用parseInt()方法去掉单位,第二个参数表示进制,这里为十进制
          var textFontSize = parseInt(thisEle, 10);
          //slice()方法返回字符串中从指定的字符开始的一个子字符串,因为px是两个字符,所以指定字符串应该从倒数第二个字符开始,在后面设置字体大小时,再把单位拼接上
          var unit = thisEle.slice(-2); //获取单位
          var cName = $(this).attr("class");
          if (cName == "bigger") {
            //进行限制不能无限防大
            if (textFontSize <= 22) {
              textFontSize += 2;
            }
          } else if (cName == "smaller") {
            //进行限制不能无限缩小
            if (textFontSize >= 12) {
              textFontSize -= 2;
            }
          }
          $("#para").css("font-size", textFontSize + unit);
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图97

4.2 网页选项卡

网页选项卡也可以叫 tab 栏切换,就是通过点击不同的按钮,显示不同的内容,原理很简单,通过隐藏和显示来切换不同的内容。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <style type="text/css">
      * {
        margin: 0;
        padding: 0;
      }

      body {
        font: 12px/19px Arial, Helvetica, sans-serif;
        color: #666;
      }

      .tab {
        width: 240px;
        margin: 50px;
      }

      .tab_menu {
        clear: both;
      }

      .tab_menu li {
        float: left;
        text-align: center;
        cursor: pointer;
        list-style: none;
        padding: 1px 6px;
        margin-right: 4px;
        background: #f1f1f1;
        border: 1px solid #898989;
        border-bottom: none;
      }

      .tab_menu li.hover {
        background: #dfdfdf;
      }

      .tab_menu li.selected {
        color: #fff;
        background: #6d84b4;
      }

      .tab_box {
        clear: both;
        border: 1px solid #898989;
        height: 100px;
      }

      .hide {
        display: none;
      }
    </style>
  </head>
  <body>
    <div class="tab">
      <div class="tab_menu">
        <ul>
          <li class="selected">春天</li>
          <li>夏天</li>
          <li>秋天</li>
          <li>冬天</li>
        </ul>
      </div>
      <div class="tab_box">
        <div>春天</div>
        <div class="hide">夏天</div>
        <div class="hide">秋天</div>
        <div class="hide">冬天</div>
      </div>
    </div>
    <script type="text/javascript">
      $(document).ready(function () {
        var $div_li = $("div.tab_menu ul li");
        $div_li
          .click(function () {
            $(this)
              .addClass("selected") //当前<li>元素高亮
              .siblings()
              .removeClass("selected"); //去掉其它同辈<li>元素的高亮
            var index = $div_li.index(this); // 获取当前点击的<li>元素 在 全部li元素中的索引。
            $("div.tab_box > div") //选取子节点。不选取子节点的话,会引起错误。如果里面还有div
              .eq(index)
              .show() //显示 <li>元素对应的<div>元素
              .siblings()
              .hide(); //隐藏其它几个同辈的<div>元素
          })
          .hover(
            function () {
              //添加光标滑动效果
              $(this).addClass("hover");
            },
            function () {
              $(this).removeClass("hover");
            }
          );
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图98

4.3 网页换肤

首先新建一个名为 css 的文件夹,里面分别创建名为 default.css,skin_0.css,skin_1.css,skin_2.css,skin_3.css,skin_4.css,skin_5.css 的 css 文件。

default.css 的代码为:

* {
  margin: 0px;
  padding: 0px;
}
body {
  font-family: Verdana, Arial, Helvetica, sans-serif;
  font-size: 12px;
}
#div_side_0,
#div_side_1 {
  float: left;
  width: 120px;
  height: 450px;
}
#skin {
  margin: 10px;
  padding: 5px;
  width: 210px;
  padding-right: 0px;
  list-style: none;
  border: 1px solid #cccccc;
  overflow: hidden;
}
#skin li {
  float: left;
  margin-right: 5px;
  width: 15px;
  height: 15px;
  text-indent: -999px;
  overflow: hidden;
  display: block;
  cursor: pointer;
  background-image: url(../theme.gif);
}
#skin_0 {
  background-position: 0px 0px;
}
#skin_1 {
  background-position: 15px 0px;
}
#skin_2 {
  background-position: 35px 0px;
}
#skin_3 {
  background-position: 55px 0px;
}
#skin_4 {
  background-position: 75px 0px;
}
#skin_5 {
  background-position: 95px 0px;
}
#skin_0.selected {
  background-position: 0px 15px !important;
}
#skin_1.selected {
  background-position: 15px 15px !important;
}
#skin_2.selected {
  background-position: 35px 15px !important;
}
#skin_3.selected {
  background-position: 55px 15px !important;
}
#skin_4.selected {
  background-position: 75px 15px !important;
}
#skin_5.selected {
  background-position: 95px 15px !important;
}
.title {
  cursor: pointer;
}
h1 {
  margin: 10px;
  padding: 10px 20px;
  width: 60px;
  color: #ffffff;
  font-size: 14px;
}
a:link {
  text-decoration: none;
  color: #333333;
}
a:visited {
  color: #333333;
  text-decoration: none;
}
a:hover {
  color: #000000;
  text-decoration: underline;
}

skin_0.css 的代码为:

h1 {
  background: #999999;
}

skin_1.css 的代码为:

h1 {
  background: #bb3bd9;
}

skin_2.css 的代码为:

h1 {
  background: #e31559;
}

skin_3.css 的代码为:

h1 {
  background: #08bece;
}

skin_4.css 的代码为:

h1 {
  background: #fba60a;
}

skin_5.css 的代码为:

h1 {
  background: #afd400;
}

通过命令下载需要用的图片:

wget https://labfile.oss.aliyuncs.com/courses/22/theme.gif

目录结构为:

JQuery - 图99

在 test.html 文件中写入以下代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link href="css/default.css" rel="stylesheet" type="text/css" />
    <link href="css/skin_0.css" rel="stylesheet" type="text/css" id="cssfile" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
  </head>
  <body>
    <ul id="skin">
      <li id="skin_0" title="灰色" class="selected">灰色</li>
      <li id="skin_1" title="紫色">紫色</li>
      <li id="skin_2" title="红色">红色</li>
      <li id="skin_3" title="天蓝色">天蓝色</li>
      <li id="skin_4" title="橙色">橙色</li>
      <li id="skin_5" title="淡绿色">淡绿色</li>
    </ul>

    <div id="div_side_0">
      <div id="news">
        <h1 class="title">实验楼</h1>
      </div>
    </div>

    <div id="div_side_1">
      <div id="game">
        <h1 class="title">你学习的好地方</h1>
      </div>
    </div>

    <script type="text/javascript">
      $(document).ready(function () {
        var $li = $("#skin li");
        $li.click(function () {
          $("#" + this.id)
            .addClass("selected") //当前<li>元素选中
            .siblings()
            .removeClass("selected"); //去掉其它同辈<li>元素的选中
          $("#cssfile").attr("href", "css/" + this.id + ".css"); //设置不同皮肤
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图100

思考:虽然我们现在能够实现换肤功能了,但是实际上当页面刷新后,还是会回到默认效果达到样式,那么如果我们想要记录换肤的效果呢?这样我们选择了自己喜欢的效果后,在主动改变之前,都能一直使用,而不是每一次进入网站都要选择一次。这需要使用到 cookie 功能,而在后面的插件章节中,我们也会教大家使用 jQuery 中的 Cookie 插件。

五、总结

本节实验我们学习了 jQuery 对表单、表格的操作,主要包含以下知识点:

  • 单行文本框应用
  • 多行文本框应用
  • 复选框应用
  • 下拉框应用
  • 表单验证
  • 表格变色
  • 表格展开关闭
  • 表格内容筛选
  • 网页字体大小
  • 网页选项卡
  • 网页换肤

在下一节实验中我们将学习 jQuery 插件的使用和写法。

jQuery AJAX

一、实验介绍

1.1 实验内容

本节实验,我们将来介绍 jQuery 中的 ajax。

1.2 实验知识点

  • 原生 AJAX
  • jQuery AJAX

1.3 实验环境

  • Theia: 一款前后端分离的、基于 web 的 云 IDE。
  • Preview 或 Mini Browser:浏览器,右键点击目标 html 文件,选择 open with 下的 Preview 或 Mini Browser 即可在 IDE 中打开浏览器。

1.4 参考链接

w3c jQuery ajax

二、原生 AJAX

AJAX = 异步 JavaScript 和 XML(Asynchronous JavaScript and XML)。它并不是一种单一的技术,而是有机地利用了一系列交互式网页应用相关的技术所形成的结合体。简短地说,在不重载整个网页的情况下,AJAX 通过后台加载数据,并在网页上进行显示,其最大的特点就是异步。

2.1 AJAX 的优势与劣势

2.1.1 优势

  • 不需要插件支持
  • 优秀的用户体验
  • 提高 Web 程序的性能
  • 减轻服务器和带宽的负担

2.1.2 劣势

  • 浏览器对 XMLHttpRequest 对象支持度不足(关于 XMLHttpRequest 对象稍后我们会介绍到)
  • 破坏浏览器前进、“后退”按钮的正常功能
  • 对搜索引擎的支持的不足
  • 开发和调试工具的缺乏

2.2 AJAX 的 XMLHttpRequest 对象

现在,我们正式来看一看原生的 AJAX。AJAX 的核心是 XMLHttpRequest 对象,它的实现方式非常多,但是绝大多数的浏览器都提供了类似的属性和方法。目前 W3C 组织正致力于制定一个各浏览器厂商都可以遵循的 XMLHttpRequest 对象标准,来推进 AJAX 技术发展。

2.3 创建 XMLHttpRequest 对象

既然 XMLHttpRequest 是一个对象,那么我们在使用的时候就要先创建这个对象,所有现代浏览器都支持 XMLHttpRequest 对象(IE5 IE6 使用 ActiveXObject)。

创建 XMLHttpRequest 对象的语法:

var xhr = new XMLHttpRequest();

IE5 和 IE6 的语法:

var xhr = new ActiveXObject("Microsoft.XMLHTTP");

2.4 发起 XMLHttpRequest 请求

创建完对象后,我们就可以使用 XMLHttpRequest 对象向服务器发送请求,我们模拟了一个后端程序,在调试本节实验的示例时,都需要将这个后端程序运行起来:

在终端中输入以下命令

$ wget https://labfile.oss.aliyuncs.com/courses/1318/server.zip

$ unzip server.zip

$ rm server.zip

$ cd server

$ npm start # 启动后端程序

终端出现以下界面表示后端程序启动成功,我们可以朝服务端发起请求了。

JQuery - 图101

我们会使用 XMLHttpRequest 对象的 open() 和 send() 方法来将请求发送到服务器。

方法 描述
open(method,url,async) 规定请求的类型、URL 以及是否异步处理请求。 method: 请求的类型,http 的请求类型,如 GET、POST。 url: 请求的服务端路径 async: Boolean 类型,true (异步处理),false(同步处理)
send(string) 将请求发送到服务端。 string:仅用于 post 请求。

我们先来看一个简单的 GET 请求:

xhr.open("GET", "index.html", true);
xhr.send();

xhr 是我们之前创建的 XMLHttpRequest 对象的实例,通过调用 XMLHttpRequest 对象的 open 和 send 方法,就实现了一个简单的向路径 index.html 发起的 GET 请求,异步处理。因为 GET 请求的 header 中是没有参数的,所以 send() 里的值为 null。如果想要加上参数则需要在请求的 url 后添加,如:

xhr.open("GET", "http://helloworld.com?id=1", "true");
xhr.send();

我们再来看一个 post 请求:

xhr.open("POST", "index.php", true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send("name=syl&id=2");

如果我们想像 HTML 表单那样 POST 数据,则需要使用 setRequestHeader() 来添加 HTTP 头,然后在 send 中规定要发送的数据。

在上面的两个例子中,async 我们都是用了 true,使用 true 和 false 有什么区别呢?

我们现在只是发送了请求,一个完整的 AJAX 过程还要包括服务端返回信息,这个过程的时间就是我们无法估计的了,谁都没法确定服务端会什么时候返回信息,所以如果 async 设为 true,当发送了 AJAX 请求后,js 无需等待服务端的响应,而是会去处理其它的脚本,等到服务端响应就绪的时候,js 会返回对 AJAX 中的剩余部分作相应处理,这个相应处理需要通过 onreadystatechange 来实现,我们会在下一部分中介绍。如果 async 设为 false,当然,一般不推荐使用 async = false,如果你这么使用了,那么请不要编写 onreadystatechange 函数,否则 js 会挂起在这个函数的地方,等待服务端响应,如果服务端瘫痪了,那么你的脚本就会无法运行。所以如果使用了 async = false,把处理代码放到 send() 后面即可。例如:

xhr.open("GET", "index.text", false);
xhr.send();
console.log(xhr.responseText);

2.5 服务端响应及 onreadystatechange 事件

在前面的部分中,我们完成了发送请求到服务端的工作,现在我们要执行一些基于服务端响应的任务了,而这个响应就是 readyState。

下面是 XMLHttpRequest 的三个重要的属性:

属性 描述
onreadystatechange 存储函数,每当 readyState 属性改变时,就会调用这个函数。
readyState 这个变量储存了 XMLHttpRequest 的状态,有 0-4 并且分别对应不同的含义。 0:请求未初始化 1:服务器连接已建立 2:请求已接受 3:请求处理中 4:请求已完成,且响应已就绪
status 200:”OK” 404:未找到页面

一般情况下,我们需要处理的就是 readyState == 4 && status == 200 的情况,所以 onreadystatechange ,用于处理服务端响应的方法一般写法如下:

xhr.onreadystatechange = function () {
  if (xhr.readyState == 4 && xhr.status == 200) {
    //code 前端处理代码
  }
};

那么我们该如何获取来自服务端的响应呢? XMLHttpRequest 提供了两种方式:

属性 描述
responseText 获得字符串形式的响应数据
responseXML 获得 XML 形式的相应数据

用法示例如下:

xhr.onreadystatechange = function () {
  if (xhr.readyState == 4 && xhr.status == 200) {
    console.log(xhr.responseText);
  }
};

关于原生 AJAX 更多的知识可以查看 w3c 等文档。下面给出一个完整的原生 AJAX 调用的例子。

**注意:本节实验中的 url 都需要根据实验楼的环境进行修改,方法如下:

首先要确保已经运行了之前给出的后端程序,然后点击显示工具栏 -> Web 服务,将弹出的页面的 url 复制粘贴到代码对应位置即可,注意粘贴后的 url 有一个斜杠,代码中已经给出的地址也有一个斜杠,需要删去一个。**

下面我们给出一个原生的 AJAX 请求示例,在 /project 下新建一个 index.html 文件,键入以下内容,后续给出的示例都按这种方式操作。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
  </head>
  <body>
    <script>
      $(document).ready(function () {
        var xhr = null;

        //创建对象
        if (window.ActiveXObject) xhr = new ActiveXObject("Microsoft.XMLHTTP");
        else if (window.XMLHttpRequest) xhr = new XMLHttpRequest();

        //发送请求
        xhr.open("GET", "https://042bc5dd9bf0.simplelab.cn/xhrtest", true);
        //上面是在实验楼环境里运行过的 url,你需要根据注意里的步骤,将后端运行起来后,把web 服务页面中的 url 替换到对应位置,下面一行注释给出了需要替换的位置。
        //xhr.open("GET","需要将 web 服务中 url 粘贴到这里/xhrtest",true);
        xhr.send();

        //处理响应
        xhr.onreadystatechange = function () {
          if (xhr.readyState == 4 && xhr.status == 200) {
            alert(xhr.responseText);
          }
        };
      });
    </script>
  </body>
</html>

确保后端程序运行后,将该 html 文件按照之前的方式打开即可查看效果。

JQuery - 图102

三、jQuery Ajax

是不是觉得原生的 AJAX 有一些繁琐?不用担心,jQuery 对 AJAX 操作进行了封装。

3.1 load()、JQuery - 图103%E3%80%81#card=math&code=.get%28%29%E3%80%81).post()

我们先来介绍常用的几个方法:

3.1.1 load()

load() 是 jQuery 中最简单和常用的 AJAX 方法,语法为:

load(url, [data], [callback]);
参数 类型 描述
url String 请求的 url 地址
data(可选) Object 发送到服务器的数据
callback(可选) Function 请求完成时的回调函数,无论成功失败 function 有三个额外参数 response 包含来自请求的结果数据 status 包含请求的状态 xhr 包含 XMLHttpRequest 对象

下面这个示例加载了一个 html 文件到页面中来

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
  </head>
  <body>
    <div id="result"></div>
    <script>
      $(document).ready(function () {
        $("#result").load("https://042bc5dd9bf0.simplelab.cn/load.html");
        //上面是在实验楼环境里运行过的 url,你需要根据注意里的步骤,将后端运行起来后,把web 服务页面中的 url 替换到对应位置,下面一行注释给出了需要替换的位置。
        //$("#result").load("需要将 web 服务中 url 粘贴到这里/load.html");
      });
    </script>
  </body>
</html>

JQuery - 图104

我们只使用了参数 url,你可以将其它参数加入进来查看效果,例如加入回调函数:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
  </head>
  <body>
    <div id="result"></div>
    <script>
      $(document).ready(function () {
        //下面是在实验楼环境里运行过的 url,你需要根据注意里的步骤,将后端运行起来后,把web 服务页面中的 url 替换到对应位置,下面一行注释给出了需要替换的位置。
        //"需要将 web 服务中 url 粘贴到这里/load.html"
        $("#result").load(
          "https://042bc5dd9bf0.simplelab.cn/load.html",
          function (response, status, xhr) {
            alert(status);
          }
        );
      });
    </script>
  </body>
</html>

使用回调函数弹出了 status。

JQuery - 图105

3.1.2 $.get()

get() 通过远程 HTTP GET 请求载入信息。语法:

$(selector).get(url, data, success(response, status, xhr), dataType);
参数 描述
url 必须,请求的 url
data 可选,发送到服务器的数据
success(response,status,xhr) 可选,当请求成功时运行该方法 response-包含来自请求的结果数据 status-包含请求的状态 xhr-XMLHttpRequest 对象
dataType 可选,规定预计接收服务端的响应的数据,可能的类型有 xml、html、text、script、json

get() 方法是 ajax 方法的简写形式,我们还没有介绍 ajax 方法,但是这里我们给出 get 等价的 ajax 形式:

$.ajax({
  type: "GET",
  url: url,
  data: data,
  success: success,
  dataType: dataType,
});

下面是一个简单的 get() 方法的示例:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
  </head>
  <body>
    <button id="btn">click me!</button>
    <script>
      $(document).ready(function () {
        $("#btn").click(function () {
          //下面是在实验楼环境里运行过的 url,你需要根据注意里的步骤,将后端运行起来后,把web 服务页面中的 url 替换到对应位置,下面一行注释给出了需要替换的位置。
          //"需要将 web 服务中 url 粘贴到这里/gettest"
          $.get("https://042bc5dd9bf0.simplelab.cn/gettest", function (result) {
            alert(result);
          });
        });
      });
    </script>
  </body>
</html>

点击 click me 按钮,就会发出一个 get 请求,请求成功后,会调用 function 回调函数弹出结果。

JQuery - 图106

3.1.3 $.post()

post() 方法通过 HTTP POST 请求从服务器载入数据,post 方法和 get 方法比较类似。但还是存在一些区别:

  • get 请求会将参数跟在 url 后面进行传递,而 post 请求的参数则是作为 HTTP 的消息的实体内容,在 AJAX 请求中,这种区别对用户是不可见的。
  • get 请求对传输的数据有大小限制,一般是小于 2KB 的,而 post 理论上没有限制。
  • get 请求的数据会被浏览器缓存起来,一些敏感数据同样会被缓存,而 post 则可以避免这个问题。

语法:

jQuery.post(url, data, success(data, textStatus, jqXHR), dataType);
参数 描述
url 必须,请求的 url
data 可选,发送到服务器的数据
success(data,textStatus,jqXHR) 可选,当请求成功时运行该方法 data-包含来自请求的结果数据 textStatus-包含请求的状态 jqXHR-XMLHttpRequest 对象
dataType 可选,规定预计接收服务端的响应的数据,可能的类型有 xml、html、text、script、json

post() 方法是 ajax 方法的简写形式,我们还没有介绍 ajax 方法,但是这里我们给出 post 等价的 ajax 形式:

$.ajax({
  type: "POST",
  url: url,
  data: data,
  success: success,
  dataType: dataType,
});

下面是一个简单的 post 的示例

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
  </head>
  <body>
    <button id="btn">click me</button>
    <script>
      var data = {
        name: "syl",
        id: 1,
      };
      $(document).ready(function () {
        $("#btn").click(function () {
          //下面是在实验楼环境里运行过的 url,你需要根据注意里的步骤,将后端运行起来后,把web 服务页面中的 url 替换到对应位置,下面一行注释给出了需要替换的位置。
          //"需要将 web 服务中 url 粘贴到这里/posttest"
          $.post(
            "https://042bc5dd9bf0.simplelab.cn/posttest",
            data,
            function (result) {
              alert(result);
            }
          );
        });
      });
    </script>
  </body>
</html>

我们要发送的数据为:

var data = {
  name: "syl",
  id: 1,
};

点击按钮,将数据发送到服务端,经过服务端的逻辑处理后,返回了处理后的数据,如下图:

JQuery - 图107

你可能已经发现了,post 和 get 方法只存在方法名的区别。另外,当 load() 方法带有参数传递的时候,会使用 POST 方式发送请求,因此,上述代码我们可以使用 load 来改写:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
  </head>
  <body>
    <button id="btn">click me</button>
    <div id="result"></div>
    <script>
      var data = {
        name: "syl",
        id: 1,
      };
      $(document).ready(function () {
        $("#btn").click(function () {
          //下面是在实验楼环境里运行过的 url,你需要根据注意里的步骤,将后端运行起来后,把web 服务页面中的 url 替换到对应位置,下面一行注释给出了需要替换的位置。
          //"需要将 web 服务中 url 粘贴到这里/posttest"
          $("#result").load(
            "https://042bc5dd9bf0.simplelab.cn/posttest",
            data,
            function (result) {
              alert(result);
            }
          );
        });
      });
    </script>
  </body>
</html>

JQuery - 图108

3.2 $.getScript() 、 $.getJSON()

3.2.1 $.getScript()

有时,在页面第一次加载时就获取所需的全部的 JavaScript 文件并没有必要,虽然可以在需要哪个 JS 文件时动态的创建 script 标签,但是这种动态创建的方法并不理想,为此 jQuery 提供了 $.getScript() 方法来直接加载 js 文件,加载的 js 文件会自动执行。getScript 通过 HTTP GET 请求载入并执行 JavaScript 文件,语法:

jQuery.getScript(url, success(response, status));
参数 描述
url 请求的 url 地址
success(response,status) 可选,请求成功后执行的回调函数。 response-包含来自请求的结果数据 status-包含请求的状态

这个函数同样是简写的 ajax 函数,等价于

$.ajax({
  type: "GET",
  url: url,
  dataType: "script",
  success: success,
});

下面我们来看一个简单的示例,通过 $.getScript() 方法来动态的加载一段 js 脚本。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
  </head>
  <body>
    <button id="btn">click me</button>
    <script>
      $(document).ready(function () {
        $("#btn").click(function () {
          $.getScript("https://042bc5dd9bf0.simplelab.cn/getscripttest");
          //上面是在实验楼环境里运行过的 url,你需要根据注意里的步骤,将后端运行起来后,把web 服务页面中的 url 替换到对应位置,下面一行注释给出了需要替换的位置。
          //"需要将 web 服务中 url 粘贴到这里/getscripttest"
        });
      });
    </script>
  </body>
</html>

点击按钮,可以看到出现了一个弹框,这个逻辑是我们请求得到的 js 文件中写的。

alert("This file was loaded dynamically by method getScript()!");

JQuery - 图109

3.2.2 $.getJSON()

.getJson() 用于加载 JSON 文件,与.getJson()用于加载JSO*N文件,与.getScript() 的用法相同。语法:

jQuery.getJSON(url, data, success(data, status, xhr));
参数 描述
url 请求的 url 地址
data 可选,发送到服务端的数据
success(data,status,xhr) 可选,请求成功后执行的回调函数。 data-包含来自请求的结果数据 status-包含请求的状态 xhr-XMLHttpRequest 对象

该函数还是简写的 Ajax 函数,等价于:

$.ajax({
  type: "GET",
  url: url,
  data: data,
  success: callback,
  dataType: json,
});

发送到服务器的数据 data 可作为查询字符串附加到 URL 之后。传递给 success 的返回数据 data 可以是 js 对象,也可以是 json 结构的数组,需要使用 $.parseJSON() 进行解析。

下面给出一个简单的示例:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
  </head>
  <body>
    <button id="btn">click me</button>
    <script>
      $(document).ready(function () {
        $("#btn").click(function () {
          //下面是在实验楼环境里运行过的 url,你需要根据注意里的步骤,将后端运行起来后,把web 服务页面中的 url 替换到对应位置,下面一行注释给出了需要替换的位置。
          //"需要将 web 服务中 url 粘贴到这里/getjsontest"
          $.getJSON(
            "https://042bc5dd9bf0.simplelab.cn/getjsontest",
            function (data) {
              alert(
                typeof data +
                  "\n" +
                  data[0].id +
                  " " +
                  data[0].name +
                  "\n" +
                  data[1].id +
                  " " +
                  data[1].name +
                  "\n" +
                  data[2].id +
                  " " +
                  data[2].name +
                  "\n"
              );
            }
          );
        });
      });
    </script>
  </body>
</html>

我们向服务器发送了一个 get 请求,请求返回 JSON 数据,结果如下图:

JQuery - 图110

可以看到返回的是一个 object 类型的数据,符合结果。

四、$.ajax()

$.ajax 是 jQuery 最底层的实现,它的语法为:

\$.ajax(options);

options 是一个 {},里面包含了 ajax 请求的参数,我们之前介绍的方法都可以通过 ajax 来实现,下面我们来看一看常用的参数:

参数 类型 描述
url String 发送请求的地址
type String 请求的方式,例如我们之前使用过的 GET、POST,除此之外,还有其他的 HTTP 方法
timeout Number 设置请求超时时间(毫秒)
data Object 或 String 发送到服务器的数据
dataType String 预期服务器返回的数据类型,如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息返回 responseXML 或 responseText,并作为回调函数参数传递,有如下这些常用类型:xml、html、script、json、jsonp、text 等。
beforeSend Function 发送请求前可以修改 XMLHttpRequest 对象的函数,比如可以添加自定义的 HTTP 请求头,判读是否发送本次 Ajax 请求等,XMLHttpRequest 对象是唯一的参数
complete Function 请求完成后调用的回调函数(请求成功或失败都要调用该函数) ,参数:XMLHttpRequest 对象和描述成功请求类型的字符串 textStatus
success Function 请求成功后调用的回调函数,参数:由服务器返回,并根据 dataType 处理后的数据,还有一个是 textStatus
error Function 请求失败时被调用的函数,参数:XMLHttpRequest 对象、错误信息、捕获的错误对象(可选)
contentType String 发送信息至服务器时内容的编码,默认为 application/x-www-form-urlencoded

其它不常用的参数可以自行查看 w3c 提供的文档。

下面给出一个 ajax 方法的示例:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
  </head>
  <body>
    <h2>Game</h2>
    <h3>猜数字</h3>
    <span>答案是0-100之间的整数</span>
    <input id="content" />
    <button id="btn">guess</button>
    <script>
      $(document).ready(function () {
        $("#btn").click(function () {
          //下面面是在实验楼环境里运行过的 url,你需要根据注意里的步骤,将后端运行起来后,把web 服务页面中的 url 替换到对应位置,下面一行注释给出了需要替换的位置。
          //"需要将 web 服务中 url 粘贴到这里/ajaxtest"
          $.ajax({
            type: "POST",
            url: "https://042bc5dd9bf0.simplelab.cn/ajaxtest",
            data: {
              value: $("#content").val(),
            },
            dataType: "text",
            beforeSend: function (xhr) {
              var reg = /^((?!0)\d{1,2}|100)$/;
              if (!reg.test(parseInt($("#content").val()))) {
                xhr.abort();
                alert("请输入 0 - 100 的正整数!");
              }
            },
            success: function (result) {
              alert(result);
            },
            error: function (xhr, e) {
              console.log(e);
            },
          });
        });
      });
    </script>
  </body>
</html>

这是一个猜数字游戏,在输入框中输入数字,点击按钮,发送 ajax 请求,由后端处理后返回结果,下面给出后端处理部分的逻辑代码:

router.post("/ajaxtest", function (req, res, next) {
  if (req.body.value == 23) res.send("恭喜你,猜对了!");
  else res.send("不是 " + req.body.value + " 哦,别灰心,再接再厉!");
});

我们在 beforeSend 参数中设置了一个正则判断,需要满足输入的数字为 0-100 的整数才会发送 ajax 请求,否则会调用 abort() 取消这次 ajax 请求。

JQuery - 图111

JQuery - 图112

五、jQuery 中的全局 AJAX 事件

想象这样一个应用场景,用户点击了一个按钮,而这个请求需要相当长的时间才能返回,如果页面上没有提示信息,用户很容易就失去耐心,所以我们需要对 ajax 请求有一个全局的监控。jQuery 中 AJAX 的全局事件有:

方法 描述
ajaxStart(callback) Ajax 请求开始时执行的函数
ajaxComplete(callback) Ajax 请求完成时执行的函数
ajaxError(callback) Ajax 请求发生错误时执行的函数,捕捉到的错误可以作为最后一个参数传递
ajaxSend(callback) Ajax 请求发送前执行的函数
ajaxSuccess(callback) Ajax 请求成功时执行的函数
ajaxStop(callback) Ajax 请求结束时执行的函数

例如:

$("$test").ajaxStart(function () {
  $(this).show();
});
$("$test").ajaxStop(function () {
  $(this).hide();
});

如果想要某个 ajax 请求不受全局事件监听影响,那么可以在使用 $.ajax 时,把参数中的 global 设置为 false。

六、总结

在本节实验中,我们学习了 ajax 的相关知识以及 jQuery 中 ajax 的常用操作。

jQuery 插件的使用和写法

一、实验介绍

1.1 实验内容

插件(Plugin)也成为扩展(Extension)是一种遵循一定规范的应用程序接口编写出来的程序。最新最全的插件可以从 jQuery 官方网站的插件板块中获取,网站地址为:https://plugins.jquery.com/ 。本节中我们会介绍几个常用的 jQuery 插件。

1.2 实验知识点

  • jQuery 表单验证插件 Validation
  • jQuery Cookie 插件
  • jQuery UI 插件(重点介绍)

1.3 实验环境

  • Theia: 一款前后端分离的、基于 web 的 云 IDE。
  • Preview 或 Mini Browser:浏览器,右键点击目标 html 文件,选择 open with 下的 Preview 或 Mini Browser 即可在 IDE 中打开浏览器。

1.4 参考链接

二、jQuery 表单验证插件 Validation

我们来介绍第一个插件:Validation。

2.1 Validation 简介

最常使用 JavaScript 的场合就是表单的验证,jQuery 中提供了一个优秀的表单验证插件 Validation。Validation 是历史最悠久的 jQuery 插件之一,得到了众多 Web 开发者的好评,作为一个标准的验证方法库,Validation 有如下特点:

  • 内置验证规则:拥有必填、数字、E-Mail、URL 和信用卡号码等 19 种类内置验证规则。
  • 自定义验证规则:可以很方便地自定义验证规则。
  • 简单强大的验证信息提示:默认了验证信息提示,并提供自定义覆盖默认提示信息的功能。
  • 实时验证:可以通过 keyup 或 blur 事件触发验证,而不仅仅在表单提交的时候验证。

2.2 下载地址

可以访问 jQuery Validate 官网,下载最新版的 jQuery Validate 插件。也可以使用命令下载(这里下载的是 1.19.0 版本,jQuery 使用的是 3.3.1 版本):

wget https://labfile.oss.aliyuncs.com/courses/22/jquery.validate.js

2.3 简单的例子

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script type="text/javascript" src="jquery.validate.js"></script>
    <style type="text/css">
      * {
        font-family: Verdana;
        font-size: 96%;
      }

      label {
        width: 10em;
        float: left;
      }

      label.error {
        float: none;
        color: red;
        padding-left: 0.5em;
        vertical-align: top;
      }

      p {
        clear: both;
      }

      .submit {
        margin-left: 12em;
      }

      em {
        font-weight: bold;
        padding-right: 1em;
        vertical-align: top;
      }
    </style>
  </head>
  <body>
    <form class="cmxform" id="commentForm" method="get" action="">
      <fieldset>
        <legend>一个简单的带验证提示的评论例子</legend>
        <p>
          <label for="cusername">姓名</label>
          <em>*</em
          ><input
            id="cusername"
            name="username"
            size="25"
            class="required"
            minlength="2"
          />
        </p>
        <p>
          <label for="cemail">邮箱</label>
          <em>*</em
          ><input id="cemail" name="email" size="25" class="required email" />
        </p>
        <p>
          <label for="curl">网址</label>
          <em> </em
          ><input id="curl" name="url" size="25" class="url" value="" />
        </p>
        <p>
          <label for="ccomment">评论</label>
          <em>*</em
          ><textarea
            id="ccomment"
            name="comment"
            cols="22"
            class="required"
          ></textarea>
        </p>
        <p>
          <input class="submit" type="submit" value="提交" />
        </p>
      </fieldset>
    </form>

    <script type="text/javascript">
      $(document).ready(function () {
        $("#commentForm").validate();
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图113

我们发现当输入字符的时候,表单元素会实时的相应验证信息,而不是像我们原生的 HTML5 表单中那样只有当用户单击“提交”按钮后才可以出现,这样做能实时的提示用户输入符合格式的数据,极大地提高了用户体验。而且从例子来看,也很简单:

(1) 引入 jQuery 和 validate。

(2) 确定哪个表单需要被验证。

$("#commentForm").validate();

(3)针对不同的字段,进行验证规则编码,设置字段相应的属性:

  • class="required" 表示必须填写,minlength=”2” 表示最小长度为 2。
  • class="required email" 表示必须填写符合 E-mail 格式的内容。
  • class="url" 表示为 url 格式验证。

2.4 默认规则

默认的校验规则:

1 required:true 必须输入的字段。

2 remote:"check.php" 使用 ajax 方法调用 check.php 验证输入值。

3 email:true 必须输入正确格式的电子邮件。

4 url:true 必须输入正确格式的网址。

5 date:true 必须输入正确格式的日期。日期校验 ie6 出错,慎用。

6 dateISO:true 必须输入正确格式的日期(ISO),例如:2009-06-23,1998/01/22。只验证格式,不验证有效性。

7 number:true 必须输入合法的数字(负数,小数)。

8 digits:true 必须输入整数。

9 creditcard: 必须输入合法的信用卡号。

10 equalTo:"#field" 输入值必须和 #field 相同。

11 accept: 输入拥有合法后缀名的字符串(上传文件的后缀)。

12 maxlength:5 输入长度最多是 5 的字符串(汉字算一个字符)。

13 minlength:10 输入长度最小是 10 的字符串(汉字算一个字符)。

14 rangelength:[5,10] 输入长度必须介于 5 和 10 之间的字符串(汉字算一个字符)。

15 range:[5,10] 输入值必须介于 5 和 10 之间。

16 max:5 输入值不能大于 5。

17 min:10 输入值不能小于 10。

默认的信息提示:

messages: {
    required: "This field is required.",
    remote: "Please fix this field.",
    email: "Please enter a valid email address.",
    url: "Please enter a valid URL.",
    date: "Please enter a valid date.",
    dateISO: "Please enter a valid date ( ISO ).",
    number: "Please enter a valid number.",
    digits: "Please enter only digits.",
    creditcard: "Please enter a valid credit card number.",
    equalTo: "Please enter the same value again.",
    maxlength: $.validator.format( "Please enter no more than {0} characters." ),
    minlength: $.validator.format( "Please enter at least {0} characters." ),
    rangelength: $.validator.format( "Please enter a value between {0} and {1} characters long." ),
    range: $.validator.format( "Please enter a value between {0} and {1}." ),
    max: $.validator.format( "Please enter a value less than or equal to {0}." ),
    min: $.validator.format( "Please enter a value greater than or equal to {0}." )
}

2.5 不同的验证写法

除了上述例子提到的将校验规则写到控件中,我们还可以将校验规则写到 js 代码中。比如上面的例子可以改写成:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script type="text/javascript" src="jquery.validate.js"></script>
    <script type="text/javascript" src="jquery.metadata.js"></script>
    <style type="text/css">
      * {
        font-family: Verdana;
        font-size: 96%;
      }

      label {
        width: 10em;
        float: left;
      }

      label.error {
        float: none;
        color: red;
        padding-left: 0.5em;
        vertical-align: top;
      }

      p {
        clear: both;
      }

      .submit {
        margin-left: 12em;
      }

      em {
        font-weight: bold;
        padding-right: 1em;
        vertical-align: top;
      }
    </style>
  </head>
  <body>
    <form class="cmxform" id="commentForm" method="get" action="">
      <fieldset>
        <legend>一个简单的验证带验证提示的评论例子</legend>
        <p>
          <label for="cusername">姓名</label>
          <em>*</em><input id="cusername" name="username" size="25" />
        </p>
        <p>
          <label for="cemail">电子邮件</label>
          <em>*</em><input id="cemail" name="email" size="25" />
        </p>
        <p>
          <label for="curl">网址</label>
          <em> </em><input id="curl" name="url" size="25" value="" />
        </p>
        <p>
          <label for="ccomment">你的评论</label>
          <em>*</em><textarea id="ccomment" name="comment" cols="22"></textarea>
        </p>
        <p>
          <input class="submit" type="submit" value="提交" />
        </p>
      </fieldset>
    </form>

    <script type="text/javascript">
      $(document).ready(function () {
        $("#commentForm").validate({
          rules: {
            username: {
              required: true,
              minlength: 2,
            },
            email: {
              required: true,
              email: true,
            },
            url: "url",
            comment: "required",
          },
        });
      });
    </script>
  </body>
</html>

运行效果是完全一样的,只不过这里更改了校验规则的写法。

2.6 验证信息

(1)汉化

jQuery Validate 提供了中文信息提示包,位于下载包的 dist/localization/messages_zh.js,内容如下:

(function (factory) {
  if (typeof define === "function" && define.amd) {
    define(["jquery", "../jquery.validate"], factory);
  } else if (typeof module === "object" && module.exports) {
    module.exports = factory(require("jquery"));
  } else {
    factory(jQuery);
  }
})(function ($) {
  /*
   * Translated default messages for the jQuery validation plugin.
   * Locale: ZH (Chinese, 中文 (Zhōngwén), 汉语, 漢語)
   */
  $.extend($.validator.messages, {
    required: "这是必填字段",
    remote: "请修正此字段",
    email: "请输入有效的电子邮件地址",
    url: "请输入有效的网址",
    date: "请输入有效的日期",
    dateISO: "请输入有效的日期 (YYYY-MM-DD)",
    number: "请输入有效的数字",
    digits: "只能输入数字",
    creditcard: "请输入有效的信用卡号码",
    equalTo: "你的输入不相同",
    extension: "请输入有效的后缀",
    maxlength: $.validator.format("最多可以输入 {0} 个字符"),
    minlength: $.validator.format("最少要输入 {0} 个字符"),
    rangelength: $.validator.format("请输入长度在 {0} 到 {1} 之间的字符串"),
    range: $.validator.format("请输入范围在 {0} 到 {1} 之间的数值"),
    step: $.validator.format("请输入 {0} 的整数倍值"),
    max: $.validator.format("请输入不大于 {0} 的数值"),
    min: $.validator.format("请输入不小于 {0} 的数值"),
  });
  return $;
});

当然还有其他语言,大家有兴趣的可以自行尝试。这里使用方式也很简单,只需要把前面的代码中引入 messages_zh.js 即可。使用命令下载:

wget https://labfile.oss.aliyuncs.com/courses/22/messages_zh.js

然后再引入:

<script type="text/javascript" src="messages_zh.js"></script>

注意,这里的汉化包要放到验证的 js 后面。

最终的运行效果就变成中文提示的了:

JQuery - 图114

(2)自定义验证信息

Validation 可以很方便地自定义验证规则,来代替千篇一律的默认验证信息。比如:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script type="text/javascript" src="jquery.validate.js"></script>
    <script type="text/javascript" src="jquery.metadata.js"></script>
    <style type="text/css">
      * {
        font-family: Verdana;
        font-size: 96%;
      }

      label {
        width: 10em;
        float: left;
      }

      label.error {
        float: none;
        color: red;
        padding-left: 0.5em;
        vertical-align: top;
      }

      p {
        clear: both;
      }

      .submit {
        margin-left: 12em;
      }

      em {
        font-weight: bold;
        padding-right: 1em;
        vertical-align: top;
      }
    </style>
  </head>
  <body>
    <form class="cmxform" id="commentForm" method="get" action="">
      <fieldset>
        <legend>一个简单的验证带验证提示的评论例子</legend>
        <p>
          <label for="cusername">姓名</label>
          <em>*</em><input id="cusername" name="username" size="25" />
        </p>
        <p>
          <label for="cemail">电子邮件</label>
          <em>*</em><input id="cemail" name="email" size="25" />
        </p>
        <p>
          <label for="curl">网址</label>
          <em> </em><input id="curl" name="url" size="25" value="" />
        </p>
        <p>
          <label for="ccomment">你的评论</label>
          <em>*</em><textarea id="ccomment" name="comment" cols="22"></textarea>
        </p>
        <p>
          <input class="submit" type="submit" value="提交" />
        </p>
      </fieldset>
    </form>

    <script type="text/javascript">
      $(document).ready(function () {
        $("#commentForm").validate({
          rules: {
            username: {
              required: true,
              minlength: 2,
            },
            email: {
              required: true,
              email: true,
            },
            url: "url",
            comment: "required",
          },
          messages: {
            username: {
              required: "请输入用户名",
              minlength: "用户名必需由两个字母组成",
            },
            email: {
              required: "请输入邮箱",
              email: "请输入正确的邮箱",
            },
            url: "请输入正确的url",
            comment: "请输入评论",
          },
        });
      });
    </script>
  </body>
</html>

注:messages 处,如果某个控件没有 message,将调用默认的信息。

运行效果为:

JQuery - 图115

(3)自定义验证信息并美化

为验证信息添加上图片来美化,也很简单。只需在 jQuery 代码中添加:

errorElement: "em", //可以用其他标签,记住把样式也对应修改
success: function(label) {
    //label指向上面那个错误提示信息标签em
    label.text(" ") //清空错误提示消息
        .addClass("success"); //加上自定义的success类
}

css 代码中添加如下代码,以便于 errorElement 相关联:

em.error {
  background: url("unchecked.gif") no-repeat 0px 0px;
  padding-left: 16px;
}

em.success {
  background: url("checked.gif") no-repeat 0px 0px;
  padding-left: 16px;
}

所需要的图片通过命令下载:

wget https://labfile.oss.aliyuncs.com/courses/22/checked.gif
wget https://labfile.oss.aliyuncs.com/courses/22/unchecked.gif

完整的代码例子为:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script type="text/javascript" src="jquery.validate.js"></script>
    <style type="text/css">
      * {
        font-family: Verdana;
        font-size: 96%;
      }

      label {
        width: 10em;
        float: left;
      }

      label.error {
        float: none;
        color: red;
        padding-left: 0.5em;
        vertical-align: top;
      }

      p {
        clear: both;
      }

      .submit {
        margin-left: 12em;
      }

      em {
        font-weight: bold;
        padding-right: 1em;
        vertical-align: top;
      }

      em.error {
        background: url("unchecked.gif") no-repeat 0px 0px;
        padding-left: 16px;
      }

      em.success {
        background: url("checked.gif") no-repeat 0px 0px;
        padding-left: 16px;
      }
    </style>
  </head>
  <body>
    <form class="cmxform" id="commentForm" method="get" action="">
      <fieldset>
        <legend>一个简单的验证带验证提示的评论例子</legend>
        <p>
          <label for="cusername">姓名</label>
          <em>*</em><input id="cusername" name="username" size="25" />
        </p>
        <p>
          <label for="cemail">电子邮件</label>
          <em>*</em><input id="cemail" name="email" size="25" />
        </p>
        <p>
          <label for="curl">网址</label>
          <em> </em><input id="curl" name="url" size="25" value="" />
        </p>
        <p>
          <label for="ccomment">你的评论</label>
          <em>*</em><textarea id="ccomment" name="comment" cols="22"></textarea>
        </p>
        <p>
          <input class="submit" type="submit" value="提交" />
        </p>
      </fieldset>
    </form>

    <script type="text/javascript">
      $(document).ready(function () {
        $("#commentForm").validate({
          rules: {
            username: {
              required: true,
              minlength: 2,
            },
            email: {
              required: true,
              email: true,
            },
            url: "url",
            comment: "required",
          },

          messages: {
            username: {
              required: "请输入姓名",
              minlength: "请至少输入两个字符",
            },
            email: {
              required: "请输入电子邮件",
              email: "请检查电子邮件的格式",
            },
            url: "请检查网址的格式",
            comment: "请输入您的评论",
          },

          errorElement: "em", //可以用其他标签,记住把样式也对应修改
          success: function (label) {
            //label指向上面那个错误提示信息标签em
            label
              .text(" ") //清空错误提示消息
              .addClass("success"); //加上自定义的success类
          },
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图116

2.7 自定义验证规则

(1)自定义一个验证规则

//自定义一个验证方法
$.validator.addMethod(
  "formula", //验证方法名称
  function (value, element, param) {
    //验证规则
    return value == eval(param);
  },
  "请正确输入数学公式计算后的结果" //验证提示信息
);

(2)调用该验证规则。

$("#commentForm").validate({
  rules: {
    username: {
      required: true,
      minlength: 2,
    },
    email: {
      required: true,
      email: true,
    },
    url: "url",
    comment: "required",
    valcode: { formula: "1+1" },
  },
});

完整的代码为:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script type="text/javascript" src="jquery.validate.js"></script>
    <style type="text/css">
      * {
        font-family: Verdana;
        font-size: 96%;
      }

      label {
        width: 10em;
        float: left;
      }

      label.error {
        float: none;
        color: red;
        padding-left: 0.5em;
        vertical-align: top;
      }

      p {
        clear: both;
      }

      .submit {
        margin-left: 12em;
      }

      em {
        font-weight: bold;
        padding-right: 1em;
        vertical-align: top;
      }

      em.error {
        background: url("unchecked.gif") no-repeat 0px 0px;
        padding-left: 16px;
      }

      em.success {
        background: url("checked.gif") no-repeat 0px 0px;
        padding-left: 16px;
      }
    </style>
  </head>
  <body>
    <form class="cmxform" id="commentForm" method="get" action="">
      <fieldset>
        <legend>一个简单的验证带验证提示的评论例子</legend>
        <p>
          <label for="cusername">姓名</label>
          <em>*</em><input id="cusername" name="username" size="25" />
        </p>
        <p>
          <label for="cemail">电子邮件</label>
          <em>*</em><input id="cemail" name="email" size="25" />
        </p>
        <p>
          <label for="curl">网址</label>
          <em> </em><input id="curl" name="url" size="25" value="" />
        </p>
        <p>
          <label for="ccomment">你的评论</label>
          <em>*</em><textarea id="ccomment" name="comment" cols="22"></textarea>
        </p>
        <p>
          <label for="cvalcode">验证码</label>
          1+1=<input id="cvalcode" name="valcode" size="25" value="" />
        </p>
        <p>
          <input class="submit" type="submit" value="提交" />
        </p>
      </fieldset>
    </form>

    <script type="text/javascript">
      $(document).ready(function () {
        //自定义一个验证方法
        $.validator.addMethod(
          "formula", //验证方法名称
          function (value, element, param) {
            //验证规则
            return value == eval(param);
          },
          "请正确输入数学公式计算后的结果" //验证提示信息
        );

        $("#commentForm").validate({
          rules: {
            username: {
              required: true,
              minlength: 2,
            },
            email: {
              required: true,
              email: true,
            },
            url: "url",
            comment: "required",
            valcode: {
              formula: "1+1",
            },
          },

          messages: {
            username: {
              required: "请输入姓名",
              minlength: "请至少输入两个字符",
            },
            email: {
              required: "请输入电子邮件",
              email: "请检查电子邮件的格式",
            },
            url: "请检查网址的格式",
            comment: "请输入您的评论",
          },

          errorElement: "em", //用来创建错误提示信息标签
          success: function (label) {
            //验证成功后的执行的回调函数
            //label指向上面那个错误提示信息标签em
            label
              .text(" ") //清空错误提示消息
              .addClass("success"); //加上自定义的success类
          },
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图117

2.8 了解更多

更多实例大家可以访问 jQuery Validate 官网下载,里面有个 demo 文件夹大家可以尝试去看看里面的例子,如下所示:

JQuery - 图118

三、jQuery Cookie 插件

jQuery 可以通过 jquery.cookie.js 插件来操作 Cookie。它的 github 网址是:https://github.com/carhartl/jquery-cookie。我们进入这个网站,我们会发现这样一句话:

No longer maintained, superseded by JS Cookie: https://github.com/js-cookie/js-cookie

JQuery - 图119

也就是说这个插件现在已经没有维护了,并且都转移到了 js-cookie,那么我们再讲 jquery cookie 插件的话其实意义不大了,大家可以自行到 github 上看看它的使用说明,下面我们着重讲解 js-cookie。

3.1 下载地址

https://github.com/js-cookie/js-cookie

大家可以进入该页面,查看说明以及下载该插件,如下图所示:

JQuery - 图120

实验环境下使用命令下载:

wget https://labfile.oss.aliyuncs.com/courses/22/js.cookie.js

3.2 使用方法

(1)创建一个 cookie,在整个站点中有效:

Cookies.set("name", "value");

(2)创建一个 7 天后到期的 cookie,在整个站点上都有效:

Cookies.set("name", "value", { expires: 7 });

(3)创建一个到期的 cookie,对当前页的路径有效:

Cookies.set("name", "value", { expires: 7, path: "" });

(4)读取 cookie:

Cookies.get("name"); // => 'value'
Cookies.get("nothing"); // => undefined

(5)读取所有可见的 cookie:

Cookies.get(); // => { name: 'value' }

注意:不可能通过传递 cookie 属性之一来读取特定的 cookie:

Cookies.get("foo", { domain: "sub.example.com" }); // `domain` won't have any effect...!

(6)删除 cookie:

Cookies.remove("name");

(7)删除对当前页的路径有效的 cookie:

Cookies.set("name", "value", { path: "" });
Cookies.remove("name"); // fail!
Cookies.remove("name", { path: "" }); // removed!

注意:注意:删除 cookie 时,必须传递用于设置 cookie 的完全相同的路径,域及安全选项。删除不存在的 cookie 不会引发任何异常,也不会返回任何值。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script type="text/javascript" src="js.cookie.js"></script>
  </head>
  <body>
    <p id="test"></p>
    <p id="test2"></p>

    <script>
      $(document).ready(function () {
        Cookies.set("name", "syl"); // 创建 cookie
        name = Cookies.get("name"); // 读取 cookie
        $("#test").text(name);
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图121

另外大家可以 F12 进入调试模式在 Application 中的 cookies 中找到我们所存的 cookie 信息。

3.3 名称空间冲突

如果有任何与命名空间冲突的危险 Cookies,noConflict 方法将允许您定义新的命名空间并保留原始名称空间。这在第三方站点上运行脚本时尤其有用,例如作为小部件或 SDK 的一部分。

// Assign the js-cookie api to a different variable and restore the original "window.Cookies"
var Cookies2 = Cookies.noConflict();
Cookies2.set("name", "value");

注:.noConflict 方法在使用 AMD 或 CommonJS 时是不必要的,因此在这些环境中不公开它。

json

JS-cookie 为 cookie 提供了不引人注目的 JSON 存储。

创建 cookie 时,可以传递数组或对象文本,而不是值中的字符串。如果这样做,js-cookie 将根据以下内容存储对象的字符串表示形式:JSON.stringify:

Cookies.set("name", { foo: "bar" });

使用默认值读取 cookie 时 Cookies.getAPI,您将接收存储在 cookie 中的字符串表示:

Cookies.get("name"); // => '{"foo":"bar"}'
Cookies.get(); // => { name: '{"foo":"bar"}' }

当使用 Cookies.getJSONAPI,您将收到存储在 cookie 中的字符串的解析表示形式。JSON.parse:

Cookies.getJSON("name"); // => { foo: 'bar' }
Cookies.getJSON(); // => { name: { foo: 'bar' } }

注:支持 IE6-7(和 IE8 兼容模式)您需要包含 JSON-js 多填充:https://github.com/douglascrockford/JSON-js

四、jQuery UI 插件

下面我们来介绍 jQuery UI 插件。

4.1 jQuery UI 简介

jQuery UI 包含了许多维持状态的小部件(Widget),因此,它与典型的 jQuery 插件使用模式略有不同。所有的 jQuery UI 小部件(Widget)使用相同的模式,所以,只要您学会使用其中一个,您就知道如何使用其他的小部件(Widget)。

注:定义来自于 jQuery UI 中文官网

4.2 jQuery UI 组件构成

jQuery UI 主要分为 3 个部分:交互、微件和效果库:

  • 交互(Interactions),这里都是一些与鼠标交互相关的内容,包括缩放(Resizable) , 拖动(Draggable) , 放置(Droppable) , 选择(Selectable) , 排序(Sortable)等。
  • 微件(Widgets),主要是一些界面的扩展,包括折叠面板(Accordion) , 自动完成(Autocomplete) , 按钮(Button) , 日期选择器(Datepicker) , 对话框(Dialog) , 菜单(Menu) , 进度条(Progressbar) , 滑块(Slider) , 旋转器(Spinner) , 标签页(Tabs) , 工具提示框(Tooltip)等,新版本的 UI 将包含更多的微件。
  • 效果库(Effects)用于提供丰富的动画效果,让动画不再局限于 jQuery 的 animate()方法。包括特效(Effect) , 显示(Show) , 隐藏(Hide) , 切换(Toggle) , 添加 Class(Add Class) , 移除 Class(Remove Class) , 切换 Class(Toggle Class) , 转换 Class(Switch Class) , 颜色动画(Color Animation)等。

4.3 下载使用

jQuery UI 插件的下载地址为:https://jqueryui.com/download/,进入下载页面如下所示:

JQuery - 图122

然后我们可以自定义选择需要下载的组件,下载生成器(Download Builder)页面的第一栏列出了 jQuery UI 所有的 JavaScript 组件分类:核心(UI Core)、交互部件(Interactions)、小部件(Widgets)和效果库(Effects)。jQuery UI 中的一些组件依赖于其他组件,当选中这些组件时,它所依赖的其他组件也都会自动被选中。您所选的组件将会合并到一个 jQuery UI JavaScript 文件。另外需要注意的是 jQuery UI 的版本号对应的 jQuery 版本。

最后点击 Download 按钮,完成下载。您将得到一个包含您所选组件的自定义 zip 文件。比如我们这里下载的 1.12.1 版本解压后的效果图如下所示:

JQuery - 图123

在网页中使用,通常需要引入这三个文件:

<link rel="stylesheet" href="jquery-ui.css" />
<script type="text/javascript" src="jquery-3.3.1.js"></script>
<script src="jquery-ui.js"></script>

jquery-ui.css 和 jquery-ui.js 在环境中可以通过如下命令下载:

wget https://labfile.oss.aliyuncs.com/courses/22/jquery-ui.css
wget https://labfile.oss.aliyuncs.com/courses/22/jquery-ui.js

日期小部件的例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
  </head>
  <body>
    <input type="text" name="date" id="date" />

    <script>
      $(document).ready(function () {
        $("#date").datepicker();
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图124

jQuery UI 默认的图标:

wget https://labfile.oss.aliyuncs.com/courses/22/images.zip
unzip images.zip

4.4 交互(Interactions)

(1)排序(Sortable)

使用鼠标调整列表中或者网格中元素的排序。如需了解更多有关 sortable 交互的细节,请查看 API 官方文档 可排序小部件(Sortable Widget)

  • 默认功能:在任意的 DOM 元素上启用 sortable 功能。通过鼠标点击并拖拽元素到列表中的一个新的位置,其它条目会自动调整。默认情况下,sortable 各个条目共享 draggable 属性。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #sortable {
        list-style-type: none;
        margin: 0;
        padding: 0;
        width: 60%;
      }

      #sortable li {
        margin: 0 3px 3px 3px;
        padding: 0.4em;
        padding-left: 1.5em;
        font-size: 1.4em;
        height: 18px;
      }

      #sortable li span {
        position: absolute;
        margin-left: -1.3em;
      }
    </style>
  </head>
  <body>
    <ul id="sortable">
      <li class="ui-state-default">
        <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 1
      </li>
      <li class="ui-state-default">
        <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 2
      </li>
      <li class="ui-state-default">
        <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 3
      </li>
      <li class="ui-state-default">
        <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 4
      </li>
      <li class="ui-state-default">
        <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 5
      </li>
      <li class="ui-state-default">
        <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 6
      </li>
      <li class="ui-state-default">
        <span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 7
      </li>
    </ul>

    <script>
      $(document).ready(function () {
        $("#sortable").sortable();
        $("#sortable").disableSelection();
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图125

  • 连接列表:

通过向 connectWith 选项传递一个选择器,来把一个列表中的元素排序到另一个列表中,反之亦然。最简单的办法是将带有某个 CSS class 的所有相关的列表分组,然后传递该 class 到 sortable 函数(比如:connectWith: '.myclass')。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #sortable1,
      #sortable2 {
        list-style-type: none;
        margin: 0;
        padding: 0 0 2.5em;
        float: left;
        margin-right: 10px;
      }

      #sortable1 li,
      #sortable2 li {
        margin: 0 5px 5px 5px;
        padding: 5px;
        font-size: 1.2em;
        width: 120px;
      }
    </style>
  </head>
  <body>
    <ul id="sortable1" class="connectedSortable">
      <li class="ui-state-default">Item 1</li>
      <li class="ui-state-default">Item 2</li>
      <li class="ui-state-default">Item 3</li>
      <li class="ui-state-default">Item 4</li>
      <li class="ui-state-default">Item 5</li>
    </ul>

    <ul id="sortable2" class="connectedSortable">
      <li class="ui-state-highlight">Item 1</li>
      <li class="ui-state-highlight">Item 2</li>
      <li class="ui-state-highlight">Item 3</li>
      <li class="ui-state-highlight">Item 4</li>
      <li class="ui-state-highlight">Item 5</li>
    </ul>

    <script>
      $(document).ready(function () {
        $("#sortable1, #sortable2")
          .sortable({
            connectWith: ".connectedSortable",
          })
          .disableSelection();
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图126

  • 标签页连接列表:通过放置列表项到顶部适当的标签页中,来把一个列表中的元素排序到另一个列表中,反之亦然。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #sortable1 li,
      #sortable2 li {
        margin: 0 5px 5px 5px;
        padding: 5px;
        font-size: 1.2em;
        width: 120px;
      }
    </style>
  </head>
  <body>
    <div id="tabs">
      <ul>
        <li><a href="#tabs-1">Nunc tincidunt</a></li>
        <li><a href="#tabs-2">Proin dolor</a></li>
      </ul>
      <div id="tabs-1">
        <ul id="sortable1" class="connectedSortable ui-helper-reset">
          <li class="ui-state-default">Item 1</li>
          <li class="ui-state-default">Item 2</li>
          <li class="ui-state-default">Item 3</li>
          <li class="ui-state-default">Item 4</li>
          <li class="ui-state-default">Item 5</li>
        </ul>
      </div>
      <div id="tabs-2">
        <ul id="sortable2" class="connectedSortable ui-helper-reset">
          <li class="ui-state-highlight">Item 1</li>
          <li class="ui-state-highlight">Item 2</li>
          <li class="ui-state-highlight">Item 3</li>
          <li class="ui-state-highlight">Item 4</li>
          <li class="ui-state-highlight">Item 5</li>
        </ul>
      </div>
    </div>

    <script>
      $(document).ready(function () {
        $("#sortable1, #sortable2").sortable().disableSelection();

        var $tabs = $("#tabs").tabs();

        var $tab_items = $("ul:first li", $tabs).droppable({
          accept: ".connectedSortable li",
          hoverClass: "ui-state-hover",
          drop: function (event, ui) {
            var $item = $(this);
            var $list = $($item.find("a").attr("href")).find(
              ".connectedSortable"
            );

            ui.draggable.hide("slow", function () {
              $tabs.tabs("option", "active", $tab_items.index($item));
              $(this).appendTo($list).show("slow");
            });
          },
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图127

  • 延迟开始:通过时间延迟和距离延迟来防止意外的排序。通过 delay 选项设置开始排序之前必须拖拽的毫秒数。通过 distance 选项设置开始排序之前必须拖拽的像素数。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #sortable1,
      #sortable2 {
        list-style-type: none;
        margin: 0;
        padding: 0;
        margin-bottom: 15px;
        zoom: 1;
      }

      #sortable1 li,
      #sortable2 li {
        margin: 0 5px 5px 5px;
        padding: 5px;
        font-size: 1.2em;
        width: 95%;
      }
    </style>
  </head>
  <body>
    <h3 class="docs">时间延迟 300ms:</h3>

    <ul id="sortable1">
      <li class="ui-state-default">Item 1</li>
      <li class="ui-state-default">Item 2</li>
      <li class="ui-state-default">Item 3</li>
      <li class="ui-state-default">Item 4</li>
    </ul>

    <h3 class="docs">距离延迟 15px:</h3>

    <ul id="sortable2">
      <li class="ui-state-default">Item 1</li>
      <li class="ui-state-default">Item 2</li>
      <li class="ui-state-default">Item 3</li>
      <li class="ui-state-default">Item 4</li>
    </ul>

    <script>
      $(document).ready(function () {
        $("#sortable1").sortable({
          delay: 300,
        });

        $("#sortable2").sortable({
          distance: 15,
        });

        $("li").disableSelection();
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图128

  • 显示为网格:让 sortable 条目显示为网格,使用 CSS 使得它们带有相同的尺寸且浮动显示。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #sortable {
        list-style-type: none;
        margin: 0;
        padding: 0;
        width: 450px;
      }

      #sortable li {
        margin: 3px 3px 3px 0;
        padding: 1px;
        float: left;
        width: 100px;
        height: 90px;
        font-size: 4em;
        text-align: center;
      }
    </style>
  </head>
  <body>
    <ul id="sortable">
      <li class="ui-state-default">1</li>
      <li class="ui-state-default">2</li>
      <li class="ui-state-default">3</li>
      <li class="ui-state-default">4</li>
      <li class="ui-state-default">5</li>
      <li class="ui-state-default">6</li>
      <li class="ui-state-default">7</li>
      <li class="ui-state-default">8</li>
      <li class="ui-state-default">9</li>
      <li class="ui-state-default">10</li>
      <li class="ui-state-default">11</li>
      <li class="ui-state-default">12</li>
    </ul>

    <script>
      $(document).ready(function () {
        $("#sortable").sortable();
        $("#sortable").disableSelection();
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图129

  • 放置占位符:当拖拽一个 sortable 条目到一个新的位置时,其他条目将为该条目腾出空间。向 placeholder 选项传递一个 class 来定义可视化的空白的样式。使用布尔值的 forcePlaceholderSize 选项来设置占位符的尺寸。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #sortable {
        list-style-type: none;
        margin: 0;
        padding: 0;
        width: 60%;
      }

      #sortable li {
        margin: 0 5px 5px 5px;
        padding: 5px;
        font-size: 1.2em;
        height: 1.5em;
      }

      html > body #sortable li {
        height: 1.5em;
        line-height: 1.2em;
      }

      .ui-state-highlight {
        height: 1.5em;
        line-height: 1.2em;
      }
    </style>
  </head>
  <body>
    <ul id="sortable">
      <li class="ui-state-default">Item 1</li>
      <li class="ui-state-default">Item 2</li>
      <li class="ui-state-default">Item 3</li>
      <li class="ui-state-default">Item 4</li>
      <li class="ui-state-default">Item 5</li>
      <li class="ui-state-default">Item 6</li>
      <li class="ui-state-default">Item 7</li>
    </ul>

    <script>
      $(document).ready(function () {
        $("#sortable").sortable({
          placeholder: "ui-state-highlight",
        });
        $("#sortable").disableSelection();
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图130

  • 处理空列表:通过把 选项设置为 false,来阻止一个列表中的所有条目被放置到一个单独的空列表中。默认情况下,sortable 条目可被放置到空的列表中。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #sortable1,
      #sortable2,
      #sortable3 {
        list-style-type: none;
        margin: 0;
        padding: 0;
        float: left;
        margin-right: 10px;
        background: #eee;
        padding: 5px;
        width: 143px;
      }

      #sortable1 li,
      #sortable2 li,
      #sortable3 li {
        margin: 5px;
        padding: 5px;
        font-size: 1.2em;
        width: 120px;
      }
    </style>
  </head>
  <body>
    <ul id="sortable1" class="droptrue">
      <li class="ui-state-default">可被放置到..</li>
      <li class="ui-state-default">..一个空列表中</li>
      <li class="ui-state-default">Item 3</li>
      <li class="ui-state-default">Item 4</li>
      <li class="ui-state-default">Item 5</li>
    </ul>

    <ul id="sortable2" class="dropfalse">
      <li class="ui-state-highlight">不可被放置到..</li>
      <li class="ui-state-highlight">..一个空列表中</li>
      <li class="ui-state-highlight">Item 3</li>
      <li class="ui-state-highlight">Item 4</li>
      <li class="ui-state-highlight">Item 5</li>
    </ul>

    <ul id="sortable3" class="droptrue"></ul>

    <br style="clear:both" />

    <script>
      $(document).ready(function () {
        $("ul.droptrue").sortable({
          connectWith: "ul",
        });

        $("ul.dropfalse").sortable({
          connectWith: "ul",
          dropOnEmpty: false,
        });

        $("#sortable1, #sortable2, #sortable3").disableSelection();
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图131

  • 包含/排除条目:指定通过向 items 选项传递一个 jQuery 选择器哪些项目可排序。该选项之外的项目则是不可排序的,同时它们也不是 sortable 条目的有效的目标。如果只想防止特定的条目排序,则向 cancel 选项传递一个 jQuery 选择器。已取消的条目依然是其他条目的有效的排序目标。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #sortable1,
      #sortable2 {
        list-style-type: none;
        margin: 0;
        padding: 0;
        zoom: 1;
      }

      #sortable1 li,
      #sortable2 li {
        margin: 0 5px 5px 5px;
        padding: 3px;
        width: 90%;
      }
    </style>
  </head>
  <body>
    <h3 class="docs">指定哪个条目是 sortable:</h3>

    <ul id="sortable1">
      <li class="ui-state-default">Item 1</li>
      <li class="ui-state-default ui-state-disabled">
        (我不是 sortable 或者一个放置目标)
      </li>
      <li class="ui-state-default ui-state-disabled">
        (我不是 sortable 或者一个放置目标)
      </li>
      <li class="ui-state-default">Item 4</li>
    </ul>

    <h3 class="docs">取消排序(但作为放置目标):</h3>

    <ul id="sortable2">
      <li class="ui-state-default">Item 1</li>
      <li class="ui-state-default ui-state-disabled">(我不是 sortable)</li>
      <li class="ui-state-default ui-state-disabled">(我不是 sortable)</li>
      <li class="ui-state-default">Item 4</li>
    </ul>

    <script>
      $(document).ready(function () {
        $("#sortable1").sortable({
          items: "li:not(.ui-state-disabled)",
        });

        $("#sortable2").sortable({
          cancel: ".ui-state-disabled",
        });

        $("#sortable1 li, #sortable2 li").disableSelection();
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图132

  • 门户组件(Portlets):启用门户组件(样式化的 div)作为 sortable,并使用 connectWith 选项来允许在列之间进行排序。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      body {
        min-width: 520px;
      }

      .column {
        width: 170px;
        float: left;
        padding-bottom: 100px;
      }

      .portlet {
        margin: 0 1em 1em 0;
        padding: 0.3em;
      }

      .portlet-header {
        padding: 0.2em 0.3em;
        margin-bottom: 0.5em;
        position: relative;
      }

      .portlet-toggle {
        position: absolute;
        top: 50%;
        right: 0;
        margin-top: -8px;
      }

      .portlet-content {
        padding: 0.4em;
      }

      .portlet-placeholder {
        border: 1px dotted black;
        margin: 0 1em 1em 0;
        height: 50px;
      }
    </style>
  </head>
  <body>
    <div class="column">
      <div class="portlet">
        <div class="portlet-header">订阅</div>
        <div class="portlet-content">
          Lorem ipsum dolor sit amet, consectetuer adipiscing elit
        </div>
      </div>

      <div class="portlet">
        <div class="portlet-header">新闻</div>
        <div class="portlet-content">
          Lorem ipsum dolor sit amet, consectetuer adipiscing elit
        </div>
      </div>
    </div>

    <div class="column">
      <div class="portlet">
        <div class="portlet-header">购物</div>
        <div class="portlet-content">
          Lorem ipsum dolor sit amet, consectetuer adipiscing elit
        </div>
      </div>
    </div>

    <div class="column">
      <div class="portlet">
        <div class="portlet-header">链接</div>
        <div class="portlet-content">
          Lorem ipsum dolor sit amet, consectetuer adipiscing elit
        </div>
      </div>

      <div class="portlet">
        <div class="portlet-header">图像</div>
        <div class="portlet-content">
          Lorem ipsum dolor sit amet, consectetuer adipiscing elit
        </div>
      </div>
    </div>

    <script>
      $(document).ready(function () {
        $(".column").sortable({
          connectWith: ".column",
          handle: ".portlet-header",
          cancel: ".portlet-toggle",
          placeholder: "portlet-placeholder ui-corner-all",
        });

        $(".portlet")
          .addClass(
            "ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"
          )
          .find(".portlet-header")
          .addClass("ui-widget-header ui-corner-all")
          .prepend(
            "<span class='ui-icon ui-icon-minusthick portlet-toggle'></span>"
          );

        $(".portlet-toggle").click(function () {
          var icon = $(this);
          icon.toggleClass("ui-icon-minusthick ui-icon-plusthick");
          icon.closest(".portlet").find(".portlet-content").toggle();
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图133

(2)选择(Selectable)

使用鼠标选择单个元素或一组元素。如需了解更多有关 selectable 交互的细节,请查看 官方 API 文档 可选择小部件(Selectable Widget)

  • 默认功能:在某个 DOM 元素上或者一组元素上启用 selectable 功能。通过鼠标拖拽选择条目。按住 Ctrl 键,选择多个不相邻的条目。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #feedback {
        font-size: 1.4em;
      }

      #selectable .ui-selecting {
        background: #feca40;
      }

      #selectable .ui-selected {
        background: #f39814;
        color: white;
      }

      #selectable {
        list-style-type: none;
        margin: 0;
        padding: 0;
        width: 60%;
      }

      #selectable li {
        margin: 3px;
        padding: 0.4em;
        font-size: 1.4em;
        height: 18px;
      }
    </style>
  </head>
  <body>
    <ol id="selectable">
      <li class="ui-widget-content">Item 1</li>
      <li class="ui-widget-content">Item 2</li>
      <li class="ui-widget-content">Item 3</li>
      <li class="ui-widget-content">Item 4</li>
      <li class="ui-widget-content">Item 5</li>
      <li class="ui-widget-content">Item 6</li>
      <li class="ui-widget-content">Item 7</li>
    </ol>

    <script>
      $(document).ready(function () {
        $("#selectable").selectable();
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图134

  • 显示为网格:让 selectable 条目显示为网格,使用 CSS 使得它们带有相同的尺寸且浮动显示。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #feedback {
        font-size: 1.4em;
      }

      #selectable .ui-selecting {
        background: #feca40;
      }

      #selectable .ui-selected {
        background: #f39814;
        color: white;
      }

      #selectable {
        list-style-type: none;
        margin: 0;
        padding: 0;
        width: 450px;
      }

      #selectable li {
        margin: 3px;
        padding: 1px;
        float: left;
        width: 100px;
        height: 80px;
        font-size: 4em;
        text-align: center;
      }
    </style>
  </head>
  <body>
    <ol id="selectable">
      <li class="ui-state-default">1</li>
      <li class="ui-state-default">2</li>
      <li class="ui-state-default">3</li>
      <li class="ui-state-default">4</li>
      <li class="ui-state-default">5</li>
      <li class="ui-state-default">6</li>
      <li class="ui-state-default">7</li>
      <li class="ui-state-default">8</li>
      <li class="ui-state-default">9</li>
      <li class="ui-state-default">10</li>
      <li class="ui-state-default">11</li>
      <li class="ui-state-default">12</li>
    </ol>
    <script>
      $(document).ready(function () {
        $("#selectable").selectable();
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图135

  • 序列化:写一个函数,在 stop 事件发生时触发,来收集被选中条目的索引值。呈现这些值作为反馈,或者以数据字符串形式进行传递。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #feedback {
        font-size: 1.4em;
      }

      #selectable .ui-selecting {
        background: #feca40;
      }

      #selectable .ui-selected {
        background: #f39814;
        color: white;
      }

      #selectable {
        list-style-type: none;
        margin: 0;
        padding: 0;
        width: 60%;
      }

      #selectable li {
        margin: 3px;
        padding: 0.4em;
        font-size: 1.4em;
        height: 18px;
      }
    </style>
  </head>
  <body>
    <p id="feedback">
      <span>您已经选择了:</span> <span id="select-result">无</span>。
    </p>

    <ol id="selectable">
      <li class="ui-widget-content">Item 1</li>
      <li class="ui-widget-content">Item 2</li>
      <li class="ui-widget-content">Item 3</li>
      <li class="ui-widget-content">Item 4</li>
      <li class="ui-widget-content">Item 5</li>
      <li class="ui-widget-content">Item 6</li>
    </ol>

    <script>
      $(document).ready(function () {
        $("#selectable").selectable({
          stop: function () {
            var result = $("#select-result").empty();
            $(".ui-selected", this).each(function () {
              var index = $("#selectable li").index(this);
              result.append(" #" + (index + 1));
            });
          },
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图136

(3)放置(Droppable)

为可拖拽小部件创建目标。如需了解更多有关 droppable 交互的细节,请查看 官方 API 文档 可放置小部件(Droppable Widget)

  • 默认功能:在任意的 DOM 元素上启用 droppable 功能,并为可拖拽小部件创建目标。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #draggable {
        width: 100px;
        height: 100px;
        padding: 0.5em;
        float: left;
        margin: 10px 10px 10px 0;
      }

      #droppable {
        width: 150px;
        height: 150px;
        padding: 0.5em;
        float: left;
        margin: 10px;
      }
    </style>
  </head>
  <body>
    <div id="draggable" class="ui-widget-content">
      <p>请把我拖拽到目标处!</p>
    </div>

    <div id="droppable" class="ui-widget-header">
      <p>请放置在这里!</p>
    </div>

    <script>
      $(document).ready(function () {
        $("#draggable").draggable();
        $("#droppable").droppable({
          drop: function (event, ui) {
            $(this).addClass("ui-state-highlight").find("p").html("Dropped!");
          },
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图137

  • 接受:使用 accept 选项指定目标 droppable 接受哪一个元素(或元素组)。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #droppable {
        width: 150px;
        height: 150px;
        padding: 0.5em;
        float: left;
        margin: 10px;
      }

      #draggable,
      #draggable-nonvalid {
        width: 100px;
        height: 100px;
        padding: 0.5em;
        float: left;
        margin: 10px 10px 10px 0;
      }
    </style>
  </head>
  <body>
    <div id="draggable-nonvalid" class="ui-widget-content">
      <p>我是不能被放置的 draggable</p>
    </div>

    <div id="draggable" class="ui-widget-content">
      <p>请拖拽我到目标</p>
    </div>

    <div id="droppable" class="ui-widget-header">
      <p>accept: '#draggable'</p>
    </div>

    <script>
      $(document).ready(function () {
        $("#draggable, #draggable-nonvalid").draggable();
        $("#droppable").droppable({
          accept: "#draggable",
          activeClass: "ui-state-hover",
          hoverClass: "ui-state-active",
          drop: function (event, ui) {
            $(this).addClass("ui-state-highlight").find("p").html("Dropped!");
          },
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图138

  • 防止传播:当使用嵌套的 droppable 时 — 例如,您可以有一个树形的可编辑的目录结构,带有文件夹和文档节点 — greedy 选项设置为 true 来防止当 draggable 被放置在子节点(droppable)上时的事件传播。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #draggable {
        width: 100px;
        height: 40px;
        padding: 0.5em;
        float: left;
        margin: 10px 10px 10px 0;
      }

      #droppable,
      #droppable2 {
        width: 230px;
        height: 120px;
        padding: 0.5em;
        float: left;
        margin: 10px;
      }

      #droppable-inner,
      #droppable2-inner {
        width: 170px;
        height: 60px;
        padding: 0.5em;
        float: left;
        margin: 10px;
      }
    </style>
  </head>
  <body>
    <div id="draggable" class="ui-widget-content">
      <p>请拖拽我到目标</p>
    </div>

    <div id="droppable" class="ui-widget-header">
      <p>外部 droppable</p>
      <div id="droppable-inner" class="ui-widget-header">
        <p>内部 droppable(不带有 greedy)</p>
      </div>
    </div>

    <div id="droppable2" class="ui-widget-header">
      <p>外部 droppable</p>
      <div id="droppable2-inner" class="ui-widget-header">
        <p>内部 droppable(带有 greedy)</p>
      </div>
    </div>
    <script>
      $(document).ready(function () {
        $("#draggable").draggable();

        $("#droppable, #droppable-inner").droppable({
          activeClass: "ui-state-hover",
          hoverClass: "ui-state-active",
          drop: function (event, ui) {
            $(this).addClass("ui-state-highlight").find("> p").html("Dropped!");
            return false;
          },
        });

        $("#droppable2, #droppable2-inner").droppable({
          greedy: true,
          activeClass: "ui-state-hover",
          hoverClass: "ui-state-active",
          drop: function (event, ui) {
            $(this).addClass("ui-state-highlight").find("> p").html("Dropped!");
          },
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图139

  • 还原 draggable 的位置:当带有布尔值 revert 选项的 draggable 停止拖拽时,返回 draggable(或它的助手)到原始位置。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #draggable,
      #draggable2 {
        width: 100px;
        height: 100px;
        padding: 0.5em;
        float: left;
        margin: 10px 10px 10px 0;
      }

      #droppable {
        width: 150px;
        height: 150px;
        padding: 0.5em;
        float: left;
        margin: 10px;
      }
    </style>
  </head>
  <body>
    <div id="draggable" class="ui-widget-content">
      <p>当被放置在目标上时还原</p>
    </div>

    <div id="draggable2" class="ui-widget-content">
      <p>当未被放置在目标上时还原</p>
    </div>

    <div id="droppable" class="ui-widget-header">
      <p>请放置在这里</p>
    </div>

    <script>
      $(document).ready(function () {
        $("#draggable").draggable({
          revert: "valid",
        });
        $("#draggable2").draggable({
          revert: "invalid",
        });

        $("#droppable").droppable({
          activeClass: "ui-state-default",
          hoverClass: "ui-state-hover",
          drop: function (event, ui) {
            $(this).addClass("ui-state-highlight").find("p").html("已放置!");
          },
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图140

  • 购物车演示:演示如何使用折叠面板来展示产品的目录结构,使用拖拽和放置来添加产品到购物车,购物车中的产品是可排序的。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      h1 {
        padding: 0.2em;
        margin: 0;
      }

      #products {
        float: left;
        width: 500px;
        margin-right: 2em;
      }

      #cart {
        width: 200px;
        float: left;
        margin-top: 1em;
      }

      /* 定义列表样式,以便最大化 droppable */
      #cart ol {
        margin: 0;
        padding: 1em 0 1em 3em;
      }
    </style>
  </head>
  <body>
    <div id="products">
      <h1 class="ui-widget-header">产品</h1>
      <div id="catalog">
        <h2><a href="#">T-Shirts</a></h2>
        <div>
          <ul>
            <li>Lolcat Shirt</li>
            <li>Cheezeburger Shirt</li>
            <li>Buckit Shirt</li>
          </ul>
        </div>
        <h2><a href="#">Bags</a></h2>
        <div>
          <ul>
            <li>Zebra Striped</li>
            <li>Black Leather</li>
            <li>Alligator Leather</li>
          </ul>
        </div>
        <h2><a href="#">Gadgets</a></h2>
        <div>
          <ul>
            <li>iPhone</li>
            <li>iPod</li>
            <li>iPad</li>
          </ul>
        </div>
      </div>
    </div>

    <div id="cart">
      <h1 class="ui-widget-header">购物车</h1>
      <div class="ui-widget-content">
        <ol>
          <li class="placeholder">添加产品到这里</li>
        </ol>
      </div>
    </div>

    <script>
      $(document).ready(function () {
        $("#catalog").accordion();
        $("#catalog li").draggable({
          appendTo: "body",
          helper: "clone",
        });
        $("#cart ol")
          .droppable({
            activeClass: "ui-state-default",
            hoverClass: "ui-state-hover",
            accept: ":not(.ui-sortable-helper)",
            drop: function (event, ui) {
              $(this).find(".placeholder").remove();
              $("<li></li>").text(ui.draggable.text()).appendTo(this);
            },
          })
          .sortable({
            items: "li:not(.placeholder)",
            sort: function () {
              // 获取由 droppable 与 sortable 交互而加入的条目
              // 使用 connectWithSortable 可以解决这个问题,但不允许您自定义 active/hoverClass 选项
              $(this).removeClass("ui-state-default");
            },
          });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图141

  • 简单的照片管理器:您可以通过拖拽照片到回收站或者点击回收站图标来删除照片。您可以通过拖拽照片到相册或者点击回收利用图标来还原照片。您可以通过点击缩放图标来查看大图。jQuery UI 对话框(dialog)部件用于模态窗口。

获取所需要的图片:

wget https://labfile.oss.aliyuncs.com/courses/22/small.jpg
wget https://labfile.oss.aliyuncs.com/courses/22/big.jpg

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #gallery {
        float: left;
        width: 65%;
        min-height: 12em;
      }

      .gallery.custom-state-active {
        background: #eee;
      }

      .gallery li {
        float: left;
        width: 96px;
        padding: 0.4em;
        margin: 0 0.4em 0.4em 0;
        text-align: center;
      }

      .gallery li h5 {
        margin: 0 0 0.4em;
        cursor: move;
      }

      .gallery li a {
        float: right;
      }

      .gallery li a.ui-icon-zoomin {
        float: left;
      }

      .gallery li img {
        width: 100%;
        cursor: move;
      }

      #trash {
        float: right;
        width: 32%;
        min-height: 18em;
        padding: 1%;
      }

      #trash h4 {
        line-height: 16px;
        margin: 0 0 0.4em;
      }

      #trash h4 .ui-icon {
        float: left;
      }

      #trash .gallery h5 {
        display: none;
      }
    </style>
  </head>
  <body>
    <div class="ui-widget ui-helper-clearfix">
      <ul id="gallery" class="gallery ui-helper-reset ui-helper-clearfix">
        <li class="ui-widget-content ui-corner-tr">
          <h5 class="ui-widget-header">High Tatras</h5>
          <img
            src="small.jpg"
            alt="High Tatras 的最高峰"
            width="96"
            height="72"
          />
          <a href="big.jpg" title="查看大图" class="ui-icon ui-icon-zoomin"
            >查看大图</a
          >
          <a
            href="link/to/trash/script/when/we/have/js/off"
            title="删除图像"
            class="ui-icon ui-icon-trash"
            >删除图像</a
          >
        </li>
        <li class="ui-widget-content ui-corner-tr">
          <h5 class="ui-widget-header">High Tatras 2</h5>
          <img src="small.jpg" alt="绿山湖畔的小屋" width="96" height="72" />
          <a href="big.jpg" title="查看大图" class="ui-icon ui-icon-zoomin"
            >查看大图</a
          >
          <a
            href="link/to/trash/script/when/we/have/js/off"
            title="删除图像"
            class="ui-icon ui-icon-trash"
            >删除图像</a
          >
        </li>
        <li class="ui-widget-content ui-corner-tr">
          <h5 class="ui-widget-header">High Tatras 3</h5>
          <img src="small.jpg" alt="计划登高" width="96" height="72" />
          <a href="big.jpg" title="查看大图" class="ui-icon ui-icon-zoomin"
            >查看大图</a
          >
          <a
            href="link/to/trash/script/when/we/have/js/off"
            title="删除图像"
            class="ui-icon ui-icon-trash"
            >删除图像</a
          >
        </li>
        <li class="ui-widget-content ui-corner-tr">
          <h5 class="ui-widget-header">High Tatras 4</h5>
          <img
            src="small.jpg"
            alt="在 Kozi kopka 的顶部"
            width="96"
            height="72"
          />
          <a href="big.jpg" title="查看大图" class="ui-icon ui-icon-zoomin"
            >查看大图</a
          >
          <a
            href="link/to/trash/script/when/we/have/js/off"
            title="删除图像"
            class="ui-icon ui-icon-trash"
            >删除图像</a
          >
        </li>
      </ul>

      <div id="trash" class="ui-widget-content ui-state-default">
        <h4 class="ui-widget-header">
          <span class="ui-icon ui-icon-trash">回收站</span> 回收站
        </h4>
      </div>
    </div>

    <script>
      $(document).ready(function () {
        // 这是相册和回收站
        var $gallery = $("#gallery"),
          $trash = $("#trash");

        // 让相册的条目可拖拽
        $("li", $gallery).draggable({
          cancel: "a.ui-icon", // 点击一个图标不会启动拖拽
          revert: "invalid", // 当未被放置时,条目会还原回它的初始位置
          containment: "document",
          helper: "clone",
          cursor: "move",
        });

        // 让回收站可放置,接受相册的条目
        $trash.droppable({
          accept: "#gallery > li",
          activeClass: "ui-state-highlight",
          drop: function (event, ui) {
            deleteImage(ui.draggable);
          },
        });

        // 让相册可放置,接受回收站的条目
        $gallery.droppable({
          accept: "#trash li",
          activeClass: "custom-state-active",
          drop: function (event, ui) {
            recycleImage(ui.draggable);
          },
        });

        // 图像删除功能
        var recycle_icon =
          "<a href='link/to/recycle/script/when/we/have/js/off' title='还原图像' class='ui-icon ui-icon-refresh'>还原图像</a>";

        function deleteImage($item) {
          $item.fadeOut(function () {
            var $list = $("ul", $trash).length
              ? $("ul", $trash)
              : $("<ul class='gallery ui-helper-reset'/>").appendTo($trash);

            $item.find("a.ui-icon-trash").remove();
            $item
              .append(recycle_icon)
              .appendTo($list)
              .fadeIn(function () {
                $item
                  .animate({
                    width: "48px",
                  })
                  .find("img")
                  .animate({
                    height: "36px",
                  });
              });
          });
        }

        // 图像还原功能
        var trash_icon =
          "<a href='link/to/trash/script/when/we/have/js/off' title='删除图像' class='ui-icon ui-icon-trash'>删除图像</a>";

        function recycleImage($item) {
          $item.fadeOut(function () {
            $item
              .find("a.ui-icon-refresh")
              .remove()
              .end()
              .css("width", "96px")
              .append(trash_icon)
              .find("img")
              .css("height", "72px")
              .end()
              .appendTo($gallery)
              .fadeIn();
          });
        }

        // 图像预览功能,演示 ui.dialog 作为模态窗口使用
        function viewLargerImage($link) {
          var src = $link.attr("href"),
            title = $link.siblings("img").attr("alt"),
            $modal = $("img[src$='" + src + "']");

          if ($modal.length) {
            $modal.dialog("open");
          } else {
            var img = $(
              "<img alt='" +
                title +
                "' width='384' height='288' style='display: none; padding: 8px;' />"
            )
              .attr("src", src)
              .appendTo("body");
            setTimeout(function () {
              img.dialog({
                title: title,
                width: 400,
                modal: true,
              });
            }, 1);
          }
        }

        // 通过事件代理解决图标行为
        $("ul.gallery > li").click(function (event) {
          var $item = $(this),
            $target = $(event.target);

          if ($target.is("a.ui-icon-trash")) {
            deleteImage($item);
          } else if ($target.is("a.ui-icon-zoomin")) {
            viewLargerImage($target);
          } else if ($target.is("a.ui-icon-refresh")) {
            recycleImage($item);
          }

          return false;
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图142

  • 视觉反馈:当悬停在 droppable 上时,或者当 droppable 被激活(即一个可接受的 draggable 被放置在 droppable 上)时,改变 droppable 的外观。使用 hoverClass 或 activeClass 选项来分别指定 class。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #draggable,
      #draggable2 {
        width: 90px;
        height: 90px;
        padding: 0.5em;
        float: left;
        margin: 10px 10px 10px 0;
      }

      #droppable,
      #droppable2 {
        width: 120px;
        height: 120px;
        padding: 0.5em;
        float: left;
        margin: 10px;
      }

      h3 {
        clear: left;
      }
    </style>
  </head>
  <body>
    <h3>当悬停在 droppable 上时的反馈:</h3>

    <div id="draggable" class="ui-widget-content">
      <p>请拖拽我到目标</p>
    </div>

    <div id="droppable" class="ui-widget-header">
      <p>请放置在这里</p>
    </div>

    <h3>当激活 draggable 时的反馈:</h3>

    <div id="draggable2" class="ui-widget-content">
      <p>请拖拽我到目标</p>
    </div>

    <div id="droppable2" class="ui-widget-header">
      <p>请放置在这里</p>
    </div>

    <script>
      $(document).ready(function () {
        $("#draggable").draggable();
        $("#droppable").droppable({
          hoverClass: "ui-state-hover",
          drop: function (event, ui) {
            $(this).addClass("ui-state-highlight").find("p").html("Dropped!");
          },
        });

        $("#draggable2").draggable();
        $("#droppable2").droppable({
          accept: "#draggable2",
          activeClass: "ui-state-default",
          drop: function (event, ui) {
            $(this).addClass("ui-state-highlight").find("p").html("Dropped!");
          },
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图143

(4)拖动(Draggable)

允许使用鼠标移动元素。如需了解更多有关 draggable 交互的细节,请查看 官方 API 文档 可拖拽小部件(Draggable Widget)

  • 默认功能:在任意的 DOM 元素上启用 draggable 功能。通过鼠标点击并在视区中拖动来移动 draggable 对象。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #draggable {
        width: 150px;
        height: 150px;
        padding: 0.5em;
      }
    </style>
  </head>
  <body>
    <div id="draggable" class="ui-widget-content">
      <p>请拖动我!</p>
    </div>

    <script>
      $(document).ready(function () {
        $("#draggable").draggable();
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图144

  • 自动滚动:当 draggable 移动到视区外时自动滚动文档。设置 scroll 选项为 true 来启用自动滚动,当滚动触发时进行微调,滚动速度是通过 scrollSensitivity 和 scrollSpeed 选项设置的。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #draggable,
      #draggable2,
      #draggable3 {
        width: 100px;
        height: 100px;
        padding: 0.5em;
        float: left;
        margin: 0 10px 10px 0;
      }
    </style>
  </head>
  <body>
    <div id="draggable" class="ui-widget-content">
      <p>Scroll 设置为 true,默认设置</p>
    </div>

    <div id="draggable2" class="ui-widget-content">
      <p>scrollSensitivity 设置为 100</p>
    </div>

    <div id="draggable3" class="ui-widget-content">
      <p>scrollSpeed 设置为 100</p>
    </div>

    <div style="height: 5000px; width: 1px;"></div>

    <script>
      $(document).ready(function () {
        $("#draggable").draggable({
          scroll: true,
        });
        $("#draggable2").draggable({
          scroll: true,
          scrollSensitivity: 100,
        });
        $("#draggable3").draggable({
          scroll: true,
          scrollSpeed: 100,
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图145

  • 约束运动:通过定义 draggable 区域的边界来约束每个 draggable 的运动。设置 axis 选项来限制 draggable 的路径为 x 轴或者 y 轴,或者使用 containment 选项来指定一个父级的 DOM 元素或者一个 jQuery 选择器,比如 ‘document.’。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      .draggable {
        width: 90px;
        height: 90px;
        padding: 0.5em;
        float: left;
        margin: 0 10px 10px 0;
      }

      #draggable,
      #draggable2 {
        margin-bottom: 20px;
      }

      #draggable {
        cursor: n-resize;
      }

      #draggable2 {
        cursor: e-resize;
      }

      #containment-wrapper {
        width: 95%;
        height: 150px;
        border: 2px solid #ccc;
        padding: 10px;
      }

      h3 {
        clear: left;
      }
    </style>
  </head>
  <body>
    <h3>沿着轴约束运动:</h3>

    <div id="draggable" class="draggable ui-widget-content">
      <p>只能垂直拖拽</p>
    </div>

    <div id="draggable2" class="draggable ui-widget-content">
      <p>只能水平拖拽</p>
    </div>

    <h3>或者在另一个 DOM 元素中约束运动:</h3>
    <div id="containment-wrapper">
      <div id="draggable3" class="draggable ui-widget-content">
        <p>我被约束在盒子里</p>
      </div>

      <div class="draggable ui-widget-content">
        <p id="draggable5" class="ui-widget-header">我被约束在父元素内</p>
      </div>
    </div>

    <script>
      $(document).ready(function () {
        $("#draggable").draggable({
          axis: "y",
        });
        $("#draggable2").draggable({
          axis: "x",
        });

        $("#draggable3").draggable({
          containment: "#containment-wrapper",
          scroll: false,
        });
        $("#draggable5").draggable({
          containment: "parent",
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图146

  • 光标样式:当拖拽对象时定位光标。默认情况下,光标是出现在被拖拽对象的中间。使用 cursorAt 选项来指定相对于 draggable 的另一个位置(指定一个相对于 top、right、bottom、left 的像素值)。通过提供一个带有有效的 CSS 光标值的 cursor 选项,来自定义光标的外观。有效的 CSS 光标值包括:default、move、pointer、crosshair,等等。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #draggable,
      #draggable2,
      #draggable3 {
        width: 100px;
        height: 100px;
        padding: 0.5em;
        float: left;
        margin: 0 10px 10px 0;
      }
    </style>
  </head>
  <body>
    <div id="draggable" class="ui-widget-content">
      <p>我总是在中间(相对于鼠标)</p>
    </div>

    <div id="draggable2" class="ui-widget-content">
      <p>我的光标是在 left -5 和 top -5</p>
    </div>

    <div id="draggable3" class="ui-widget-content">
      <p>我的光标位置只控制了 'bottom' 值</p>
    </div>

    <script>
      $(document).ready(function () {
        $("#draggable").draggable({
          cursor: "move",
          cursorAt: {
            top: 56,
            left: 56,
          },
        });
        $("#draggable2").draggable({
          cursor: "crosshair",
          cursorAt: {
            top: -5,
            left: -5,
          },
        });
        $("#draggable3").draggable({
          cursorAt: {
            bottom: 0,
          },
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图147

  • 延迟开始:通过 delay 选项设置延迟开始拖拽的毫秒数。通过 distance 选项设置光标被按下且拖拽指定像素后才允许拖拽。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #draggable,
      #draggable2 {
        width: 120px;
        height: 120px;
        padding: 0.5em;
        float: left;
        margin: 0 10px 10px 0;
      }
    </style>
  </head>
  <body>
    <div id="draggable" class="ui-widget-content">
      <p>只有把我拖拽了 20 像素后,拖拽才开始</p>
    </div>

    <div id="draggable2" class="ui-widget-content">
      <p>不管 distance 是多少,您都必须拖拽并等待 1000ms 后拖拽才开始</p>
    </div>

    <script>
      $(document).ready(function () {
        $("#draggable").draggable({
          distance: 20,
        });
        $("#draggable2").draggable({
          delay: 1000,
        });
        $(".ui-draggable").disableSelection();
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图148

  • 事件:draggable 上的 start、drag 和 stop 事件。拖拽开始时触发 start 事件,拖拽期间触发 drag 事件,拖拽停止时触发 stop 事件。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #draggable {
        width: 16em;
        padding: 0 1em;
      }

      #draggable ul li {
        margin: 1em 0;
        padding: 0.5em 0;
      }

      * html #draggable ul li {
        height: 1%;
      }

      #draggable ul li span.ui-icon {
        float: left;
      }

      #draggable ul li span.count {
        font-weight: bold;
      }
    </style>
  </head>
  <body>
    <div id="draggable" class="ui-widget ui-widget-content">
      <p>请拖拽我,触发一连串的事件。</p>

      <ul class="ui-helper-reset">
        <li id="event-start" class="ui-state-default ui-corner-all">
          <span class="ui-icon ui-icon-play"></span>"start" 被调用
          <span class="count">0</span>x
        </li>
        <li id="event-drag" class="ui-state-default ui-corner-all">
          <span class="ui-icon ui-icon-arrow-4"></span>"drag" 被调用
          <span class="count">0</span>x
        </li>
        <li id="event-stop" class="ui-state-default ui-corner-all">
          <span class="ui-icon ui-icon-stop"></span>"stop" 被调用
          <span class="count">0</span>x
        </li>
      </ul>
    </div>

    <script>
      $(document).ready(function () {
        var $start_counter = $("#event-start"),
          $drag_counter = $("#event-drag"),
          $stop_counter = $("#event-stop"),
          counts = [0, 0, 0];

        $("#draggable").draggable({
          start: function () {
            counts[0]++;
            updateCounterStatus($start_counter, counts[0]);
          },
          drag: function () {
            counts[1]++;
            updateCounterStatus($drag_counter, counts[1]);
          },
          stop: function () {
            counts[2]++;
            updateCounterStatus($stop_counter, counts[2]);
          },
        });

        function updateCounterStatus($event_counter, new_count) {
          // 首先更新视觉状态...
          if (!$event_counter.hasClass("ui-state-hover")) {
            $event_counter
              .addClass("ui-state-hover")
              .siblings()
              .removeClass("ui-state-hover");
          }
          // ...然后更新数字
          $("span.count", $event_counter).text(new_count);
        }
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图149

  • Handles:只有当光标在 draggable 上指定部分时才允许拖拽。使用 handle 选项来指定用于拖拽对象的元素(或元素组)的 jQuery 选择器。或者当光标在 draggable 内指定元素(或元素组)上时不允许拖拽。使用 handle 选项来指定取消拖拽功能的 jQuery 选择器。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #draggable,
      #draggable2 {
        width: 100px;
        height: 100px;
        padding: 0.5em;
        float: left;
        margin: 0 10px 10px 0;
      }

      #draggable p {
        cursor: move;
      }
    </style>
  </head>
  <body>
    <div id="draggable" class="ui-widget-content">
      <p class="ui-widget-header">您只可以在这个范围内拖拽我</p>
    </div>

    <div id="draggable2" class="ui-widget-content">
      <p>您可以把我向四周拖拽&hellip;</p>
      <p class="ui-widget-header">&hellip;但是您不可以在这个范围内拖拽我</p>
    </div>

    <script>
      $(document).ready(function () {
        $("#draggable").draggable({
          handle: "p",
        });
        $("#draggable2").draggable({
          cancel: "p.ui-widget-header",
        });
        $("div, p").disableSelection();
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图150

  • 还原位置:当带有布尔值 revert 选项的 draggable 停止拖拽时,返回 draggable(或它的助手)到原始位置。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #draggable,
      #draggable2 {
        width: 100px;
        height: 100px;
        padding: 0.5em;
        float: left;
        margin: 0 10px 10px 0;
      }
    </style>
  </head>
  <body>
    <div id="draggable" class="ui-widget-content">
      <p>还原</p>
    </div>

    <div id="draggable2" class="ui-widget-content">
      <p>还原助手</p>
    </div>

    <script>
      $(document).ready(function () {
        $("#draggable").draggable({
          revert: true,
        });
        $("#draggable2").draggable({
          revert: true,
          helper: "clone",
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图151

  • 视觉反馈:给用户提供反馈,就像以助手方式拖拽对象一样。helper 选项接受值 ‘original’(用光标移动 draggable 对象),’clone’(用光标移动 draggable 的副本),或者一个返回 DOM 元素的函数(该元素在拖拽期间显示在光标附近)。通过 opacity 选项控制助手的透明度。

为了区别哪一个 draggable 正在被拖拽,让在运动中的 draggable 保持最前。如果正在拖拽,使用 zIndex 选项来设置助手的高度 z-index,或者使用 stack 选项来确保当停止拖拽时,最后一个被拖拽的项目总是出现在同组其他项目的上面。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #draggable,
      #draggable2,
      #draggable3,
      #set div {
        width: 90px;
        height: 90px;
        padding: 0.5em;
        float: left;
        margin: 0 10px 10px 0;
      }

      #draggable,
      #draggable2,
      #draggable3 {
        margin-bottom: 20px;
      }

      #set {
        clear: both;
        float: left;
        width: 368px;
        height: 120px;
      }

      p {
        clear: both;
        margin: 0;
        padding: 1em 0;
      }
    </style>
  </head>
  <body>
    <h3 class="docs">助手:</h3>

    <div id="draggable" class="ui-widget-content">
      <p>原始的</p>
    </div>

    <div id="draggable2" class="ui-widget-content">
      <p>半透明的克隆</p>
    </div>

    <div id="draggable3" class="ui-widget-content">
      <p>自定义助手(与 cursorAt 结合)</p>
    </div>

    <h3 class="docs">堆叠:</h3>
    <div id="set">
      <div class="ui-widget-content">
        <p>我们是 draggables..</p>
      </div>

      <div class="ui-widget-content">
        <p>..它的 z-index 是自动控制的..</p>
      </div>

      <div class="ui-widget-content">
        <p>..带有 stack 选项。</p>
      </div>
    </div>

    <script>
      $(document).ready(function () {
        $("#draggable").draggable({
          helper: "original",
        });
        $("#draggable2").draggable({
          opacity: 0.7,
          helper: "clone",
        });
        $("#draggable3").draggable({
          cursor: "move",
          cursorAt: {
            top: -12,
            left: -20,
          },
          helper: function (event) {
            return $("<div class='ui-widget-header'>I'm a custom helper</div>");
          },
        });
        $("#set div").draggable({
          stack: "#set div",
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图152

  • jQuery UI Draggable + Sortable:Draggable 与 Sortable 的无缝交互。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      ul {
        list-style-type: none;
        margin: 0;
        padding: 0;
        margin-bottom: 10px;
      }

      li {
        margin: 5px;
        padding: 5px;
        width: 150px;
      }
    </style>
  </head>
  <body>
    <ul>
      <li id="draggable" class="ui-state-highlight">请拖拽我</li>
    </ul>

    <ul id="sortable">
      <li class="ui-state-default">Item 1</li>
      <li class="ui-state-default">Item 2</li>
      <li class="ui-state-default">Item 3</li>
      <li class="ui-state-default">Item 4</li>
      <li class="ui-state-default">Item 5</li>
    </ul>

    <script>
      $(document).ready(function () {
        $("#sortable").sortable({
          revert: true,
        });
        $("#draggable").draggable({
          connectToSortable: "#sortable",
          helper: "clone",
          revert: "invalid",
        });
        $("ul, li").disableSelection();
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图153

(5)缩放(Resizable)

使用鼠标改变元素的尺寸。如需了解更多有关 resizable 交互的细节,请查看 官方 API 文档 可调整尺寸小部件(Resizable Widget)

  • 默认功能:在任意的 DOM 元素上启用 resizable 功能。通过鼠标拖拽右边或底边的边框到所需的宽度或高度。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #resizable {
        width: 150px;
        height: 150px;
        padding: 0.5em;
      }

      #resizable h3 {
        text-align: center;
        margin: 0;
      }
    </style>
  </head>
  <body>
    <div id="resizable" class="ui-widget-content">
      <h3 class="ui-widget-header">缩放(Resizable)</h3>
    </div>

    <script>
      $(document).ready(function () {
        $("#resizable").resizable();
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图154

  • 动画:使用 animate 选项(布尔值)使缩放行为动画化。当该选项设置为 true 时,拖拽轮廓到所需的位置,元素会在拖拽停止时以动画形式调整到该尺寸。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #resizable {
        width: 150px;
        height: 150px;
        padding: 0.5em;
      }

      #resizable h3 {
        text-align: center;
        margin: 0;
      }

      .ui-resizable-helper {
        border: 1px dotted gray;
      }
    </style>
  </head>
  <body>
    <div id="resizable" class="ui-widget-content">
      <h3 class="ui-widget-header">动画</h3>
    </div>

    <script>
      $(document).ready(function () {
        $("#resizable").resizable({
          animate: true,
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图155

  • 限制缩放区域:定义缩放区域的边界。使用 containment 选项来指定一个父级的 DOM 元素或一个 jQuery 选择器,比如 ‘document.’。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #container {
        width: 300px;
        height: 300px;
      }

      #container h3 {
        text-align: center;
        margin: 0;
        margin-bottom: 10px;
      }

      #resizable {
        background-position: top left;
        width: 150px;
        height: 150px;
      }

      #resizable,
      #container {
        padding: 0.5em;
      }
    </style>
  </head>
  <body>
    <div id="container" class="ui-widget-content">
      <h3 class="ui-widget-header">限制</h3>
      <div id="resizable" class="ui-state-active">
        <h3 class="ui-widget-header">缩放(Resizable)</h3>
      </div>
    </div>

    <script>
      $(document).ready(function () {
        $("#resizable").resizable({
          containment: "#container",
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图156

  • 延迟开始:通过 delay 选项设置延迟开始缩放的毫秒数。通过 distance 选项设置光标被按下且拖拽指定像素后才允许缩放。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #resizable,
      #resizable2 {
        width: 150px;
        height: 150px;
        padding: 0.5em;
      }

      #resizable h3,
      #resizable2 h3 {
        text-align: center;
        margin: 0;
      }
    </style>
  </head>
  <body>
    <h3 class="docs">时间延迟 (ms):</h3>
    <div id="resizable" class="ui-widget-content">
      <h3 class="ui-widget-header">时间</h3>
    </div>

    <h3 class="docs">距离延迟 (px):</h3>
    <div id="resizable2" class="ui-widget-content">
      <h3 class="ui-widget-header">距离</h3>
    </div>

    <script>
      $(document).ready(function () {
        $("#resizable").resizable({
          delay: 1000,
        });

        $("#resizable2").resizable({
          distance: 40,
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图157

  • 助手:通过设置 helper 选项为一个 CSS class,当缩放时只显示元素的轮廓。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #resizable {
        width: 150px;
        height: 150px;
        padding: 0.5em;
      }

      #resizable h3 {
        text-align: center;
        margin: 0;
      }

      .ui-resizable-helper {
        border: 2px dotted #00f;
      }
    </style>
  </head>
  <body>
    <div id="resizable" class="ui-widget-content">
      <h3 class="ui-widget-header">助手</h3>
    </div>

    <script>
      $(document).ready(function () {
        $("#resizable").resizable({
          helper: "ui-resizable-helper",
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图158

  • 最大/最小尺寸:使用 maxHeight、maxWidth、minHeight 和 minWidth 选项限制 resizable 元素的最大或最小高度或宽度。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #resizable {
        width: 200px;
        height: 150px;
        padding: 5px;
      }

      #resizable h3 {
        text-align: center;
        margin: 0;
      }
    </style>
  </head>
  <body>
    <div id="resizable" class="ui-widget-content">
      <h3 class="ui-widget-header">放大/缩小</h3>
    </div>

    <script>
      $(document).ready(function () {
        $("#resizable").resizable({
          maxHeight: 250,
          maxWidth: 350,
          minHeight: 150,
          minWidth: 200,
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图159

  • 保持纵横比:保持现有的纵横比或设置一个新的纵横比来限制缩放比例。设置 aspectRatio 选项为 true,且可选地传递一个新的比率(比如,4/3)。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #resizable {
        width: 160px;
        height: 90px;
        padding: 0.5em;
      }

      #resizable h3 {
        text-align: center;
        margin: 0;
      }
    </style>
  </head>
  <body>
    <div id="resizable" class="ui-widget-content">
      <h3 class="ui-widget-header">保持纵横比</h3>
    </div>

    <script>
      $(document).ready(function () {
        $("#resizable").resizable({
          aspectRatio: 16 / 9,
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图160

  • 对齐到网格:对齐 resizable 元素到网格。通过 grid 选项设置网格单元的尺寸(以像素为单位的高度和宽度)。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #resizable {
        width: 150px;
        height: 150px;
        padding: 0.5em;
      }

      #resizable h3 {
        text-align: center;
        margin: 0;
      }
    </style>
  </head>
  <body>
    <div id="resizable" class="ui-widget-content">
      <h3 class="ui-widget-header">网格</h3>
    </div>

    <script>
      $(document).ready(function () {
        $("#resizable").resizable({
          grid: 50,
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图161

  • 同步缩放:通过点击并拖拽一个元素的边来同时调整多个元素的尺寸。给 alsoResize 选项传递一个共享的选择器。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #resizable {
        background-position: top left;
      }

      #resizable,
      #also {
        width: 150px;
        height: 120px;
        padding: 0.5em;
      }

      #resizable h3,
      #also h3 {
        text-align: center;
        margin: 0;
      }

      #also {
        margin-top: 1em;
      }
    </style>
  </head>
  <body>
    <div id="resizable" class="ui-widget-header">
      <h3 class="ui-state-active">缩放</h3>
    </div>

    <div id="also" class="ui-widget-content">
      <h3 class="ui-widget-header">同步缩放</h3>
    </div>

    <script>
      $(document).ready(function () {
        $("#resizable").resizable({
          alsoResize: "#also",
        });
        $("#also").resizable();
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图162

  • 文本框:可缩放的文本框。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      .ui-resizable-se {
        bottom: 17px;
      }
    </style>
  </head>
  <body>
    <textarea id="resizable" rows="5" cols="20"></textarea>

    <script>
      $(document).ready(function () {
        $("#resizable").resizable({
          handles: "se",
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图163

  • 视觉反馈:通过设置 ghost 选项为 true,可在缩放期间显示一个半透明的元素,而不是显示一个实际的元素。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      #resizable {
        width: 150px;
        height: 150px;
        padding: 0.5em;
      }

      #resizable h3 {
        text-align: center;
        margin: 0;
      }

      .ui-resizable-ghost {
        border: 1px dotted gray;
      }
    </style>
  </head>
  <body>
    <div id="resizable" class="ui-widget-content">
      <h3 class="ui-widget-header">Ghost</h3>
    </div>

    <script>
      $(document).ready(function () {
        $("#resizable").resizable({
          ghost: true,
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图164

注:下面的微件和效果库不会像交互一样给那么多的例子,有兴趣了解更多内容的同学,可以访问 jQuery UI 中文网 jQuery UI Demo

4.5 微件(Widgets)

(1)工具提示框(Tooltip)

可自定义的、可主题化的工具提示框,替代原生的工具提示框。如需了解更多有关 tooltip 部件的细节,请查看 官方 API 文档 工具提示框部件(Tooltip Widget)。

  • 默认功能:悬停在链接上,或者使用 tab 键循环切换聚焦在每个元素上。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      label {
        display: inline-block;
        width: 5em;
      }
    </style>
  </head>
  <body>
    <p>
      <a href="#" title="部件的名称">Tooltips</a>
      可被绑定到任意的元素上。当您的鼠标悬停在元素上时,title
      属性会显示在元素旁边的一个小框中,就像原生的工具提示框一样。
    </p>
    <p>
      但是由于它不是一个原生的工具提示框,所以它可以被定义样式。通过
      <a
        href="http://themeroller.com"
        title="ThemeRoller:jQuery UI 的主题创建应用程序"
        >ThemeRoller</a
      >
      创建的主题也可以相应地定义工具提示框的样式。
    </p>
    <p>工具提示框也可以用于表单元素,来显示每个区域中的一些额外的信息。</p>
    <p>
      <label for="age">您的年龄:</label
      ><input id="age" title="年龄仅用于统计。" />
    </p>
    <p>悬停在相应的区域上查看工具提示框。</p>
    <script>
      $(document).ready(function () {
        $(document).tooltip();
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图165

更多例子代码,请查看 官方文档 工具提示框(Tooltip)。下面是官方例子的简介:

  • 自定义样式:悬停在链接上,或者使用 tab 键循环切换聚焦在每个元素上。
  • 自定义动画:使用 show 和 hide 选项来自定义动画,也可以使用 open 事件来自定义动画。
  • 自定义内容:通过自定义 items 和 content 选项,来组合不同的事件委托工具提示框到一个单一的实例中。您可能需要与地图工具提示框进行交互,这是未来版本中的一个待实现的功能。
  • 表单:使用下面的按钮来显示帮助文本,或者只需要让鼠标悬停在输入框上或者让输入框获得焦点,即可显示相应输入框的帮助文本。在 CSS 中定义一个固定的宽度,让同时显示所有的帮助文本时看起来更一致。
  • 跟踪鼠标:工具提示框是相对于鼠标进行定位的,当鼠标在元素上移动时,它会跟随鼠标移动。
  • 视频播放器:一个虚拟的视频播放器,带有喜欢/分享/统计按钮,每个按钮都带有自定义样式的工具提示框。

(2)标签页(Tabs)

一种多面板的单内容区,每个面板与列表中的标题相关。如需了解更多有关 tabs 部件的细节,请查看 官方 API 文档 标签页部件(Tabs Widget)

  • 默认功能:点击标签页,切换被划分为不同逻辑部分的内容。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
  </head>
  <body>
    <div id="tabs">
      <ul>
        <li><a href="#tabs-1">Nunc tincidunt</a></li>
        <li><a href="#tabs-2">Proin dolor</a></li>
        <li><a href="#tabs-3">Aenean lacinia</a></li>
      </ul>
      <div id="tabs-1">
        <p>
          Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus.
          Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam
          elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris
          dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed
          magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales
          tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et
          mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt
          interdum. Phasellus ipsum. Nunc tristique tempus lectus.
        </p>
      </div>
      <div id="tabs-2">
        <p>
          Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida
          ante, ut pharetra massa metus id nunc. Duis scelerisque molestie
          turpis. Sed fringilla, massa eget luctus malesuada, metus eros
          molestie lectus, ut tempus eros massa ut dolor. Aenean aliquet
          fringilla sem. Suspendisse sed ligula in ligula suscipit aliquam.
          Praesent in eros vestibulum mi adipiscing adipiscing. Morbi facilisis.
          Curabitur ornare consequat nunc. Aenean vel metus. Ut posuere viverra
          nulla. Aliquam erat volutpat. Pellentesque convallis. Maecenas
          feugiat, tellus pellentesque pretium posuere, felis lorem euismod
          felis, eu ornare leo nisi vel felis. Mauris consectetur tortor et
          purus.
        </p>
      </div>
      <div id="tabs-3">
        <p>
          Mauris eleifend est et turpis. Duis id erat. Suspendisse potenti.
          Aliquam vulputate, pede vel vehicula accumsan, mi neque rutrum erat,
          eu congue orci lorem eget lorem. Vestibulum non ante. Class aptent
          taciti sociosqu ad litora torquent per conubia nostra, per inceptos
          himenaeos. Fusce sodales. Quisque eu urna vel enim commodo
          pellentesque. Praesent eu risus hendrerit ligula tempus pretium.
          Curabitur lorem enim, pretium nec, feugiat nec, luctus a, lacus.
        </p>
        <p>
          Duis cursus. Maecenas ligula eros, blandit nec, pharetra at, semper
          at, magna. Nullam ac lacus. Nulla facilisi. Praesent viverra justo
          vitae neque. Praesent blandit adipiscing velit. Suspendisse potenti.
          Donec mattis, pede vel pharetra blandit, magna ligula faucibus eros,
          id euismod lacus dolor eget odio. Nam scelerisque. Donec non libero
          sed nulla mattis commodo. Ut sagittis. Donec nisi lectus, feugiat
          porttitor, tempor ac, tempor vitae, pede. Aenean vehicula velit eu
          tellus interdum rutrum. Maecenas commodo. Pellentesque nec elit. Fusce
          in lacus. Vivamus a libero vitae lectus hendrerit hendrerit.
        </p>
      </div>
    </div>
    <script>
      $(document).ready(function () {
        $("#tabs").tabs();
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图166

更多例子代码,请查看 官方文档 标签页(Tabs)。下面是官方例子的简介:

  • 折叠内容:点击选中的标签页来切换内容的关闭/打开状态。为了启用这个功能,需要设置 collapsible 选项为 true。
  • 通过 Ajax 获取内容:在标签页链接中设置 href 的值来为标签页通过 Ajax 获取外部的内容。当 Ajax 请求在等待响应时,标签页的标签变为 “Loading…”,当加载完成后返回常规的标签。

标签 3 和 4 演示了慢加载和损坏的 AJAX 标签,以及如何处理这些情况下的服务器端的错误。请注意,这两个都要求 web 服务器能解释 PHP。它们在文件系统以外无法工作。

  • 当鼠标悬停时打开:通过 event 选项设置当鼠标悬停时切换各部分的打开/关闭状态。event 的默认值是 “click”。
  • 简单的操作:简单的标签页添加和移除。
  • 排序(Sortable):拖拽上面的标签页来对它们进行重新排序。只需要简单地调用 .ui-tabs-nav 元素上的 .sortable(),即可让标签页可排序。
  • 底部标签页:通过一些额外的 CSS(用于定位的)和 JS(在元素上放置正确的 class),标签页皆可放置在内容的底部。
  • 垂直的标签页:点击标签页,切换被划分为不同逻辑部分的内容。

(3)旋转器(Spinner)

通过向上/向下按钮和箭头键处理,为输入数值增强文本输入功能。如需了解更多有关 spinner 部件的细节,请查看 官方 API 文档 旋转器部件(Spinner Widget)

  • 默认功能:默认的旋转器。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
  </head>
  <body>
    <p>
      <label for="spinner">选择一个值:</label>
      <input id="spinner" name="value" />
    </p>

    <p>
      <button id="disable">切换禁用/启用</button>
      <button id="destroy">切换部件</button>
    </p>

    <p>
      <button id="getvalue">获取值</button>
      <button id="setvalue">设置值为 5</button>
    </p>
    <script>
      $(document).ready(function () {
        var spinner = $("#spinner").spinner();

        $("#disable").click(function () {
          if (spinner.spinner("option", "disabled")) {
            spinner.spinner("enable");
          } else {
            spinner.spinner("disable");
          }
        });
        $("#destroy").click(function () {
          if (spinner.data("ui-spinner")) {
            spinner.spinner("destroy");
          } else {
            spinner.spinner();
          }
        });
        $("#getvalue").click(function () {
          alert(spinner.spinner("value"));
        });
        $("#setvalue").click(function () {
          spinner.spinner("value", 5);
        });

        $("button").button();
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图167

更多例子代码,请查看 官方文档 旋转器(Spinner)。下面是官方例子的简介:

  • 货币:本实例是一个捐款表格,带有货币旋转和数量旋转器。
  • 小数:本实例是一个小数旋转器。增量设置为 0.01。处理文化变化的代码会读取当前的旋转器的值,当改变文化时,会基于新的文化重新设置值的样式。
  • 地图:谷歌地图集成,使用旋转器来改变纬度和经度。
  • 溢出:溢出旋转器限制范围从 -10 到 10。对于 10 以上的值,会溢出到 -10,反之亦然。
  • 时间:一个扩展自旋转器的自定义部件。使用 全球化(Globalization)插件来解析和输出时间戳,带有自定义的 step 和 page 选项。向上/向下光标用于分钟的递增/递减,向上/向下翻页用于小时的递增/递减。

(4)滑块(Slider)

拖动手柄来选择一个数值。如需了解更多有关 slider 部件的细节,请查看 官方 API 文档 滑块部件(Slider Widget)

  • 默认功能:基本的滑块是水平的,有一个单一的手柄,可以用鼠标或箭头键进行移动。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
  </head>
  <body>
    <div id="slider"></div>
    <script>
      $(document).ready(function () {
        $("#slider").slider();
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图168

更多例子代码,请查看 官方文档 滑块(Slider)。下面是官方例子的简介:

  • 颜色选择器:组合了三个滑块,来创建一个简单的 RGB 颜色选择器。
  • 多个滑块:组合水平的和垂直的滑块,每个都带有各自的选项,来创建一个音乐播放器的 UI。
  • 范围滑块:设置 range 选项为 true,来获取带有两个拖拽手柄的值的范围。手柄之间的控件用不同的背景颜色填充来表示该区间的值是可选择的。
  • 带有固定最大值的范围:固定范围滑块的最大值,用户只能选择最小值。设置 range 选项为 “max”。
  • 带有固定最小值的范围:固定范围滑块的最小值,用户只能选择最大值。设置 range 选项为 “min”。
  • 绑定到 select 的滑块:如何绑定一个滑块到一个已有的 select 元素。选择保持可见以便显示变化。当选择改变时,同时更新滑块。
  • 滑块滚动条:使用滑块来操作页面上内容的定位。本实例中,它是一个能获取值的滚动条。
  • 对齐增量:通过把 step 选项设置为一个整数来设置滑块值的增量,通常是滑块最大值的除数。默认增量是 1。
  • 垂直的范围滑块:改变范围滑块的方向为垂直的。通过 .height() 分配一个高度值,或通过 CSS 设置高度,同时设置 orientation 选项为 “vertical”。
  • 垂直的滑块:改变滑块的方向为垂直的。通过 .height() 分配一个高度值,或通过 CSS 设置高度,同时设置 orientation 选项为 “vertical”。

(5)进度条(Progressbar)

显示一个确定的或不确定的进程状态。如需了解更多有关 progressbar 部件的细节,请查看 官方 API 文档 进度条部件(Progressbar Widget)

  • 默认功能:默认的确定的进度条。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
  </head>
  <body>
    <div id="progressbar"></div>
    <script>
      $(document).ready(function () {
        $("#progressbar").progressbar({
          value: 37,
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图169

更多例子代码,请查看 官方文档 进度条(Progressbar)。下面是官方例子的简介:

  • 自定义标签:自定义更新的标签。
  • 不确定的值:不确定的进度条,并可在确定和不确定的样式之间切换。

(6)菜单(Menu)

带有鼠标和键盘交互的用于导航的可主题化菜单。如需了解更多有关 menu 部件的细节,请查看 官方 API 文档 菜单部件(Menu Widget)

  • 默认功能:一个带有默认配置、禁用条目和嵌套菜单的菜单。由一个列表转化成的,添加了主题,并支持鼠标和键盘交互。尝试使用光标键导航菜单。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      .ui-menu {
        width: 150px;
      }
    </style>
  </head>
  <body>
    <ul id="menu">
      <li class="ui-state-disabled"><a href="#">Aberdeen</a></li>
      <li><a href="#">Ada</a></li>
      <li><a href="#">Adamsville</a></li>
      <li><a href="#">Addyston</a></li>
      <li>
        <a href="#">Delphi</a>
        <ul>
          <li class="ui-state-disabled"><a href="#">Ada</a></li>
          <li><a href="#">Saarland</a></li>
          <li><a href="#">Salzburg</a></li>
        </ul>
      </li>
      <li><a href="#">Saarland</a></li>
      <li>
        <a href="#">Salzburg</a>
        <ul>
          <li>
            <a href="#">Delphi</a>
            <ul>
              <li><a href="#">Ada</a></li>
              <li><a href="#">Saarland</a></li>
              <li><a href="#">Salzburg</a></li>
            </ul>
          </li>
          <li>
            <a href="#">Delphi</a>
            <ul>
              <li><a href="#">Ada</a></li>
              <li><a href="#">Saarland</a></li>
              <li><a href="#">Salzburg</a></li>
            </ul>
          </li>
          <li><a href="#">Perch</a></li>
        </ul>
      </li>
      <li class="ui-state-disabled"><a href="#">Amesville</a></li>
    </ul>
    <script>
      $(document).ready(function () {
        $("#menu").menu();
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图170

  • 图标:一个带有默认配置的菜单,显示如何使用带有图标的菜单。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      .ui-menu {
        width: 150px;
      }
    </style>
  </head>
  <body>
    <ul id="menu">
      <li>
        <a href="#"><span class="ui-icon ui-icon-disk"></span>保存</a>
      </li>
      <li>
        <a href="#"><span class="ui-icon ui-icon-zoomin"></span>放大</a>
      </li>
      <li>
        <a href="#"><span class="ui-icon ui-icon-zoomout"></span>缩小</a>
      </li>
      <li class="ui-state-disabled">
        <a href="#"><span class="ui-icon ui-icon-print"></span>打印...</a>
      </li>
      <li>
        <a href="#">播放</a>
        <ul>
          <li>
            <a href="#"
              ><span class="ui-icon ui-icon-seek-start"></span>上一个</a
            >
          </li>
          <li>
            <a href="#"><span class="ui-icon ui-icon-stop"></span>停止</a>
          </li>
          <li>
            <a href="#"><span class="ui-icon ui-icon-play"></span>播放</a>
          </li>
          <li>
            <a href="#"><span class="ui-icon ui-icon-seek-end"></span>下一个</a>
          </li>
        </ul>
      </li>
    </ul>
    <script>
      $(document).ready(function () {
        $("#menu").menu();
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图171

(7)对话框(Dialog)

在一个交互覆盖层中打开内容。如需了解更多有关 dialog 部件的细节,请查看 官方 API 文档 对话框部件(Dialog Widget)

  • 默认功能:基本的对话框窗口是一个定位于视区中的覆盖层,同时通过一个 iframe 与页面内容分隔开(就像 select 元素)。它由一个标题栏和一个内容区域组成,且可以移动,调整尺寸,默认可通过 ‘x’ 图标关闭。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
  </head>
  <body>
    <div id="dialog" title="基本的对话框">
      <p>
        这是一个默认的对话框,用于显示信息。对话框窗口可以移动,调整尺寸,默认可通过
        'x' 图标关闭。
      </p>
    </div>
    <script>
      $(document).ready(function () {
        $("#dialog").dialog();
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图172

更多例子代码,请查看 官方文档 对话框(Dialog)。下面是官方例子的简介:

  • 动画:可以通过为 show/hide 属性指定一个特效来动画显示对话框。您必须为想使用的特效引用独立的特效文件。
  • 基本的模态:模态对话框防止用户与对话框以外的页面其他部分进行交互,直到对话框关闭为止。
  • 模态确认:确认一个动作可能是破坏性的也可能是有意义的。设置 modal 选项为 true,并通过 buttons 选项来指定主要的和次要的用户动作。
  • 模态表单:使用模态对话框来请求用户在一个多步骤过程中输入数据。在内容区域嵌入 form 标记,设置 modal 选项为 true,并通过 buttons 选项来指定主要的和次要的用户动作。
  • 模态消息:使用模态对话框来在下一步动作执行之前确认信息和动作。设置 modal 选项为 true,并通过 buttons 选项来指定主要的动作(Ok)。

(8)日期选择器(Datepicker)

从弹出框或内联日历选择一个日期。如需了解更多有关 datepicker 部件的细节,请查看 官方 API 文档 日期选择器部件(Datepicker Widget)

  • 默认功能:日期选择器(Datepicker)绑定到一个标准的表单 input 字段上。把焦点移到 input 上(点击或者使用 tab 键),在一个小的覆盖层上打开一个交互日历。选择一个日期,点击页面上的任意地方(输入框即失去焦点),或者点击 Esc 键来关闭。如果选择了一个日期,则反馈显示为 input 的值。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
  </head>
  <body>
    <p>日期:<input type="text" id="datepicker" /></p>
    <script>
      $(document).ready(function () {
        $("#datepicker").datepicker();
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图173

更多例子代码,请查看 日期选择器(Datepicker)。下面是官方例子的简介:

  • 动画:当打开或关闭 datepicker 时使用不同的动画。从下拉框中选择一个动画,然后在输入框中点击来查看它的效果。您可以使用三个标准动画中任意一个,或者使用 UI 特效中的任意一个。
  • 其他月份的日期:datepicker 可以显示其他月份的日期,这些日期也可以设置成可选择的。
  • 显示按钮栏:通过布尔值的 showButtonPanel 选项为选择当天日期显示一个”Today”按钮,为关闭日历显示一个”Done”按钮。默认情况下,当按钮栏显示时会启用每个按钮,但是按钮可通过其他的选项进行关闭。按钮文本可自定义。
  • 内联显示:datepicker 是嵌套在页面中显示,而不是显示在一个覆盖层中。只需要简单地在 div 上调用 .datepicker() 即可,而不是在 input 上调用。
  • 显示月份 & 年份菜单:显示月份和年份的下拉框,而不是显示静态的月份/年份标题,这样便于在大范围的时间跨度上导航。添加布尔值 changeMonth 和 changeYear 选项即可。
  • 显示多个月份:设置 numberOfMonths 选项为一个整数 2,或者大于 2 的整数,来在一个 datepicker 中显示多个月份。
  • 格式化日期:以各种方式显示日期反馈。从下拉框中选择一种日期格式,然后在输入框中点击并选择一个日期,查看所选格式的日期显示。
  • 图标触发器:点击输入框旁边的图标来显示 datepicker。设置 datepicker 在获得焦点时打开(默认行为),或者在点击图标时打开,或者在获得焦点/点击图标时打开。
  • 本地化日历:本地化 datepicker 日历语言和格式(默认为 English / Western 格式)。datepicker 包含对从右到左读取的语言的内建支持,比如 Arabic 和 Hebrew。
  • 填充另一个输入框:使用 altField 和 altFormat 选项,无论何时选择日期,会在另一个输入框中填充带有一定格式的日期。这个功能通过对电脑友好性的日期进一步加工后,向用户呈现一个用户友好性的日期。
  • 限制日期范围:通过 minDate 和 maxDate 选项限制可选择的日期范围。设置起止日期为实际的日期(new Date(2009, 1 - 1, 26)),或者为与今天的一个数值偏移(-20),或者为一个周期和单位的字符串(’+1M +10D’)。如果设置为字符串,使用 ‘D’ 表示天,使用 ‘W’ 表示周,使用 ‘M’ 表示月,使用 ‘Y’ 表示年。
  • 选择一个日期范围:选择要搜索的日期范围。
  • 显示一年中的第几周:datepicker 可以显示一年中的第几周。默认的计算是按照 ISO 8601 定义:每周从星期一开始,每年的第一周包含该年的第一个星期四。这就意味着一年中的一些天可能是属于另一年中的周。

(9)按钮(Button)

用带有适当的悬停(hover)和激活(active)的样式的可主题化按钮来加强标准表单元素(比如按钮、输入框、锚)的功能。如需了解更多有关 button 部件的细节,请查看 官方 API 文档 按钮部件(Button Widget)

默认功能:可用于按钮的标记实例:一个 button 元素,一个类型为 submit 的 input 元素和一个锚。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
  </head>
  <body>
    <button>一个 button 元素</button>

    <input type="submit" value="一个提交按钮" />

    <a href="#">一个锚</a>
    <script>
      $(document).ready(function () {
        $("input[type=submit], a, button")
          .button()
          .click(function (event) {
            event.preventDefault();
          });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图174

更多例子代码,请查看 按钮(Button)。下面是官方例子的简介:

  • 复选框:通过 button 部件把复选框显示为切换按钮样式。与复选框相关的 label 元素作为按钮文本。本实例通过在一个公共的容器上调用 .buttonset(),演示了三个显示为按钮样式的复选框。
  • 图标:一些带有文本和图标的各种组合的按钮
  • 单选:三个单选按钮转变为一套按钮。
  • 分割按钮:将按钮分割。
  • 工具栏:一个多媒体播放器的工具栏。请看基础的标记:一些 button 元素,Shuffle 按钮是一个类型为 checkbox 的 input,Repeat 选项是三个类型为 radio 的 input。

(10)自动完成(Autocomplete)

根据用户输入值进行搜索和过滤,让用户快速找到并从预设值列表中选择。如需了解更多有关 autocomplete 部件的细节,请查看 官方 API 文档 自动完成部件(Autocomplete Widget)

默认功能:当您在输入域中输入时,自动完成(Autocomplete)部件提供相应的建议。在本实例中,提供了编程语言的建议选项,您可以输入 “ja” 尝试一下,可以得到 Java 或 JavaScript。数据源是一个简单的 JavaScript 数组,使用 source 选项提供给部件。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
  </head>
  <body>
    <div class="ui-widget">
      <label for="tags">标签:</label>
      <input id="tags" />
    </div>

    <script>
      $(document).ready(function () {
        var availableTags = [
          "ActionScript",
          "AppleScript",
          "Asp",
          "BASIC",
          "C",
          "C++",
          "Clojure",
          "COBOL",
          "ColdFusion",
          "Erlang",
          "Fortran",
          "Groovy",
          "Haskell",
          "Java",
          "JavaScript",
          "Lisp",
          "Perl",
          "PHP",
          "Python",
          "Ruby",
          "Scala",
          "Scheme",
        ];
        $("#tags").autocomplete({
          source: availableTags,
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图175

  • 包含重音:autocomplete 域使用自定义的 source 选项来匹配带有重音字符的结果项,即使文本域不包含重音字符也会匹配。但是如果您在文本域中键入了重音字符,则不会显示非重音的结果项。尝试键入 “Jo”,会看到 “John” 和 “Jörn”,然后 键入 “Jö”,只会看到 “Jörn”。

更多例子代码,请查看 自动完成(Autocomplete)。下面是官方例子的简介:

  • 分类:分类的搜索结果。尝试键入 “a” 或 “n”。
  • 组合框(Combobox):一个由 Autocomplete 和 Button 创建的自定义部件。您可以键入一些字符,来获得基于您的输入过滤的结果,或者使用按钮从完整列表中选择。该输入是从一个已有的 select 元素中读取,传递给带有自定义的 source 选项的 Autocomplete。这是一个不被支持的不完美的部件。这里纯粹是为了演示 autocomplete 定制功能。如需了解更多有关该部件工作原理的细节,请点击这里查看相关的 jQuery 文章
  • 自定义数据并显示:您可以使用自定义数据格式,并通过简单地重载默认的聚焦和选择行为来显示数据。尝试键入 “j”,或者按向下箭头按键,即可得到一个项目列表。
  • 多个值:用法:键入一些字符,比如 “j”,可以看到相关的编程语言结果。选择一个值,然后继续键入字符来添加其他的值。本实例演示如何使用 source 选项和一些事件来实现在一个单一的文本域输入多个自动完成的值。
  • 多个值,远程:用法:键入至少两个字符来获取目标名称。选择一个值,然后继续键入字符来添加其他的值。本实例演示如何使用 source 选项和一些事件来实现在一个单一的文本域输入多个自动完成的值。
  • 远程 JSONP 数据源:当您在文本域中键入字符时,Autocomplete 部件给出建议结果。在本实例中,当您在文本域中至少键入两个字符时,将显示相关城市的名称。在本实例中,数据源是 geonames.org webservice。虽然选择一个元素后文本域中是该城市名称,但是会显示更多的信息以便找到正确的条目。数据也可以回调,显示在下面的结果框中。
  • 远程数据源:当您在文本域中键入字符时,Autocomplete 部件给出建议结果。在本实例中,当您在文本域中至少键入两个字符时,将显示相关目标名称。在本实例中,数据源是可返回 JSON 数据的服务器端脚本,通过一个简单的 source 选项来指定。另外,minLength 选项设置为 2,避免查询返回太多的结果,select 事件用于显示一些反馈。
  • 远程缓存:当您在文本域中键入字符时,Autocomplete 部件给出建议结果。在本实例中,当您在文本域中至少键入两个字符时,将显示相关目标名称。为了提高性能,这里添加了一些本地缓存,其他与远程数据源实例相似。在这里,缓存只保存了一个查询,并可以扩展到缓存多个值,每个条目一个值。
  • 可滚动的结果:当显示一个长列表的选项时,您可以简单地为 autocomplete 菜单设置 max-height 来防止菜单显示太长。尝试键入 “a” 或 “s” 来获得一个可滚动的长列表的结果。
  • XML 数据:本实例演示如何获取一些 XML 数据,并使用 jQuery 的方法解析它,然后把它提供给 autocomplete 作为数据源。本实例也可作为解析远程 XML 数据源的参考 - 解析在每次 source 回调请求时发生。

(11)折叠面板(Accordion)

在一个有限的空间内显示用于呈现信息的可折叠的内容面板。如需了解更多有关 accordion 部件的细节,请查看 官方 API 文档 折叠面板部件(Accordion Widget)

  • 默认功能:点击头部展开/折叠被分为各个逻辑部分的内容,就像标签页(tabs)一样。您可以选择性地设置当鼠标悬停时是否切换各部分的打开/关闭状态。基本的 HTML 标记是一系列的标题(H3 标签)和内容 div,因此内 `容不用通过 JavaScript 即可用。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
  </head>
  <body>
    <div id="accordion">
      <h3>部分 1</h3>
      <div>
        <p>
          Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam.
          Integer ut neque. Vivamus nisi metus, molestie vel, gravida in,
          condimentum sit amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi.
          Proin viverra leo ut odio. Curabitur malesuada. Vestibulum a velit eu
          ante scelerisque vulputate.
        </p>
      </div>
      <h3>部分 2</h3>
      <div>
        <p>
          Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet
          purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis
          porttitor velit, faucibus interdum tellus libero ac justo. Vivamus non
          quam. In suscipit faucibus urna.
        </p>
      </div>
      <h3>部分 3</h3>
      <div>
        <p>
          Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque
          lobortis. Phasellus pellentesque purus in massa. Aenean in pede.
          Phasellus ac libero ac tellus pellentesque semper. Sed ac felis. Sed
          commodo, magna quis lacinia ornare, quam ante aliquam nisi, eu iaculis
          leo purus venenatis dui.
        </p>
        <ul>
          <li>List item one</li>
          <li>List item two</li>
          <li>List item three</li>
        </ul>
      </div>
      <h3>部分 4</h3>
      <div>
        <p>
          Cras dictum. Pellentesque habitant morbi tristique senectus et netus
          et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in
          faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia
          mauris vel est.
        </p>
        <p>
          Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat
          lectus. Class aptent taciti sociosqu ad litora torquent per conubia
          nostra, per inceptos himenaeos.
        </p>
      </div>
    </div>

    <script>
      $(document).ready(function () {
        $("#accordion").accordion();
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图176

更多例子代码,请查看 折叠面板(Accordion)。下面是官方例子的简介:

  • 折叠内容:默认情况下,折叠面板总是保持一个部分是打开的。为了让所有部分都是折叠的,可设置 collapsible 选项为 true。点击当前打开的部分,来折叠它的内容面板。
  • 自定义图标:通过 icons 选项自定义标题图标,icons 选项接受标题默认的和激活的(打开的)状态的 class。使用 UI CSS 框架中的任意 class,或者使用背景图像创建自定义的 class。
  • 填充空间:由于折叠面板是由块级元素组成的,默认情况下它的宽度会填充可用的水平空间。为了填充由容器分配的垂直空间,设置 heightStyle 选项为 “fill”,脚本会自动设置折叠面板的尺寸为父容器的高度。
  • 非自动高度:设置 heightStyle: “content”,让折叠面板保持它们初始的高度。
  • 当悬停时打开:点击头部展开/折叠被分为各个逻辑部分的内容,就像标签页(tabs)一样。您可以选择性地设置当鼠标悬停时是否切换各部分的打开/关闭状态。基本的 HTML 标记是一系列的标题(H3 标签)和内容 div,因此内容不用通过 JavaScript 即可用。
  • 排序(Sortable):拖拽标题来给面板重新排序。

4.6 效果库(Effects)

(1)显示(Show)

使用自定义效果来显示匹配的元素。如需了解更多有关 .show() 方法的细节,请查看 官方 API 文档 .show()

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      .toggler {
        width: 500px;
        height: 200px;
      }

      #button {
        padding: 0.5em 1em;
        text-decoration: none;
      }

      #effect {
        width: 240px;
        height: 135px;
        padding: 0.4em;
        position: relative;
      }

      #effect h3 {
        margin: 0;
        padding: 0.4em;
        text-align: center;
      }
    </style>
  </head>
  <body>
    <div class="toggler">
      <div id="effect" class="ui-widget-content ui-corner-all">
        <h3 class="ui-widget-header ui-corner-all">显示(Show)</h3>
        <p>
          Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed
          pede. Nulla lorem metus, adipiscing ut, luctus sed, hendrerit vitae,
          mi.
        </p>
      </div>
    </div>

    <select name="effects" id="effectTypes">
      <option value="blind">百叶窗特效(Blind Effect)</option>
      <option value="bounce">反弹特效(Bounce Effect)</option>
      <option value="clip">剪辑特效(Clip Effect)</option>
      <option value="drop">降落特效(Drop Effect)</option>
      <option value="explode">爆炸特效(Explode Effect)</option>
      <option value="fold">折叠特效(Fold Effect)</option>
      <option value="highlight">突出特效(Highlight Effect)</option>
      <option value="puff">膨胀特效(Puff Effect)</option>
      <option value="pulsate">跳动特效(Pulsate Effect)</option>
      <option value="scale">缩放特效(Scale Effect)</option>
      <option value="shake">震动特效(Shake Effect)</option>
      <option value="size">尺寸特效(Size Effect)</option>
      <option value="slide">滑动特效(Slide Effect)</option>
    </select>

    <a href="#" id="button" class="ui-state-default ui-corner-all">运行特效</a>

    <script>
      $(document).ready(function () {
        // 运行当前选中的特效
        function runEffect() {
          // 从中获取特效类型
          var selectedEffect = $("#effectTypes").val();

          // 大多数的特效类型默认不需要传递选项
          var options = {};
          // 一些特效带有必需的参数
          if (selectedEffect === "scale") {
            options = {
              percent: 100,
            };
          } else if (selectedEffect === "size") {
            options = {
              to: {
                width: 280,
                height: 185,
              },
            };
          }

          // 运行特效
          $("#effect").show(selectedEffect, options, 500, callback);
        }

        // 回调函数
        function callback() {
          setTimeout(function () {
            $("#effect:visible").removeAttr("style").fadeOut();
          }, 1000);
        }

        // 根据选择菜单值设置特效
        $("#button").click(function () {
          runEffect();
          return false;
        });

        $("#effect").hide();
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图177

(2)特效(Effect)

对一个元素应用动画特效。如需了解更多有关 .effect() 方法的细节,请查看 官方 API 文档 .effect()

  • .effect() 演示:点击按钮预览特效。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      .toggler {
        width: 500px;
        height: 200px;
        position: relative;
      }

      #button {
        padding: 0.5em 1em;
        text-decoration: none;
      }

      #effect {
        width: 240px;
        height: 135px;
        padding: 0.4em;
        position: relative;
      }

      #effect h3 {
        margin: 0;
        padding: 0.4em;
        text-align: center;
      }

      .ui-effects-transfer {
        border: 2px dotted gray;
      }
    </style>
  </head>
  <body>
    <div class="toggler">
      <div id="effect" class="ui-widget-content ui-corner-all">
        <h3 class="ui-widget-header ui-corner-all">特效(Effect)</h3>
        <p>
          Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed
          pede. Nulla lorem metus, adipiscing ut, luctus sed, hendrerit vitae,
          mi.
        </p>
      </div>
    </div>

    <select name="effects" id="effectTypes">
      <option value="blind">百叶窗特效(Blind Effect)</option>
      <option value="bounce">反弹特效(Bounce Effect)</option>
      <option value="clip">剪辑特效(Clip Effect)</option>
      <option value="drop">降落特效(Drop Effect)</option>
      <option value="explode">爆炸特效(Explode Effect)</option>
      <option value="fade">淡入淡出特效(Fade Effect)</option>
      <option value="fold">折叠特效(Fold Effect)</option>
      <option value="highlight">突出特效(Highlight Effect)</option>
      <option value="puff">膨胀特效(Puff Effect)</option>
      <option value="pulsate">跳动特效(Pulsate Effect)</option>
      <option value="scale">缩放特效(Scale Effect)</option>
      <option value="shake">震动特效(Shake Effect)</option>
      <option value="size">尺寸特效(Size Effect)</option>
      <option value="slide">滑动特效(Slide Effect)</option>
      <option value="transfer">转移特效(Transfer Effect)</option>
    </select>

    <a href="#" id="button" class="ui-state-default ui-corner-all">运行特效</a>

    <script>
      $(document).ready(function () {
        // 运行当前选中的特效
        function runEffect() {
          // 从中获取特效类型
          var selectedEffect = $("#effectTypes").val();

          // 大多数的特效类型默认不需要传递选项
          var options = {};
          // 一些特效带有必需的参数
          if (selectedEffect === "scale") {
            options = {
              percent: 0,
            };
          } else if (selectedEffect === "transfer") {
            options = {
              to: "#button",
              className: "ui-effects-transfer",
            };
          } else if (selectedEffect === "size") {
            options = {
              to: {
                width: 200,
                height: 60,
              },
            };
          }

          // 运行特效
          $("#effect").effect(selectedEffect, options, 500, callback);
        }

        // 回调函数
        function callback() {
          setTimeout(function () {
            $("#effect").removeAttr("style").hide().fadeIn();
          }, 1000);
        }

        // 根据选择菜单值设置特效
        $("#button").click(function () {
          runEffect();
          return false;
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图178

更多例子代码,请查看 特效(Effect)。下面是官方例子的简介:

  • Easing 演示:本实例使用 HTML Canvas 元素,绘制了 jQuery UI 提供的所有 easings。 点击每个图可查看该 easing 的行为。

(3)隐藏(Hide)

使用自定义效果来隐藏匹配的元素。如需了解更多有关 .hide() 方法的细节,请查看 官方 API 文档 .hide()

  • .hide() 演示:点击按钮预览特效。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      .toggler {
        width: 500px;
        height: 200px;
      }

      #button {
        padding: 0.5em 1em;
        text-decoration: none;
      }

      #effect {
        width: 240px;
        height: 135px;
        padding: 0.4em;
        position: relative;
      }

      #effect h3 {
        margin: 0;
        padding: 0.4em;
        text-align: center;
      }
    </style>
  </head>
  <body>
    <div class="toggler">
      <div id="effect" class="ui-widget-content ui-corner-all">
        <h3 class="ui-widget-header ui-corner-all">隐藏(Hide)</h3>
        <p>
          Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed
          pede. Nulla lorem metus, adipiscing ut, luctus sed, hendrerit vitae,
          mi.
        </p>
      </div>
    </div>

    <select name="effects" id="effectTypes">
      <option value="blind">百叶窗特效(Blind Effect)</option>
      <option value="bounce">反弹特效(Bounce Effect)</option>
      <option value="clip">剪辑特效(Clip Effect)</option>
      <option value="drop">降落特效(Drop Effect)</option>
      <option value="explode">爆炸特效(Explode Effect)</option>
      <option value="fold">折叠特效(Fold Effect)</option>
      <option value="highlight">突出特效(Highlight Effect)</option>
      <option value="puff">膨胀特效(Puff Effect)</option>
      <option value="pulsate">跳动特效(Pulsate Effect)</option>
      <option value="scale">缩放特效(Scale Effect)</option>
      <option value="shake">震动特效(Shake Effect)</option>
      <option value="size">尺寸特效(Size Effect)</option>
      <option value="slide">滑动特效(Slide Effect)</option>
    </select>

    <a href="#" id="button" class="ui-state-default ui-corner-all">运行特效</a>

    <script>
      $(document).ready(function () {
        // 运行当前选中的特效
        function runEffect() {
          // 从中获取特效类型
          var selectedEffect = $("#effectTypes").val();

          // 大多数的特效类型默认不需要传递选项
          var options = {};
          // 一些特效带有必需的参数
          if (selectedEffect === "scale") {
            options = {
              percent: 0,
            };
          } else if (selectedEffect === "size") {
            options = {
              to: {
                width: 200,
                height: 60,
              },
            };
          }

          // 运行特效
          $("#effect").hide(selectedEffect, options, 1000, callback);
        }

        // 回调函数
        function callback() {
          setTimeout(function () {
            $("#effect").removeAttr("style").hide().fadeIn();
          }, 1000);
        }

        // 根据选择菜单值设置特效
        $("#button").click(function () {
          runEffect();
          return false;
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图179

(4)切换(Toggle)

使用自定义效果来显示或隐藏匹配的元素。如需了解更多有关 .toggle() 方法的细节,请查看 官方 API 文档 .toggle()

  • .toggle() 演示:点击按钮预览特效。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      .toggler {
        width: 500px;
        height: 200px;
      }

      #button {
        padding: 0.5em 1em;
        text-decoration: none;
      }

      #effect {
        position: relative;
        width: 240px;
        height: 135px;
        padding: 0.4em;
      }

      #effect h3 {
        margin: 0;
        padding: 0.4em;
        text-align: center;
      }
    </style>
  </head>
  <body>
    <div class="toggler">
      <div id="effect" class="ui-widget-content ui-corner-all">
        <h3 class="ui-widget-header ui-corner-all">切换(Toggle)</h3>
        <p>
          Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed
          pede. Nulla lorem metus, adipiscing ut, luctus sed, hendrerit vitae,
          mi.
        </p>
      </div>
    </div>

    <select name="effects" id="effectTypes">
      <option value="blind">百叶窗特效(Blind Effect)</option>
      <option value="bounce">反弹特效(Bounce Effect)</option>
      <option value="clip">剪辑特效(Clip Effect)</option>
      <option value="drop">降落特效(Drop Effect)</option>
      <option value="explode">爆炸特效(Explode Effect)</option>
      <option value="fold">折叠特效(Fold Effect)</option>
      <option value="highlight">突出特效(Highlight Effect)</option>
      <option value="puff">膨胀特效(Puff Effect)</option>
      <option value="pulsate">跳动特效(Pulsate Effect)</option>
      <option value="scale">缩放特效(Scale Effect)</option>
      <option value="shake">震动特效(Shake Effect)</option>
      <option value="size">尺寸特效(Size Effect)</option>
      <option value="slide">滑动特效(Slide Effect)</option>
    </select>

    <a href="#" id="button" class="ui-state-default ui-corner-all">运行特效</a>
    <script>
      $(document).ready(function () {
        // 运行当前选中的特效
        function runEffect() {
          // 从中获取特效类型
          var selectedEffect = $("#effectTypes").val();

          // 大多数的特效类型默认不需要传递选项
          var options = {};
          // 一些特效带有必需的参数
          if (selectedEffect === "scale") {
            options = {
              percent: 0,
            };
          } else if (selectedEffect === "size") {
            options = {
              to: {
                width: 200,
                height: 60,
              },
            };
          }

          // 运行特效
          $("#effect").toggle(selectedEffect, options, 500);
        }

        // 根据选择菜单值设置特效
        $("#button").click(function () {
          runEffect();
          return false;
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图180

(5)添加 Class(Add Class)

当动画样式改变时,为匹配的元素集合内的每个元素添加指定的 Class。如需了解更多有关 .addClass() 方法的细节,请查看 官方 API 文档 .addClass()

  • .addClass() 演示:点击按钮预览特效。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      .toggler {
        width: 500px;
        height: 200px;
        position: relative;
      }

      #button {
        padding: 0.5em 1em;
        text-decoration: none;
      }

      #effect {
        width: 240px;
        padding: 1em;
        font-size: 1.2em;
        border: 1px solid #000;
        background: #eee;
        color: #333;
      }

      .newClass {
        text-indent: 40px;
        letter-spacing: 0.4em;
        width: 410px;
        height: 100px;
        padding: 30px;
        margin: 10px;
        font-size: 1.6em;
      }
    </style>
  </head>
  <body>
    <div class="toggler">
      <div id="effect" class="ui-corner-all">
        Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede.
      </div>
    </div>

    <a href="#" id="button" class="ui-state-default ui-corner-all">运行特效</a>
    <script>
      $(document).ready(function () {
        $("#button").click(function () {
          $("#effect").addClass("newClass", 1000, callback);
          return false;
        });

        function callback() {
          setTimeout(function () {
            $("#effect").removeClass("newClass");
          }, 1500);
        }
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图181

(6)移除 Class(Remove Class)

当动画样式改变时,为匹配的元素集合内的每个元素移除指定的 Class。如需了解更多有关 .removeClass() 方法的细节,请查看 官方 API 文档 .removeClass()

  • .removeClass() 演示:点击按钮预览特效。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      .toggler {
        width: 500px;
        height: 200px;
        position: relative;
      }

      #button {
        padding: 0.5em 1em;
        text-decoration: none;
      }

      #effect {
        position: relative;
        width: 240px;
        padding: 1em;
        letter-spacing: 0;
        font-size: 1.2em;
        border: 1px solid #000;
        background: #eee;
        color: #333;
      }

      .newClass {
        text-indent: 40px;
        letter-spacing: 0.4em;
        width: 410px;
        height: 100px;
        padding: 30px;
        margin: 10px;
        font-size: 1.6em;
      }
    </style>
  </head>
  <body>
    <div class="toggler">
      <div id="effect" class="newClass ui-corner-all">
        Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede.
      </div>
    </div>

    <a href="#" id="button" class="ui-state-default ui-corner-all">运行特效</a>
    <script>
      $(document).ready(function () {
        $("#button").click(function () {
          $("#effect").removeClass("newClass", 1000, callback);
          return false;
        });

        function callback() {
          setTimeout(function () {
            $("#effect").addClass("newClass");
          }, 1500);
        }
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图182

(7)切换 Class(Toggle Class)

当动画样式改变时,根据 Class 是否存在以及 switch 参数的值,为匹配的元素集合内的每个元素添加或移除一个或多个 Class。如需了解更多有关 .toggleClass() 方法的细节,请查看 官方 API 文档 .toggleClass()

  • .toggleClass() 演示:点击按钮预览特效。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      .toggler {
        width: 500px;
        height: 200px;
        position: relative;
      }

      #button {
        padding: 0.5em 1em;
        text-decoration: none;
      }

      #effect {
        position: relative;
        width: 240px;
        padding: 1em;
        letter-spacing: 0;
        font-size: 1.2em;
        border: 1px solid #000;
        background: #eee;
        color: #333;
      }

      .newClass {
        text-indent: 40px;
        letter-spacing: 0.4em;
        width: 410px;
        height: 100px;
        padding: 30px;
        margin: 10px;
        font-size: 1.6em;
      }
    </style>
  </head>
  <body>
    <div class="toggler">
      <div id="effect" class="newClass ui-corner-all">
        Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede.
      </div>
    </div>

    <a href="#" id="button" class="ui-state-default ui-corner-all">运行特效</a>
    <script>
      $(document).ready(function () {
        $("#button").click(function () {
          $("#effect").toggleClass("newClass", 1000);
          return false;
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图183

(8)转换 Class(Switch Class)

当动画样式改变时,为匹配的元素集合内的每个元素添加和移除指定的 Class。如需了解更多有关 .switchClass() 方法的细节,请查看 官方 API 文档 .switchClass()

  • .switchClass() 演示:点击按钮预览特效。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      .toggler {
        width: 500px;
        height: 200px;
        position: relative;
      }

      #button {
        padding: 0.5em 1em;
        text-decoration: none;
      }

      #effect {
        position: relative;
      }

      .newClass {
        width: 240px;
        padding: 1em;
        letter-spacing: 0;
        font-size: 1.2em;
        margin: 0;
      }

      .anotherNewClass {
        text-indent: 40px;
        letter-spacing: 0.4em;
        width: 410px;
        height: 100px;
        padding: 30px;
        margin: 10px;
        font-size: 1.6em;
      }
    </style>
  </head>
  <body>
    <div class="toggler">
      <div id="effect" class="newClass ui-corner-all">
        Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede.
      </div>
    </div>
    <a href="#" id="button" class="ui-state-default ui-corner-all">运行特效</a>
    <script>
      $(document).ready(function () {
        $("#button").click(function () {
          $(".newClass").switchClass("newClass", "anotherNewClass", 1000);
          $(".anotherNewClass").switchClass(
            "anotherNewClass",
            "newClass",
            1000
          );
          return false;
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图184

(9)颜色动画(Color Animation)

使用 .animate() 实现颜色动画效果。如需了解更多有关颜色动画(Color Animation)的细节,请查看 官方 API 文档 颜色动画(Color Animation)。jQuery UI 捆绑了 jQuery Color 插件,jQuery Color 插件提供了颜色动画及其他许多与颜色相关的实用功能。

  • 动画(Animation)演示:点击按钮预览特效。

例子:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title></title>
    <link rel="stylesheet" href="jquery-ui.css" />
    <script type="text/javascript" src="jquery-3.3.1.js"></script>
    <script src="jquery-ui.js"></script>
    <style>
      .toggler {
        width: 500px;
        height: 200px;
        position: relative;
      }

      #button {
        padding: 0.5em 1em;
        text-decoration: none;
      }

      #effect {
        width: 240px;
        height: 135px;
        padding: 0.4em;
        position: relative;
        background: #fff;
      }

      #effect h3 {
        margin: 0;
        padding: 0.4em;
        text-align: center;
      }
    </style>
  </head>
  <body>
    <div class="toggler">
      <div id="effect" class="ui-widget-content ui-corner-all">
        <h3 class="ui-widget-header ui-corner-all">动画(Animation)</h3>
        <p>
          Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed
          pede. Nulla lorem metus, adipiscing ut, luctus sed, hendrerit vitae,
          mi.
        </p>
      </div>
    </div>

    <a href="#" id="button" class="ui-state-default ui-corner-all">切换特效</a>
    <script>
      $(document).ready(function () {
        var state = true;
        $("#button").click(function () {
          if (state) {
            $("#effect").animate(
              {
                backgroundColor: "#aa0000",
                color: "#fff",
                width: 500,
              },
              1000
            );
          } else {
            $("#effect").animate(
              {
                backgroundColor: "#fff",
                color: "#000",
                width: 240,
              },
              1000
            );
          }
          state = !state;
        });
      });
    </script>
  </body>
</html>

运行效果为:

JQuery - 图185

五、总结

本节实验介绍了三个 jQuery 插件:

  • jQuery 表单验证插件 Validation
  • jQuery Cookie 插件
  • jQuery UI 插件(重点介绍)

其中对于 jQuery UI 插件进行了大篇幅的讲解,认真完成本节的学习,那么我们不仅学习了 jQuery 的使用,还学会了一个 UI 框架的使用。