关于jQuery参考实例 1.0 jQuery的哲学


Posted in Javascript onApril 07, 2013

本文翻译自jQuery Cookbook (O'Reilly 2009) 1.0 The jQuery Philosophy

jQuery的哲学是“写更少的代码,做更多的事情”,这一哲学可分述为三个概念:

  • 用CSS选择器查找元素,并通过jQuery方法来操作这些元素
  • 在元素集上链式调用多个jQuery方法
  • jQuery封装与隐式遍历

充分理解这三个概念对于编写jQuery代码来说至关重要。我们来详细看一下这三个概念。

查找元素并进行操作

更准确的说,是在DOM树中定位一批元素,然后对该元素集进行操作。比如下面这个例子:首先向用户隐藏一个<div>元素,然后向这个隐藏了的<div>元素内插入一些新文本,之后更改其属性,最后重新显示这个<div>元素。相应的jQuery代码如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
 <script type="text/JavaScript"
  src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
</head>
<body>
 <div>old content</div>
 <script>
  //隐藏页面上所有的div元素
  jQuery('div').hide();
  //更新所有div元素内的文本
  jQuery('div').text('new content');
  //在所有的div元素上添加值为updatedContent的class属性
  jQuery('div').addClass("updatedContent");
  //显示页面上所有的div元素
  jQuery('div').show();
 </script>
</body>
</html>

我们来逐一看一下这四个jQuery语句:

  • 隐藏页面上所有的div元素,让它们变得不可见
  • 用新文本('new content')来替换隐藏的div元素中的原有文本
  • 向div元素添加新的class属性值(updatedContent)
  • 在页面上重新显示div元素

上面的例子使用jQuery函数查找HTML页面中所有的<div>元素,然后用jQuery方法对其进行操作(hide(), text(), addClass(), show())。

链式调用

在调用jQuery方法的时候,按照jQuery的设计,可以对这些方法进行链式调用。比如,只做一次元素查找,然后在找到的元素上展开一系列操作。之前的代码示例可以用链式调用重写为一句JavaScript语句。

使用链式调用,可以将下面的代码:

//隐藏页面上所有的div元素
jQuery('div').hide();
//更新所有div元素内的文本
jQuery('div').text('new content');
//在所有的div元素上添加值为updatedContent的class属性
jQuery('div').addClass("updatedContent");
//显示页面上所有的div元素
jQuery('div').show();

重写成:

jQuery('div').hide().text('new content').addClass("updatedContent").show();

如果加上代码缩进就是:

jQuery('div')
 .hide()
 .text('new content')
 .addClass("updatedContent")
 .show();

简单地说,链式调用允许在当前选择的元素集上,将无限个jQuery方法连在一起使用。究其实质,用jQuery方法处理的元素总会在方法处理完毕之后得到返回,因此链式调用可以一直继续。jQuery的插件也是这样设计的(返回封装的元素集),因此使用插件并不会影响链式调用。

链式调用的另一个好处是通过只选择一次DOM元素来节省开销。避免遍历DOM树,对于网页性能提升来说至关重要,因此需要尽可能重用或者缓存已选择的DOM元素集。

jQuery封装

在大多数情况下,如果使用了jQuery,那么必定会和一个叫做“jQuery封装”的东西打交道。换而言之,用jQuery从HTML页面上选择出来的元素会被封装上一层jQuery提供的功能。我个人喜欢把这个东西叫做“封装元素集”,因为它是一个封装了jQuery功能的元素集合。这个封装元素集有时包含一个DOM元素,有时包含多个,有时甚至里面什么都没有。当封装元素集为空时,在其上调用的jQuery方法/属性不会抛出任何错误 — 这样做可以避免不必要的if语句。

还是以上面的HTML代码为例,当网页中存在多个<div>元素的时候会怎么样?在下面的例子中,HTML页面多了3个<div>元素:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
 <script type="text/JavaScript" src="http://ajax.googleapis.com/ajax/libs/
  jquery/1.3.0/jquery.min.js"></script> </head>
<body>
 <div>old content</div>
 <div>old content</div>
 <div>old content</div>
 <div>old content</div>
 <script>
  jQuery('div').hide().text('new content').addClass("updatedContent").show();
 </script>
</body>
</html>

在上面的例子中并没有任何表示循环的编程代码。但奇妙的是,jQuery会扫描整个页面,然后将所有的<div>元素放到封装元素集中,之后对该封装集中的每一个元素(隐式遍历)执行代码定义的一系列jQuery方法。比如,封装集中的每一个元素都调用了.hide()。在上述代码中,实际上我们使用的每一个方法(hide(), text(), addClass(), show())都在页面中所有的div元素上起了作用,就像人为写了一个循环方法来遍历DOM元素一样。上述代码的执行结果是:页面中的每一个<div>元素都被隐藏,更改内含文本,添加class属性,并最终重新显现。

熟悉封装元素集和隐式遍历对于编写复杂的循环逻辑来说非常重要 — 需要留意的是,在写任何额外的循环代码之前,一个简单的循环操作已经存在了(比如:jQuery(‘div').each(function(){})。换而言之,jQuery方法的调用会影响封装元素集中的每一个元素。

需要注意的是,有一些jQuery方法的行为特殊,只会影响封装元素集中的第一个元素(比如:attr())。


Javascript 相关文章推荐
iis6+javascript Add an Extension File
Jun 13 Javascript
JavaScript 加号(+)运算符号
Dec 06 Javascript
jQuery 学习第七课 扩展jQuery的功能 插件开发
May 17 Javascript
文本框输入时 实现自动提示(像百度、google一样)
Apr 05 Javascript
JavaScript简单下拉菜单实例代码
Sep 07 Javascript
基于jQuery实现火焰灯效果导航菜单
Jan 04 Javascript
原生JS实现小小的音乐播放器
Oct 16 Javascript
详解react、redux、react-redux之间的关系
Apr 11 Javascript
vue项目中应用ueditor自定义上传按钮功能
Apr 27 Javascript
webpack@v4升级踩坑(小结)
Oct 08 Javascript
fetch 如何实现请求数据
Dec 20 Javascript
微信小程序实现导航栏和内容上下联动功能代码
Jun 29 Javascript
jQuery操作checkbox选择(list/table)
Apr 07 #Javascript
关于jQuery参考实例2.0 用jQuery选择元素
Apr 07 #Javascript
js将long日期格式转换为标准日期格式实现思路
Apr 07 #Javascript
jQuery对象数据缓存Cache原理及jQuery.data方法区别介绍
Apr 07 #Javascript
关于jQuery对象数据缓存Cache原理以及jQuery.data详解
Apr 07 #Javascript
有关于eclipse配置spket需要注意的一些地方
Apr 07 #Javascript
如何在一个页面显示多个百度地图
Apr 07 #Javascript
You might like
咖啡机如何保养和日常清洁?
2021/03/03 冲泡冲煮
PHP面向对象的使用教程 简单数据库连接
2006/11/25 PHP
PHP程序漏洞产生的原因分析与防范方法说明
2014/03/06 PHP
表单提交错误后返回内容消失问题的解决方法(PHP网站)
2015/10/20 PHP
Yii框架创建cronjob定时任务的方法分析
2017/05/23 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
创建一个复制UBB软件信息的链接或按钮的js代码
2008/01/06 Javascript
根据json字符串生成Html的一种方式
2013/01/09 Javascript
js读取被点击次数的简单实例(从数据库中读取)
2014/03/07 Javascript
arguments对象验证函数的参数是否合法
2015/06/26 Javascript
JS继承之借用构造函数继承和组合继承
2016/09/07 Javascript
JavaScript中的await/async的作用和用法
2016/10/31 Javascript
浅谈JavaScript的函数及作用域
2016/12/30 Javascript
Node.js调试技术总结分享
2017/03/12 Javascript
详解node HTTP请求客户端 - Request
2017/05/05 Javascript
JS 调试中常见的报错问题解决方法
2017/05/20 Javascript
详解在express站点中使用ejs模板引擎
2017/09/21 Javascript
JavaScript重复元素处理方法分析【统计个数、计算、去重复等】
2017/12/14 Javascript
Vue.js 中的 v-cloak 指令及使用详解
2018/11/19 Javascript
个人小程序接入支付解决方案
2019/05/23 Javascript
vue中获取滚动table的可视页面宽度调整表头与列对齐(每列宽度不都相同)
2019/08/17 Javascript
浅谈vue异步数据影响页面渲染
2019/10/29 Javascript
浅谈Vue3 Composition API如何替换Vue Mixins
2020/04/29 Javascript
Vue清除定时器setInterval优化方案分享
2020/07/21 Javascript
vue项目配置 webpack-obfuscator 进行代码加密混淆的实现
2021/02/26 Vue.js
Python求两个圆的交点坐标或三个圆的交点坐标方法
2018/11/07 Python
postman和python mock测试过程图解
2020/02/22 Python
python exit出错原因整理
2020/08/31 Python
通过代码实例了解Python sys模块
2020/09/14 Python
英国受欢迎的运动鞋和街头服装商店:Footasylum
2018/06/12 全球购物
商场端午节活动方案
2014/01/29 职场文书
励志广播稿300字(5篇)
2014/09/15 职场文书
2015年财务部年度工作总结
2015/05/19 职场文书
OpenCV-Python实现人脸磨皮算法
2021/06/07 Python
关于mysql中时间日期类型和字符串类型的选择
2021/11/27 MySQL
使用vuex-persistedstate本地存储vuex
2022/04/29 Vue.js