`
asiaafrica120
  • 浏览: 5374 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

jQuery源代码分析------选择器

阅读更多

   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当中最复杂的两个,其余都很简单了。

分享到:
评论

相关推荐

    jQuery权威指南-源代码

    其次详细讲解了jQuery的各种选择器、jQuery操作DOM的方法、jQuery中的事件与应用、jQuery中的动画和特效、Ajax在jQuery中的应用,以及各种常用的jQuery插件的使用方法和技巧,所有这些知识点都配有完整的示例(包括...

    jquery日期选择器

    轻便好用的JQuery日期控件-Date Input

    jQuery权威指南-配套源代码

    jQuery的各种选择器、jQuery操作DOM的方法、jQuery中的事件与应用、jQuery中的动画和特效、Ajax在 jQuery中的应用,以及各种常用的jQuery插件的使用方法和技巧,所有这些知识点都配有完整的示例(包括需求分析、代码...

    锋利的jQuery书中源代码

    jQuery介绍-->选择器-->DOM操作-->事件和动画-->Ajax应用-->插件-->完整DEMO 本书循序渐进的对jQuery的各种方法和使用进行介绍,读者可以系统的掌握jQuery关于DOM操作、事件监听和动画、表单操作、AJAX以及插件方面...

    JQuery权威指南源代码

    使用jQuery选择器实现隔行变色 JavaScript代码检测页面元素 jQuery代码检测页面元素 使用jQuery基本选择器 使用jQuery层次选择器 使用jQuery基本过滤选择器 使用jQuery内容过滤选择器 使用jQuery可见性过滤...

    WEB05-jQuery-源代码.rar

    使用JQuery完成页面定时弹出广告(DOM转换和选择器) 使用JQuery完成表格的隔行换色 使用JQuery完成复选框的全选效果(jQuery的属性操作) 使用JQuery完成省市联动效果(jQuery的遍历和DOM操作) 使用JQuery完成下列列表...

    jquery颜色选择器源码

    jquery颜色选择器源码,只提供学习和使用

    JQuery权威指南 源代码

    前 言 第1章 jquery开发入门/1 1.1 jquery概述/2 1.1.1 认识jquery /2 1.1.2 jquery基本功能/2 1.1.3 搭建jquery开发环境/3 1.1.4 编写第一个简单的jquery应用/3 ...jquery 选择器/12 2.1 jquery选择器概述/13

    jQuery选择器基础知识

    这是一份比较全面的jQuery选择器基础知识,包括源代码和相应的ppt,供大家分享

    jQuery:jQuery学习路径源代码-jquery source code

    jQuery学习路径源代码 jQuery是用于dom操纵的客户端库javascript。 该存储库包含文章的源代码,这些文章是Dot Net Tricks jQuery学习路径的一部分。 初学者 中间的 先进的 jQuery Ajax方法 在本文中,我们将了解...

    【JavaScript源代码】JavaScript与JQuery框架基础入门教程.docx

     目录 一,JS对象二,DOM–1,作用–2,测试三,Jquery–1,概述–2,使用步骤–3,入门案例–4,jQuery的文档就绪四,JQuery的语法–1,选择器–2,常用函数–3,常用事件–4,练习总结 一,JS对象 二,DOM –1,...

    jquery语法与选择器介绍 带有案例

    jquery语法,与jquery选择器介绍 带有真实的源代码与案例

    jquery-source-code-1:jquery源码-jquery source code

    jquery-源代码-1 jquery源码分析(2.0.3版本) 大概内容大纲 (功能(){ (21,94)定义了一些变量和函数jQuery = function(){} (96,284)给JQ对象添加一些方法和属性 (285,347)扩展名:JQ的继承方法 (349,...

    jQuerySourceCode:阅读和分析jQuery源代码,以巩固JS知识并学习一些奇妙的技术-jquery source code

    阅读并分析jQuery源代码,以巩固JS知识并学习一些奇妙的技术。 2017.7.5 jQuery源代码(一) 顺一遍jQuery源码的大体逻辑: 一些变量和函数jQuery继承即扩展方法jQuery.extend方法,即jQuery的静态方法,也可以...

    《锋利的jquery》实例源码

    选择器-->DOM操作-->事件和动画-->Ajax应用-->插件-->完整DEMO 本书循序渐进的对jQuery的各种方法和使用进行介绍,读者可以系统的掌握jQuery关于DOM操作、事件监听和动画、表单操作、AJAX以及插件...

    超实用的jQuery代码段

    超实用的jQuery代码段精选近350个jQuery代码段,涵盖页面开发中绝大多数要点、技巧与方法,堪称史上最实用的jQuery代码参考书,可以视为网页设计与网站建设人员的好帮手。《超实用的jQuery代码段》的代码跨平台、跨...

    【JavaScript源代码】js实现类选择器和name属性选择器的示例步骤.docx

     jQuery的出现,大大的提升了我们操作dom的效率,使得我们的开发更上一层楼,如jQuery的选择器就是一个很强大的功能,它包含了类选择器、id选择器、属性选择器、元素选择器、层级选择器、内容筛选选择器等等,很是...

    JavaScript 中使用 jQuery 的货币到 Word 转换器和源代码

    在带有源代码的 JavaScript 中使用 jQuery 的货币到 Word 转换器特征 基本 GUI 该项目包含图形和按钮元素。 基本控制 此项目使用基本控件与应用程序进行交互。 用户友好的界面 这个项目是在一个简单的用户友好的界面...

    jquery制作的日期选择器

    超漂亮的一个用jquery制作的日期选择器,里面有源代码。

    jquery-table-lottery:九宫格抽奖插件源代码

    自己造的轮子,贴出源代码跟大家交流一下。配置参数: self . def = { html : '' , // 抽奖效果,添加HTML标签 hoverClass : '' , // 抽奖效果,在TD添加样式 startTime : 50 , //起始延迟时间 onlyTime : 2 , ...

Global site tag (gtag.js) - Google Analytics