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编程起步(第六课)
Feb 27 Javascript
jQuery事件用法实例汇总
Aug 29 Javascript
js控制文本框输入的字符类型方法汇总
Jun 19 Javascript
CSS或者JS实现鼠标悬停显示另一元素
Jan 22 Javascript
canvas实现动态小球重叠效果
Feb 06 Javascript
微信小程序ajax实现请求服务器数据及模版遍历数据功能示例
Dec 15 Javascript
Angular 容器部署的方法
Apr 17 Javascript
AngularJs分页插件使用详解
Jun 30 Javascript
Vue中的transition封装组件的实现方法
Aug 13 Javascript
Vue 样式切换及三元判断样式关联操作
Aug 09 Javascript
解决vue+webpack项目接口跨域出现的问题
Aug 10 Javascript
Vue双向数据绑定(MVVM)的原理
Oct 03 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计划任务、定时执行任务的实现代码
2011/04/23 PHP
PHP中生成UUID自定义函数分享
2015/06/10 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/02/09 Javascript
基于jquery.Jcrop的头像编辑器
2010/03/01 Javascript
JavaScript中的一些定位属性[图解]
2010/07/14 Javascript
node.js中的socket.io入门实例
2014/04/26 Javascript
javascript正则表达式参数/g与/i及/gi的使用指南
2014/08/27 Javascript
怎么通过onclick事件获取js函数返回值(代码少)
2015/07/28 Javascript
全面解析JavaScript中“&amp;&amp;”和“||”操作符(总结篇)
2016/07/18 Javascript
nodejs简单实现操作arduino
2016/09/25 NodeJs
自己封装的一个简单的倒计时功能实例
2016/11/23 Javascript
jQuery和CSS仿京东仿淘宝列表导航菜单
2017/01/04 Javascript
ES6教程之for循环和Map,Set用法分析
2017/04/10 Javascript
AngularJS实现的回到顶部指令功能实例
2017/05/17 Javascript
BootStrap Table前台和后台分页对JSON格式的要求
2017/06/28 Javascript
jQuery 循环遍历改变a标签的href(实例讲解)
2017/07/12 jQuery
node下使用UglifyJS压缩合并JS文件的方法
2018/03/07 Javascript
JavaScript数组基于交换的排序示例【冒泡排序】
2018/07/21 Javascript
jquery.pagination.js分页使用教程
2018/10/23 jQuery
微信小程序页面间值传递的两种方法
2018/11/26 Javascript
关于angular浏览器兼容性问题的解决方案
2020/07/26 Javascript
使用python统计文件行数示例分享
2014/02/21 Python
Python中input和raw_input的一点区别
2014/10/21 Python
Python爬虫DNS解析缓存方法实例分析
2017/06/02 Python
深入浅析python 中的匿名函数
2018/05/21 Python
利用python库在局域网内传输文件的方法
2018/06/04 Python
Flask框架工厂函数用法实例分析
2019/05/25 Python
如何使用python切换hosts文件
2020/04/29 Python
Python selenium环境搭建实现过程解析
2020/09/08 Python
科颜氏美国官网:Kiehl’s美国
2017/01/31 全球购物
解释一下钝化(Swap out)
2016/12/26 面试题
项目副经理岗位职责
2013/12/30 职场文书
房产公证书样本
2015/01/23 职场文书
高中班长竞选稿
2015/11/20 职场文书
Vue通过懒加载提升页面响应速度
2021/05/10 Vue.js
MYSQL常用函数介绍
2022/05/05 MySQL