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 相关文章推荐
jquery select选中的一个小问题
Oct 11 Javascript
Jquery iframe内部出滚动条
Feb 11 Javascript
javascript+iframe 实现无刷新载入整页的代码
Mar 17 Javascript
sencha touch 模仿tabpanel导航栏TabBar的实例代码
Oct 24 Javascript
实用框架(iframe)操作代码
Oct 23 Javascript
jQuery学习笔记之Ajax用法实例详解
Dec 01 Javascript
原生js实现查询天气小应用
Dec 09 Javascript
Vue的Class与Style绑定的方法
Sep 01 Javascript
vue 注册组件的使用详解
May 05 Javascript
vue-router 手势滑动触发返回功能
Sep 30 Javascript
layui自定义验证,用ajax查询后台是否有重复数据,form.verify的例子
Sep 06 Javascript
在VUE中使用lodash的debounce和throttle操作
Nov 09 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-accelerator网站加速PHP缓冲的方法
2008/07/30 PHP
php URL编码解码函数代码
2009/03/10 PHP
JS中encodeURIComponent函数用php解码的代码
2012/03/01 PHP
PHP多进程编程实例
2014/10/15 PHP
Thinkphp5结合layer弹窗定制操作结果页面
2017/07/07 PHP
dojo 之基础篇(三)之向服务器发送数据
2007/03/24 Javascript
把JS与CSS写在同一个文件里的书写方法
2007/06/02 Javascript
JavaScript生成随机数的4种自定义函数分享
2015/02/28 Javascript
JS日期加减,日期运算代码
2015/11/05 Javascript
使用伪命名空间封装保护独自创建的对象方法
2016/08/04 Javascript
js前端实现图片懒加载(lazyload)的两种方式
2017/04/24 Javascript
详解node+express+ejs+bootstrap构建项目
2017/09/27 Javascript
使用nodejs+express实现简单的文件上传功能
2017/12/27 NodeJs
使用vue-router为每个路由配置各自的title
2018/07/30 Javascript
uni-app 支持多端第三方地图定位的方法
2020/01/03 Javascript
Angular单元测试之事件触发的实现
2020/01/20 Javascript
vue路由权限校验功能的实现代码
2020/06/07 Javascript
VUE动态生成word的实现
2020/07/26 Javascript
vue 实现锚点功能操作
2020/08/10 Javascript
浏览器JavaScript调试功能无法使用解决方案
2020/09/18 Javascript
vue render函数动态加载img的src路径操作
2020/10/26 Javascript
js实现菜单跳转效果
2020/12/11 Javascript
python+splinter自动刷新抢票功能
2018/09/25 Python
python3 unicode列表转换为中文的实例
2018/10/26 Python
pyside+pyqt实现鼠标右键菜单功能
2020/12/08 Python
Selenium+Python 自动化操控登录界面实例(有简单验证码图片校验)
2019/06/28 Python
Python实现基于SVM的分类器的方法
2019/07/19 Python
Python编写打字训练小程序
2019/09/26 Python
关于numpy数组轴的使用详解
2019/12/05 Python
python读取raw binary图片并提取统计信息的实例
2020/01/09 Python
Python pip配置国内源的方法
2020/02/14 Python
提供世界各地便宜的机票:Sky-tours
2016/07/21 全球购物
大学四年个人的自我评价
2014/02/26 职场文书
企业务虚会发言材料
2014/10/20 职场文书
田径运动会通讯稿
2015/07/18 职场文书
小学运动会报道稿
2015/07/22 职场文书