jquery选择器原理介绍($()使用方法)


Posted in Javascript onMarch 25, 2014

每次申明一个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,而是简单选择器,目的就是定义范围,提高速度。

Javascript 相关文章推荐
Javascript中valueOf与toString区别浅析
Mar 19 Javascript
JavaScript SetInterval与setTimeout使用方法详解
Nov 15 Javascript
JavaScript中toString()方法的使用详解
Jun 05 Javascript
纯jquery实现模仿淘宝购物车结算
Aug 20 Javascript
理解js回收机制通俗易懂版
Feb 29 Javascript
JavaScript中文件上传API详解
Apr 01 Javascript
在IE8上JS实现combobox支持拼音检索功能
May 23 Javascript
JS封装的选项卡TAB切换效果示例
Sep 20 Javascript
详解Puppeteer前端自动化测试实践
Feb 21 Javascript
javascript数组常见操作方法实例总结【连接、添加、删除、去重、排序等】
Jun 13 Javascript
在Vue中使用antv的示例代码
Jun 29 Javascript
vue-cli —— 如何局部修改Element样式
Oct 22 Javascript
Jquery插件编写简明教程
Mar 25 #Javascript
jquery自动填充勾选框即把勾选框打上true
Mar 24 #Javascript
jquery默认校验规则整理
Mar 24 #Javascript
Javascript连接多个数组不用concat来解决
Mar 24 #Javascript
jqeury-easyui-layout问题解决方法
Mar 24 #Javascript
让table变成exls的示例代码
Mar 24 #Javascript
JQuery 图片滚动轮播示例代码
Mar 24 #Javascript
You might like
通过具体程序来理解PHP里面的抽象类
2010/01/28 PHP
PHP中使用hidef扩展代替define提高性能
2015/04/09 PHP
php 利用array_slice函数获取随机数组或前几条数据
2015/09/30 PHP
学习php设计模式 php实现建造者模式
2015/12/07 PHP
Windows2003下php5.4安装配置教程(Apache2.4)
2016/06/30 PHP
javascript之dhDataGrid Ver2.0.0代码
2007/07/01 Javascript
JavaScript对象模型-执行模型
2008/04/28 Javascript
jquery实现对联广告的方法
2015/02/05 Javascript
学习JavaScript设计模式(多态)
2015/11/25 Javascript
谈谈我对JavaScript中typeof和instanceof的深入理解
2015/12/25 Javascript
javascript的BOM
2016/05/03 Javascript
Bootstrap CSS组件之输入框组
2016/12/17 Javascript
浅谈Vue数据绑定的原理
2018/01/08 Javascript
安装Node.js并启动本地服务的操作教程
2018/05/12 Javascript
vue移动端轻量级的轮播组件实现代码
2018/07/12 Javascript
JS中使用cavas截图网页并解决跨域及模糊问题
2018/11/13 Javascript
JS实现移动端点击按钮复制文本内容
2019/07/28 Javascript
小程序采集录音并上传到后台
2019/11/22 Javascript
Bottle框架中的装饰器类和描述符应用详解
2017/10/28 Python
Python使用matplotlib实现基础绘图功能示例
2018/07/03 Python
用Python实现读写锁的示例代码
2018/11/05 Python
Python中shapefile转换geojson的示例
2019/01/03 Python
详解Python的三种可变参数
2019/05/08 Python
python调用有道智云API实现文件批量翻译
2020/10/10 Python
pytorch学习教程之自定义数据集
2020/11/10 Python
全球性的在线时尚男装零售商:boohooMAN
2016/12/17 全球购物
Kathmandu英国网站:新西兰户外运动品牌
2017/03/27 全球购物
联想韩国官网:Lenovo Korea
2018/05/10 全球购物
香港中原电器网上商店:Chung Yuen
2019/06/26 全球购物
幼教个人求职信范文
2013/12/02 职场文书
职业生涯规划书怎么写?
2014/09/14 职场文书
写给女朋友的保证书
2015/05/09 职场文书
《假如》教学反思
2016/02/17 职场文书
合同范本之电脑出租
2019/08/13 职场文书
Python Matplotlib库实现画局部图
2021/11/17 Python
vue项目配置sass及引入外部scss文件
2022/04/14 Vue.js