jQuery是一个非常好用的开源javascript框架,因为其语法简洁通用,尤其是选择器和css选择器非常相似,非常适合于前段开发人员使用,并且jquery还有很多成熟的插件可供使用。我在这篇博客里不讲jquery的应用,因为这样的文章在网上有很多,而且很多人只要jquery api文档一看就知道该怎么使用了。
熟悉css的前段开发人员一看jquery的选择器就非常清楚了,因为jquery的dom元素选择器表达式和css选择器表达式非常的相似。下面我就来说说,jquery是怎样实现这种表达式的。jquery的所有函数实际上是一个匿名函数的内部函数。jquery通过javascript的闭包机制来保护内部函数,防止外部程序随意调用内部函数。这个匿名函数是(function(){}),在这个匿名函数后面加个(),就能调用了这个匿名函数。
设置jquery变量,使这个变量为window对象,使其 jQuery = window.jQuery = window.$ = function( selector, context ) {
return new jQuery.fn.init( selector, context );
} jQuery.fn为jQuery的原生对象,jQuery.fn是一个json格式的object对象,其中有个函数init,这个函数的执行流程如下:首先判断selector有没有定义,如果没有定义,selector变为document对象;如果selector不是dom元素,那么执行下面的流程,如果selector为dom元素,将该selector赋为jquery的第一个数组元素,将jquery的长度设为1,将selector赋给context对象,并返回该jquery对象。如果selector为string对象,正则表达式去匹配该对象,这个正则表达式匹配html元素或者id元素。如果为html元素,则创建一个xml dom元素。如果为id元素,则通过document.getElementById获取element节点。如果为其他的类似css选择器表达式,很多浏览器支持document.querySelector和document.querySelectorAll方法,这种方法传入的参数都是css选择器表达式,前者返回的对象是node对象,后者返回的是nodelist对象。将得到的nodelist对象转换为数组,并将其放入jquery对象中,返回该jQuery对象。
如果浏览器不支持这种方法(譬如ie6),jquery还提供了对jquery表达式的解析。如果传入的参数为*,同时传过来的context为查找范围,默认的是document。首先和几个正则表达式进行匹配,这些正则表达式是Expr.match里边,分别为ID CLASS NAME ATTR TAG CHILD POS PSEUDO,当然*肯定匹配TAG类型的正则表达式。直接调用context.getElementsByTagName("*")得到所有的对象,再将这些对象放入jquery中,进行一下封装就变成了jquery对象。
如果传过来的参数为class名字,同时传过来的context为查找范围,默认的是document。首先和几个正则表达式进行匹配,这些正则表达式是Expr.match里边,分别为ID CLASS NAME ATTR TAG CHILD POS PSEUDO,当然class肯定匹配CLASS类型的正则表达式。直接调用context.getElementsByClassName得到所有的对象,再将这些对象放入jquery中,进行一下封装就变成了jquery对象。
如果传过来的参数为name节点名称,同时传过来的context为查找范围,默认的是document。首先和几个正则表达式进行匹配,这些正则表达式是Expr.match里边,分别为ID CLASS NAME ATTR TAG CHILD POS PSEUDO,当然name肯定匹配CLASS类型的正则表达式。直接调用context.getElementsByTagName得到所有的对象,再将这些对象放入jquery中,进行一下封装就变成了jquery对象。
如果传过来的参数为多个选择器表达式,则对这些表达式采用递归的方法进行逐个解析,方法和上面的相同,只不过将最后得到的对象统一封装为jquery对象。
如果传过来的参数为匹配所有后代元素的层级表达式,则先对后代元素表达式进行解析,得到所有匹配后代元素的对象。然后得到这些后代元素的parentNode对象进行循环查找(即查找这些元素的parent对象的parent对象),和父元素进行比较,如果匹配,则将这些匹配的后代元素集合封装为jquery对象。如果传过来的参数为匹配所有子元素的层级表达式,则先对子元素表达式进行解析,得到所有匹配子元素的对象。然后得到这些子元素的parentNode对象进行查找,而不对其parent对象的parent对象进行查找,和父元素进行比较,如果匹配,则将这些匹配的子元素集合封装为jquery对象。
如果传过来的参数为匹配相邻元素的层级表达式,则先对next元素表达式进行解析,得到所有匹配next元素的对象。然后得到这些next元素的previousSibling对象,和prev元素进行比较,如果匹配,则将这些匹配的next元素集合封装为jquery对象。如果传过来的参数为匹配所有相邻元素的层级表达式,则先对next元素表达式进行解析,得到所有匹配next元素的对象。然后循环查找得到这些next元素的所有previousSibling对象,和prev元素进行比较,如果匹配,则将这些匹配的next元素集合封装为jquery对象。
如果传过来的参数为匹配基本选择器的表达式,在Expr这个JSON对象中,有个setFilters的object对象,首先正则表达式进行匹配,将:之前的表达式进行解析,得到所有对应的dom元素,再对:之后的表达式进行匹配,与Expr中的setFilters对象中的函数进行比较,如果匹配,则将匹配的dom元素放入jquery对象中,封装为一个jquery对象。
如果传过来的参数为内容选择器的表达式,在Expr这个JSON对象中,有个filters的object对象,首先正则表达式进行匹配,将:之前的表达式进行解析,得到所有对应的dom元素,再对:之后的表达式进行匹配,在之前匹配的dom元素范围内查找,与Expr中的filters对象中的函数进行比较,如果匹配,则将匹配的dom元素放入jquery对象中,封装为一个jquery对象。其他的和这个很类似。
如果传过来的参数为属性选择器的表达式,在Expr这个JSON对象中,有个filter的object对象,有个ATTR的函数。首先正则表达式进行匹配,得到标签表达式和属性表达式。将标签表达式进行解析,得到所有对应的dom元素,再属性表达式进行解析,通过element.getAttribute函数在之前匹配的dom元素范围内查找,根据属性的符号,查找出相匹配的对象,将匹配的dom元素放入jquery对象中,封装为一个jquery对象。
如果传过来的参数为表单对象属性选择器的表达式,在Expr这个JSON对象中,有个filters的object对象,首先正则表达式进行匹配,将:之前的表达式进行解析,得到所有对应的dom元素,再对:之后的表达式进行匹配,在之前匹配的dom元素范围内查找,与Expr中的filters对象中的函数进行比较,如果匹配,则将匹配的dom元素放入jquery对象中,封装为一个jquery对象。
jquery选择器的查找方式,具体的细节我写得不是特别详细,如果太详细了,一篇博客是绝对写不完的。下期我为大家介绍jquery的筛选机制处理方式和插件机制。这两个是jquery当中最复杂的两个,其余都很简单了。
分享到:
相关推荐
EasyUI 是一个基于 jQuery 的轻量级前端框架,它的主要目标是帮助开发者快速构建用户界面。`jquery-easyui-1.2.2` 是 EasyUI ...对于希望优化EasyUI性能、定制主题或者开发新的组件的开发者来说,源代码分析尤其重要。
《jQuery各种实例--权威指南-源代码》是一个深入学习jQuery的资源集合,包含了丰富的实践案例和源代码。jQuery是一款广泛使用的JavaScript库,它简化了HTML文档遍历、事件处理、动画设计以及Ajax交互等任务。这个...
《jQuery 1.2.6 源代码分析》 jQuery 是一个广泛应用于网页开发的JavaScript库,以其简洁的API和强大的功能深受开发者喜爱。在深入理解jQuery的工作原理时,分析其源代码是极其有益的。本文将针对jQuery 1.2.6版本...
学习jQuery源代码,可以帮助我们更好地理解其内部工作原理,从而编写出更高效、更优化的代码。1.11.3版的源码有注释,是学习的好材料,可以深入研究每个函数和方法的具体实现,进一步提升JavaScript技能。
1. **选择器**: 学习如何使用jQuery选择器精准定位HTML元素,如ID选择器、类选择器、属性选择器等,以及如何组合使用它们。 2. **DOM操作**: 包括元素的添加、删除、复制、移动,以及属性和内容的修改。 3. **事件...
jQuery支持CSS选择器,包括ID选择器(#id)、类选择器(.class)、元素选择器(tag)、属性选择器([attr])等。更高级的选择器如后代选择器(`>`)、兄弟选择器(`+`和`~`)以及组合选择器(`,`)使定位元素更为...
jQuery选择器是其强大功能之一,它们基于CSS选择器,但扩展了更多功能,如`$(":input")`选取所有表单元素,`$(".class")`选取所有类名为"class"的元素,`$("#id")`选取ID为"id"的元素。通过这样的选择器,开发者可以...
这个压缩包文件"jquery源代码 包括示例 包括示例"显然包含了jQuery的核心源代码以及相关的示例,这对于学习和理解jQuery的工作原理及其用法是非常有价值的。 首先,jQuery的核心源代码是JavaScript的一个模块,它...
其次详细讲解了jQuery的各种选择器、jQuery操作DOM的方法、jQuery中的事件与应用、jQuery中的动画和特效、Ajax在jQuery中的应用,以及各种常用的jQuery插件的使用方法和技巧,所有这些知识点都配有完整的示例(包括...
2. **development-bundle** - 这个文件夹包含了开发版本的 jQuery UI,提供了未经压缩和未合并的源代码。这样有利于调试和学习,因为代码更易读,每个组件都是独立的文件。开发版还包括了文档和示例,帮助开发者了解...
这个文件包含了完整的jQuery API,包括选择器、DOM操作、事件处理、动画效果、Ajax请求等所有功能。开发者可以通过阅读源代码了解每个函数的工作原理,这对于学习和优化jQuery代码至关重要。 `jquery-1.9.1-vsdoc....
源代码方面,jQuery的核心在于选择器引擎Sizzle,它负责解析和执行CSS选择器。Sizzle的设计使其能够高效地找到匹配的DOM元素,极大地简化了DOM操作。在jQuery 1.11.3中,你可以看到$.fn.extend方法用于扩展jQuery...
2. **jQuery选择器**:学习如何使用jQuery的选择器选取DOM元素,例如`$("#id")`选取ID为特定值的元素,`$(".class")`选取具有特定类的所有元素,以及`$("tag")`选取所有特定类型的元素。 3. **jQuery事件处理**:...
对于进阶开发者,可以研究源代码,学习其组件的实现原理,甚至参与到开源项目的贡献中,提升自身技能。 总结,jQuery UI 1.10.4是一个强大而全面的前端UI框架,它提供的组件丰富多样,易用性强,能够帮助开发者快速...
《JQuery权威指南源代码》是一本深入解析jQuery库的参考书籍,其源代码提供了丰富的实例和示例,帮助读者更好地理解和应用jQuery。jQuery是一个高效、简洁的JavaScript库,它简化了HTML文档遍历、事件处理、动画以及...
这本书的配套源代码提供了丰富的示例和练习,涵盖了jQuery的各个方面,包括选择器、事件处理、DOM操作、动画效果以及AJAX交互等。 在提供的压缩包文件中,我们可以看到以下几个关键文件: 1. **web.config**:这是...
- **选择器**:jQuery提供了丰富的选择器,如ID选择器(`#id`)、类选择器(`.class`)、属性选择器(`[attribute]`)等,使得选取DOM元素变得简单。 - **DOM操作**:jQuery封装了DOM操作,如`$(selector).html()`, `$...
2. **选择器**:jQuery的选择器类似于CSS选择器,用于选取HTML元素。例如,`$("#id")`选择ID为"id"的元素,`$(".class")`选择所有类名为"class"的元素,`$("tag")`选择所有指定标签名的元素。 3. **DOM操作**:...
这个库可能包含了实现上述功能的源代码、示例、文档和其他资源。使用这个库,开发者可以快速集成到自己的H5项目中,提升移动应用的用户体验。 为了使用这个库,你需要首先将其解压,然后在项目中引入jQuery和lay-...
在阅读jQuery源代码时,我们需要关注其核心功能模块,如选择器(Selectors)、遍历(Traversing)、DOM操作(Manipulation)、事件处理(Events)和动画(Effects)。 1. **选择器(Selectors)**:jQuery的选择器...