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 相关文章推荐
基于prototype的validation.js发布2.3.4新版本,让你彻底脱离表单验证的烦恼
Dec 06 Javascript
HTML中Select不用Disabled实现ReadOnly的效果
Apr 07 Javascript
深入浅析JavaScript中with语句的理解
May 12 Javascript
JS结合bootstrap实现基本的增删改查功能
Jul 22 Javascript
jQuery ajax实现省市县三级联动
Mar 07 Javascript
JavaScript中使用Async实现异步控制
Aug 15 Javascript
js排序与重组的实例讲解
Aug 28 Javascript
微信禁止下拉查看URL的处理方法
Sep 28 Javascript
vue-cli + sass 的正确打开方式图文详解
Oct 27 Javascript
你应该了解的JavaScript Array.map()五种用途小结
Nov 14 Javascript
微信小程序实现时间进度条功能
Nov 17 Javascript
vue实现给div绑定keyup的enter事件
Jul 31 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
thinkphp实现面包屑导航(当前位置)例子分享
2014/05/10 PHP
js中的scroll和offset 使用比较的实例与分析
2013/09/29 Javascript
jquery在项目中做复选框时遇到的一些问题笔记
2013/11/17 Javascript
javascript处理表单示例(javascript提交表单)
2014/04/28 Javascript
javascript实现的一个带下拉框功能的文本框
2014/05/08 Javascript
上传图片预览JS脚本 Input file图片预览的实现示例
2014/10/23 Javascript
JavaSacript中charCodeAt()方法的使用详解
2015/06/05 Javascript
解决angular的post请求后SpringMVC后台接收不到参数值问题的方法
2015/12/10 Javascript
vue.js初学入门教程(1)
2016/11/03 Javascript
Bootstrap源码学习笔记之bootstrap进度条
2016/12/24 Javascript
浅谈regExp的test方法取得的值变化的原因及处理方法
2017/03/01 Javascript
JavaScript使用ZeroClipboard操作剪切板
2017/05/10 Javascript
Vue shopCart 组件开发详解
2018/01/26 Javascript
JavaScript实现图片伪异步上传过程解析
2020/04/10 Javascript
JS面试题中深拷贝的实现讲解
2020/05/07 Javascript
利用vue3+ts实现管理后台(增删改查)
2020/10/30 Javascript
对vue生命周期的深入理解
2020/12/03 Vue.js
利用JS判断元素是否为数组的方法示例
2021/01/08 Javascript
python批量修改文件名的实现代码
2014/09/01 Python
python实现批量下载新浪博客的方法
2015/06/15 Python
浅谈Python使用Bottle来提供一个简单的web服务
2017/12/27 Python
vue.js实现输入框输入值内容实时响应变化示例
2018/07/07 Python
深入浅析python的第三方库pandas
2020/02/13 Python
HTML5 manifest离线缓存的示例代码
2018/08/08 HTML / CSS
摩顿布朗英国官方网上商店:奢华沐浴、身体和头发护理
2016/10/29 全球购物
英国最大的经认证的有机超市:Planet Organic
2018/02/02 全球购物
Clarks鞋澳大利亚官方网站:Clarks Australia
2019/12/25 全球购物
卡拉威高尔夫官方网站:Callaway Golf
2020/09/16 全球购物
物业管理毕业生个人的求职信
2013/11/30 职场文书
大学四年职业生涯规划书范文
2014/01/02 职场文书
应聘编辑职位自荐信范文
2014/01/05 职场文书
慈善晚会策划方案
2014/05/14 职场文书
运动会口号大全
2014/06/07 职场文书
就业指导讲座心得体会
2016/01/15 职场文书
聊一聊python常用的编程模块
2021/05/14 Python
python中Pyqt5使用Qlabel标签播放视频
2022/04/22 Python