至于有那些选择器,在帮助手册中都有,自己去看,这篇主要是分析他的工作原理,而优化我们写 的选择器,尤其在页面内容很多的情况下,更应该需要优化。下边就言归正传。

每次申明一个jQuery对象的时候,返回的是jQuery.prototype.init 对象,很多人就会不明白,init明明是jQuery.fn的方法啊,实际上这里不是方法,而是init的构造函数,因为js的prototype对象可 以实现继承,加上js的对象只是引用不会是拷贝,new jQuery,new jQuery.fn和new jQuery.fn.init的子对象是一样的,只是有没有执行到init的不同,这里就不讲原因了,等下一篇再讲为什么会是这样。

当我们使用选择器的时候$(selector,content),就会执行 init(selectot,content),我们看看inti中是怎样执行的:

if ( typeof selector == "string" ) {

//正则匹配,看是不是HTML代码或者是#id

var match = quickExpr.exec( selector );

//没有作为待查找的 DOM 元素集、文档或 jQuery 对象。

//selector是#id的形式

if ( match && (match[1] || !context) ) {

// HANDLE: $(html) -> $(array)

//HTML代码,调用clean补全HTML代码

if ( match[1] ){

                                   selector = jQuery.clean( [ match[1] ], context );

                            }

// 是: $("#id")

else {

//判断id的Dom是不是加载完成

var elem = document.getElementById( match[3] );

if ( elem ){

if ( elem.id != match[3] )

return jQuery().find( selector );

return jQuery( elem );//执行完毕return

                                   }

                                   selector = [];

                            }

//非id的形式.在context中或者是全文查找

                     } else{

return jQuery( context ).find( selector );

                     }

}

  

