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 confirm选择判断
Oct 18 Javascript
JQuery中$之选择器用法介绍
Apr 05 Javascript
jQuery实现Div拖动+键盘控制综合效果的方法
Mar 10 Javascript
AngularJS的内置过滤器详解
May 14 Javascript
JavaScript中字面量与函数的基本使用知识
Oct 20 Javascript
基于AngularJS+HTML+Groovy实现登录功能
Feb 17 Javascript
jQuery简单设置文本框回车事件的方法
Aug 01 Javascript
JS设计模式之惰性模式(二)
Sep 29 Javascript
如何让node运行es6模块文件及其原理详解
Dec 11 Javascript
Web安全之XSS攻击与防御小结
Dec 13 Javascript
小程序实现抽奖动画
Apr 16 Javascript
jquery实现穿梭框功能
Jan 19 jQuery
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之curl实现http与https请求的方法
2014/10/21 PHP
php实现将字符串按照指定距离进行分割的方法
2015/03/14 PHP
laravel 之 Eloquent 模型修改器和序列化示例
2019/10/17 PHP
Javascript isArray 数组类型检测函数
2009/10/08 Javascript
javascript控制frame,iframe的src属性代码
2009/12/31 Javascript
IE下使用cloneNode注意事项分享
2012/11/22 Javascript
jquery统计复选框选中示例
2013/11/05 Javascript
showModalDialog在谷歌浏览器下会返回Null的解决方法
2013/11/27 Javascript
Firefox中使用outerHTML的2种解决方法
2014/06/07 Javascript
解决js下referer兼容各大浏览器的方法
2014/11/03 Javascript
很全面的JavaScript常用功能汇总集合
2016/01/22 Javascript
jQuery+CSS3实现仿花瓣网固定顶部位置带悬浮效果的导航菜单
2016/09/21 Javascript
jQuery的 $.ajax防止重复提交的两种方法(推荐)
2016/10/14 Javascript
ES6中Math对象新增的方法实例详解
2017/04/25 Javascript
基于JS代码实现简单易用的倒计时 x 天 x 时 x 分 x 秒效果
2017/07/13 Javascript
jQuery实现动画、消失、显现、渐出、渐入效果示例
2018/09/06 jQuery
Vue常用的几个指令附完整案例
2018/11/06 Javascript
巧妙运用v-model实现父子组件传值的方法示例
2019/04/07 Javascript
layui 数据表格 根据值(1=业务,2=机构)显示中文名称示例
2019/10/26 Javascript
[03:53]2016国际邀请赛中国区预选赛第三日TOP10精彩集锦
2016/06/29 DOTA
Python ORM框架SQLAlchemy学习笔记之关系映射实例
2014/06/10 Python
简单解析Django框架中的表单验证
2015/07/17 Python
Flask的图形化管理界面搭建框架Flask-Admin的使用教程
2016/06/13 Python
python中的set实现不重复的排序原理
2018/01/24 Python
wx.CheckBox创建复选框控件并响应鼠标点击事件
2018/04/25 Python
Tornado Web Server框架编写简易Python服务器
2018/07/28 Python
python实现决策树分类(2)
2018/08/30 Python
python实现最速下降法
2020/03/24 Python
日语专业毕业生自荐信
2013/11/11 职场文书
大学应届生的自我评价
2014/03/06 职场文书
党员创先争优心得体会
2014/09/11 职场文书
学校运动会报道稿
2014/09/23 职场文书
代收款委托书范本
2014/10/01 职场文书
2016五一手机促销广告语
2016/01/28 职场文书
MySQL中CURRENT_TIMESTAMP的使用方式
2021/11/27 MySQL
「月刊Action」2022年5月号封面公开
2022/03/21 日漫