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 相关文章推荐
前淘宝前端开发工程师阿当的PPT中有JS技术理念问题
Jan 15 Javascript
使用JQuery和CSS模拟超链接的用户单击事件的实现代码
May 23 Javascript
jQuery遍历Form示例代码
Sep 03 Javascript
借助JavaScript脚本判断浏览器Flash Player信息的方法
Jul 09 Javascript
在JavaScript中处理时间之getHours()方法的使用
Jun 10 Javascript
基于jquery实现ajax无刷新评论
Aug 19 Javascript
javascript实现获取图片大小及图片等比缩放的方法
Nov 24 Javascript
jquery 校验中国身份证号码实例详解
Apr 11 jQuery
JS实现元素上下左右移动效果
Oct 18 Javascript
Vue列表如何实现滚动到指定位置样式改变效果
May 09 Javascript
基于JavaScript或jQuery实现网站夜间/高亮模式
May 30 jQuery
基于vue 动态菜单 刷新空白问题的解决
Aug 06 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
Blitz templates 最快的PHP模板引擎
2010/04/06 PHP
PHP两种去掉数组重复值的方法比较
2014/06/19 PHP
PHP开发之归档格式phar文件概念与用法详解【创建,使用,解包还原提取】
2017/11/17 PHP
Windows上php5.6操作mongodb数据库示例【配置、连接、获取实例】
2019/02/13 PHP
JavaScript Ajax Json实现上下级下拉框联动效果实例代码
2013/11/23 Javascript
在JS中解析HTML字符串示例代码
2014/04/16 Javascript
javascript 获取元素样式必杀技
2014/05/04 Javascript
jQuery实现单击和鼠标感应事件
2015/02/01 Javascript
jQuery多个版本和其他js库冲突的解决方法
2016/08/11 Javascript
DOM操作原生js 的bug,使用jQuery 可以消除的解决方法
2016/09/04 Javascript
AngularJS操作键值对象类似java的hashmap(填坑小结)
2016/11/12 Javascript
JavaScript使用delete删除数组元素用法示例【数组长度不变】
2017/01/17 Javascript
vue.js实现刷新当前页面的方法教程
2017/07/05 Javascript
微信小程序实现保存图片到相册功能
2018/11/30 Javascript
js中实例与对象的区别讲解
2019/01/21 Javascript
关于JSON解析的实现过程解析
2019/10/08 Javascript
使用vue3重构拼图游戏的实现示例
2021/01/25 Vue.js
python 根据正则表达式提取指定的内容实例详解
2016/12/04 Python
名片管理系统python版
2018/01/11 Python
Python使用字典实现的简单记事本功能示例
2019/08/15 Python
Python简单实现区域生长方式
2020/01/16 Python
python+appium+yaml移动端自动化测试框架实现详解
2020/11/24 Python
Pycharm创建python文件自动添加日期作者等信息(步骤详解)
2021/02/03 Python
台湾乐天市场:日本No.1的网路购物网站
2017/03/22 全球购物
Kidsroom台湾:来自德国的婴儿用品
2017/12/11 全球购物
TripAdvisor印尼站:全球领先的旅游网站
2018/03/15 全球购物
NYX Professional Makeup英国官网:美国平价专业彩妆品牌
2019/11/13 全球购物
JBL加拿大官方商店:扬声器、耳机等
2020/10/23 全球购物
《小草和大树》教学反思
2014/02/16 职场文书
公司业务员岗位职责
2014/03/18 职场文书
2015年元旦文艺汇演主持词
2014/03/26 职场文书
暑期社会实践先进个人主要事迹
2014/05/22 职场文书
2014入党积极分子批评与自我批评思想汇报
2014/09/20 职场文书
2014年护士长工作总结
2014/11/11 职场文书
2014司机年终工作总结
2014/12/05 职场文书