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 相关文章推荐
input输入框的自动匹配(原生代码)
Mar 19 Javascript
JS获取并操作iframe中元素的方法
Mar 21 Javascript
document.addEventListener使用介绍
Mar 07 Javascript
基于jQuery实现的图片切换焦点图整理
Dec 07 Javascript
原生javascript实现解析XML文档与字符串
Mar 01 Javascript
jQuery通过写入cookie实现更换网页背景的方法
Apr 15 Javascript
解决jquery无法找到其他父级子集问题的方法
May 10 Javascript
vue2.0构建单页应用最佳实战
Apr 01 Javascript
原生JS+Canvas实现五子棋游戏
May 28 Javascript
JavaScript函数IIFE使用详解
Oct 21 Javascript
JS实现点餐自动选择框(案例分析)
Dec 10 Javascript
JavaScript ECMA-262-3 深入解析(一):执行上下文实例分析
Apr 25 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分页函数
2006/10/09 PHP
用php来检测proxy
2006/10/09 PHP
PHP4在Windows2000下的安装
2006/10/09 PHP
php checkbox复选框值的获取与checkbox默认值输出方法
2010/05/15 PHP
PHP使用flock实现文件加锁的方法
2015/07/01 PHP
浅谈PHP中如何实现Hook机制
2017/11/14 PHP
JS去除字符串的空格增强版(可以去除中间的空格)
2009/08/26 Javascript
jquery插件 autoComboBox 下拉框
2010/12/22 Javascript
JavaScript通过元素索引号删除数组中对应元素的方法
2015/03/18 Javascript
简述JavaScript提交表单的方式 (Using JavaScript Submit Form)
2016/03/18 Javascript
JS实现重新加载当前页面或者父页面的几种方法
2016/11/30 Javascript
js canvas实现放大镜查看图片功能
2017/06/08 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【凹多边形的分离轴检测算法】
2018/12/13 Javascript
vue父子组件通信的高级用法示例
2019/08/29 Javascript
Angular 多级路由实现登录页面跳转(小白教程)
2019/11/19 Javascript
vue中实现回车键登录功能
2020/02/19 Javascript
JS实现多功能计算器
2020/10/28 Javascript
[03:26]《DAC最前线》之EG经理自述DOTA2经历
2015/02/02 DOTA
Python实现发送与接收邮件的方法详解
2018/03/28 Python
对python中UDP,socket的使用详解
2019/08/22 Python
Python面向对象之Web静态服务器
2019/09/03 Python
Python 实现一个手机号码获取妹子名字的功能
2019/09/25 Python
Tensorflow分批量读取数据教程
2020/02/07 Python
美国设计师精美珠宝购物网:Netaya
2016/08/28 全球购物
中国领先的专业家电网购平台:国美在线
2016/12/25 全球购物
Luxplus荷兰:以会员价购买美容产品等,独家优惠
2019/08/30 全球购物
白俄罗斯女装和针织品网上商店:Presli.by
2019/10/13 全球购物
党员思想汇报范文
2013/12/30 职场文书
幼儿园元旦活动感言
2014/03/02 职场文书
大型营销活动计划书
2014/04/28 职场文书
秋季校运会广播稿100字
2014/09/18 职场文书
我们的节日端午节活动总结
2015/02/11 职场文书
毕业纪念册寄语大全
2015/02/26 职场文书
2015年入党积极分子评语
2015/03/26 职场文书
学校中层领导培训心得体会
2016/01/11 职场文书
2016最新离婚协议书范本及程序
2016/03/18 职场文书