这里就说明只有选择器写成$(‘#id’)的时候最快,相当于执行了一次 getElementById,后边的程序就不用再执行了。当然往往我们需要的选择器并不是这么简单,比如我们需要id下的CSS为className, 有这样的写法$(‘#id.className’)和$(‘#id’).find(‘.className’);这两种写法的执行结果都是一样的,比 如<div id=”id”><span class=”className”></span></div>,返回的肯定都是<span class=”className”></span>,但是执行的效率是完全不一样的。

在分析一下上边的代码,如果不是$(‘#id’)这样的简单选择器的话,都会执行find函 数,那我们再看看find到底是做用的:

find: function( selector ) {

//在当前的对象中查找

var elems = jQuery.map(this, function(elem){

return jQuery.find( selector, elem );

              });

//下边的代码可以忽略,只是做一些处理

//这里应用了js的正则对象的静态方法test

//indexOf("..")需要了解一下xpath的语法,就是判断selector中包含父节点的写法

//本意就是过滤数组的重复元素

return this.pushStack( /[^+>] [^+>]/.test( selector ) || selector.indexOf("..") > -1 ?

                     jQuery.unique( elems ) :

                     elems );

       }

  

如果这样写$(‘#id .className’),就会执行到扩展的find(‘#id .className’,document),因为当前的this是document的jQuery数组,那我们在看看扩展的find他的实现,代码比较 多,就不列出来,总之就是从第二个参数传递进行的dom第一个子节点开始找,遇见#比对id,遇见.比对ClassName,还有:<+-等处理。 那我们要优化,是不是就要想办法让第二个参数context的范围最小,那样遍历是不是就很少了?

如果我们这样写$(‘#id’).find(‘.className’),那程序只这样执行 的,第一次init的时候执行一步getElementById,就return了,接着执行 find(‘.className’,divDocument),divDocument就是我们第一次选择的是div标签,如果document下有很 多dom对象的时候,这次只遍历divDocument是不是少了很多次,而且在第一次选择id的速度也要比遍历快的多。

现在大家应该是明白了吧。就是说第一层选择最好是ID,而是简单选择器,目的就是定义范围, 提高速度,这次就说这些,选择写法的优化,其他的优化,下次再说。

转载于:https://www.cnblogs.com/liangle/archive/2011/07/23/2512661.html

jQuery选择器的工作原理和优化相关推荐

  1. 你知道group by的工作原理和优化思路吗?

    前言 日常开发中,我们经常会使用到group by.亲爱的小伙伴,你是否知道group by的工作原理呢?group by和having有什么区别呢?group by的优化思路是怎样的呢?使用grou ...

  2. Nginx工作原理和优化、漏洞。

    http://blog.csdn.net/hguisu/article/details/8930668 (排名100多bolg写的很好) 1.  Nginx的模块与工作原理 Nginx由内核和模块组成 ...

  3. Nginx工作原理和优化、漏洞(转)

    查看安装了哪些模块命令: [root@RG-PowerCache-X xcache]# nginx/sbin/nginx -V nginx version: nginx/1.2.3 built by  ...

  4. Nginx工作原理和优化总结。

    NGINX以高性能的负载均衡器,缓存,和web服务器闻名,驱动了全球超过 40% 最繁忙的网站.在大多数场景下,默认的 NGINX 和 Linux 设置可以很好的工作,但要达到最佳性能,有些时候必须做 ...

  5. Nginx工作原理及优化参数配置

    1.master和worker Nginx启动后,是由两个进程组成的.master(管理者)和worker(工作者). 一个Nginx只有一个master,但可以有多个worker. Nginx接收到 ...

  6. JavaScript 工作原理之十一-渲染引擎及性能优化小技巧

    原文请查阅这里,略有删减,本文采用知识共享署名 4.0 国际许可协议共享,BY Troland. 本系列持续更新中,Github 地址请查阅这里. 这是 JavaScript 工作原理的第十一章. 迄 ...

  7. JavaScript 工作原理之十一-渲染引擎及性能优化小技巧 1

    原文请查阅这里,略有删减,本文采用知识共享署名 4.0 国际许可协议共享,BY Troland. 本系列持续更新中,Github 地址请查阅这里. 这是 JavaScript 工作原理的第十一章. 迄 ...

  8. IT:前端进阶技术路线图(初级→中级→高级)之初级(研发工具/HTML/CSS/JS/浏览器)/中级(研发链路/工程化/库/框架/性能优化/工作原理)/高级(搭建/中后台/体验管理等)之详细攻略

    IT:前端进阶技术路线图(初级→中级→高级)之初级(研发工具/HTML/CSS/JS/浏览器)/中级(研发链路/工程化/库/框架/性能优化/工作原理)/高级(搭建/Node/IDE/中后台/体验管理/ ...

  9. java gc的工作原理、如何优化GC的性能、如何和GC进行有效的交互

    java gc的工作原理.如何优化GC的性能.如何和GC进行有效的交互 一个优秀的Java 程序员必须了解GC 的工作原理.如何优化GC的性能.如何和GC进行有效的交互,因为有一些应用程序对性能要求较 ...

最新文章

  1. php forms 上传更新json_通达OA任意文件上传漏洞详细分析
  2. 查看某个方法在哪里被调用_MATLAB局部函数公有化的方法: localfunctions
  3. 微型计算机控制技术黄勤期末,微型计算机控制技术作者黄勤第4章__工控机的抗干扰课案.ppt...
  4. 2020.11.me
  5. 自定义PocketMod的农历页面
  6. node获取图片路径_使用软连接来解决 Drupal jsonapi 中 Node 节点图片相对路径的问题...
  7. leetcode844. 比较含退格的字符串
  8. The Apache Tomcat installation at this directory is version,tomcat
  9. 【算法系列之七】合并两个有序链表
  10. matlab如何导入多文本数据,将文本文件中的混合数据导入表
  11. 屏蔽关闭百度搜索风云热点的方法
  12. .net mvc ajax重定向,如何在MVC3 JQuery的Ajax调用重定向到新的页面(连同模型)(How to redirec...
  13. 直方图匹配法(规则化)
  14. eclipse中导入jar包源文件
  15. 什么是 GPL GNU,自由软件
  16. ssl免费证书获取,并在nginx服务器上安装ssl证书,以及docker安装nginx需注意的细节。
  17. 解决IE浏览器jQuery执行ajax不响应问题
  18. HDU 3221 Brute-force Algorithm(指数降幂公式)
  19. 算法学习笔记【1】——二分查找
  20. 精准鉴别初级、中级、高级程序员,你是哪一种?

热门文章

  1. Fiddler使用技巧:强大的数据文本编解码功能
  2. Wireshark使用技巧:提取VOIP通话中的音频流
  3. eclipse c语言_如果你的电脑是windows7/10的环境,用什么编译器学习C语言好?
  4. python函数图像绘制、函数不固定_无法在函数中绘制tkinter图像
  5. vue router 入门笔记
  6. CSS盒模型及边距问题
  7. Android获取内部和SDCard的存储空间
  8. 【基础篇】DatePickerDialog日期控件的基本使用(一)
  9. myeclipse快捷键大全
  10. 个人随笔——衰人自叙卷壹