jquery选择器的实现流程简析及提高性能建议!
当我们洋洋得意的使用jquery强大的选择器功能时有没有在意过jquery的选择性能问题呢,其实要想高效的使用jquery选择器,了解其实现流程是很有必要的,那么这篇文章我就简单的讲讲其实现流程,相信会为读者的jquery优化开发提供一些小的建议。
我们知道jquery的$()函数可以传很多种参数(document、string、fn、array、number),那么jquery的init方法就会根据你传参的类型的不同进入不同的流程。其他的我们今天就不多说了,我们重点讲一下对string类型的处理,因为只有它才会触发jquery的选择器功能。
1、首先是使用正则表达式检查是不是创建dom的操作,例如$(“<div></div>”),就是要创建div了;
2、否则就是选择操作,然后会判断是不是简单的id选择,当然这一步也是正则匹配,jquery在这里会毫不犹豫的调用document.getElementById,无疑,这是最快的选择了;
3、最后就是直接进入jQuery.fn.find()方法,这里就是jquery所引用的sizzle选择器放大光芒的地方了。
从上面我们可以看出来,jquery选择器只是对简单的id选择开了小灶,其他的css选择很大一部分需要借助于sizzle,所以说,这里总结一点,简单的id选择是jquery中最快的了。
有的人就说了,我不可能都用id选择器呀,别急,咱们再看看sizzle强大的选择功能吧。Sizzle是jquery从1.3版本开始引入的选择引擎。我们一般实现的选择的选择器模式(也包括jquery 1.2)都是Left To Right模式,而sizzle却别出新格,使用了Right To Left(以下我们简称RTL),说的是不是有点迷了,别急咱们结合例子给大家说明一下:
例 1:$(“div a”)
一般的选择流程(LTR):
1、选择页面中所有的div
2、选择div下的所有a标签
3、合并结果集,返回结果集
Sizzle的选择流程(RTL):
1、选择页面中所有的a标签
2、判断a标签的父节点是否为div标签,是则push,否则shift
3、返回结果集
有没有发现,RTL的选择模式其实是少了一个合并操作,不要小看这一步,其实节省了很多时间,这就是sizzle能够高效的选择结果集的诀窍之一,其实从sizzle的这一点就给了我们一个高效选择的建议,多使用Right To Left的选择模式。
下面咱们看一下这么一个选择:$('#test span'),相信很多人都是用过类似这种的选择模式,那么其实现流程呢?Jquery是通过$().find()方法启用sizzle的,上面写的这种模式会有一个函数判断启用find,然后才调用sizzle,那么咱们再看一看另外一种相同的选择:$(“#test”).find(“span”),这种方法则会跳过find函数判断,直接启用sizzle,这一点改变,执行效率能够提升8倍多,而且选择结果相同,大家可以使用firebug测试一下哟(使用console.profile("性能1")),这就给了我们另一个建议,多使用find方法代替css层级选择。
咱们再看一个选择方法:$('span:eq(0)'),通过firebug可以看到,这个选择方法调用了34次函数,而结果相同的 $('span').first()却只调用了14次,执行时间前者是后者的将近20倍,过滤函数的优化效应可见一斑呀。Sizzle在这里有一个判断,如果存在位置信息(例如 eq,first等)就会执行LTR选择模式,递归调用sizzle,大大降低执行效率,所以这里我建议,多使用过滤选择器,可以有效提高执行速度。
这里就简单的介绍到这里,其实我感觉只要能够做到上面的几点就能很好地提高jquery的选择速度了。
个人整理,欢迎评错。
jquery选择器的实现流程简析及提高性能建议!的更多相关文章
- zxing二维码扫描的流程简析(Android版)
目前市面上二维码的扫描似乎用开源google的zxing比较多,接下去以2.2版本做一个简析吧,勿喷... 下载下来后定位两个文件夹,core和android,core是一些核心的库,android是 ...
- jquery Ajax中的dataType简析
jquery中的ajax有好几种运用方式,但是基本上都是使用的$.ajax()方法,很多人经常会使用它来从后台获取json格式的数据,但是经常发现返回的json字符串并不能自动的转换成js里的json ...
- OpenStack Cinder源代码流程简析
版权声明:本博客欢迎转载,转载时请以超链接形式标明文章原始出处!谢谢! 博客地址:http://blog.csdn.net/i_chips 一.概况 OpenStack的各个模块都有对应的client ...
- LinkedHashMap结构get和put源码流程简析及LRU应用
原理这篇讲得比较透彻Java集合之LinkedHashMap. 本文属于源码阅读笔记,因put,get调用逻辑及链表维护逻辑复杂(至少网上其它文章的逻辑描述及配图,我都没看明白LinkedHashMa ...
- Tomcat启动流程简析
Tomcat是一款我们平时开发过程中最常用到的Servlet容器.本系列博客会记录Tomcat的整体架构.主要组件.IO线程模型.请求在Tomcat内部的流转过程以及一些Tomcat调优的相关知识. ...
- React Native 启动流程简析
导读:本文以 react-native-cli 创建的示例工程(安卓部分)为例,分析 React Native 的启动流程. 工程创建步骤可以参考官网.本文所分析 React Native 版本为 v ...
- 【Java虚拟机10】ClassLoader.getSystemClassLoader()流程简析
前言 学习类加载必然离开不了sun.misc.Launcher这个类和Class.forName()这个方法. 分析ClassLoader.getSystemClassLoader()这个流程可以明白 ...
- HTTPS及流程简析
[序] 在我们在浏览某些网站的时候,有时候浏览器提示需要安装根证书,可是为什么浏览器会提示呢?估计一部分人想也没想就直接安装了,不求甚解不好吗? 那么什么是根证书呢?在大概的囫囵吞枣式的百度之后知道了 ...
- Postfix 发送邮件流程简析
PostFix接受和转发邮件的说明 来源ip符合inet_interfaces,收件人域符合mydestination, Postfix将接收到本地. 来源ip符合inet_interfaces, ...
随机推荐
- Keras/tensorflow出现‘Loaded runtime CuDNN library: 7.0.5 but source was compiled with: 7.1.14’错误的解决办法
从tensorflow1.10 升级到1.12版本后,对依赖的CuDNN不兼容产生的问题.鉴于一直使用的是Keras,未使用新版本tensorflow的功能,故果断回退到旧版本. 方法为:pip3 i ...
- MySql 模糊查询、范围查询
实例: SQL模糊查询,使用like比较关键字,加上SQL里的通配符,请参考以下: 1.LIKE'Mc%' 将搜索以字母 Mc 开头的所有字符串(如 McBadden). 2.LIKE'%inger' ...
- 什么是DHTML?
DHTML是近年来网络发展进程中最振奋人心也最具实用性的创新之一.它是一种通过各种技术的综合发展而得以实现的概念(当然,不同的浏览器,实现的程度也不同),这些技术包括Javascript, VBScr ...
- luoguP2231 [HNOI2002]跳蚤
题目链接 bzoj1220: [HNOI2002]跳蚤 题解 根据裴蜀定理,不定方程的解为未知数的gcd,所以选取的n个数的gcd为1 那么n - 1个数保证没有公约数为m的约数,枚举质因数容斥 质因 ...
- SPOJ QTREE
QTREE /* 题目大意:维护一棵树,允许修改边权以及查询链上最大值 题解:我们将边权转为点权,标记在深度较深的点上,树链剖分后用线段树处理即可 */ #include <cstdio> ...
- bzoj 1563
对于很多决策单调性DP问题,我们很难(但不是不可以)证明其决策满足单调性,所以感觉很像时,可以打表看是否满足. 这道题的精度(?范围)很难搞,开始生怕溢出,看了hzwer的代码,才发现用long do ...
- CF 277.5 B.BerSU Ball 二分图的最大匹配 模版题
题意:求二分图的最大匹配数量 模版如下: //二分图匹配(匈牙利算法的DFS实现) //初始化:g[][]两边顶点的划分情况 //建立g[i][j]表示i->j的有向边就可以了,是左边向右边的匹 ...
- 在gdb将所有线程的堆栈输出到文件中去
http://m.blog.csdn.net/blog/lantianjialiang/40111253
- LINUX 性能工具使用
http://xuclv.blog.51cto.com/5503169/1184517
- 关于OPC Client 编写2
最近在搞到一个OPC动态库OPCAutomation.dll,该动态库在http://www.kepware.com/可下载,下面介绍如何用C#进行OPC Client开发. 1.新建C#应用程序,命 ...