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下判断一个对象是否具有指定名称的属性的的代码
Jan 11 Javascript
JavaScript 模式之工厂模式(Factory)应用介绍
Nov 15 Javascript
GRID拖拽行的实例代码
Jul 18 Javascript
Jquery.addClass始终无效原因分析
Sep 08 Javascript
jq实现酷炫的鼠标经过图片翻滚效果
Mar 12 Javascript
jQuery学习笔记之jQuery.fn.init()的参数分析
Jun 09 Javascript
非常实用的js验证框架实现源码 附原理方法
Jun 08 Javascript
AngularJS删除路由中的#符号的方法
Sep 20 Javascript
最常见的左侧分类菜单栏jQuery实现代码
Nov 28 Javascript
jQuery Masonry瀑布流插件使用方法详解
Jan 18 Javascript
Node.js使用Express创建Web项目详细教程
Mar 31 Javascript
详解node+express+ejs+bootstrap构建项目
Sep 27 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
SONY ICF-F10中波修复记
2021/03/02 无线电
php实现斐波那契数列的简单写法
2014/07/19 PHP
编写PHP脚本来实现WordPress中评论分页的功能
2015/12/10 PHP
如何通过View::first使用Laravel Blade的动态模板详解
2017/09/21 PHP
PHP7数组的底层实现示例
2019/08/25 PHP
JS实现下拉框的动态添加(附效果)
2013/04/03 Javascript
js和jquery对dom节点的操作(创建/追加)
2013/04/21 Javascript
表单类各种类型(文本框)失去焦点效果jquery代码
2013/04/26 Javascript
jquery改变disabled的boolean状态的三种方法
2013/12/13 Javascript
JSP中使用JavaScript动态插入删除输入框实现代码
2014/06/13 Javascript
javascript 事件处理示例分享
2014/12/31 Javascript
jQuery mobile类库使用时加载导航历史的方法简介
2015/12/04 Javascript
利用JS实现点击按钮后图片自动切换的简单方法
2016/10/24 Javascript
Vue实现textarea固定输入行数与添加下划线样式的思路详解
2018/06/28 Javascript
Vue-router 中hash模式和history模式的区别
2018/07/24 Javascript
vuejs选中当前样式active的实例
2018/08/22 Javascript
jquery.param()实现数组或对象的序列化方法
2018/10/08 jQuery
[01:07:57]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第二场 1月19日
2021/03/11 DOTA
python查找指定具有相同内容文件的方法
2015/06/28 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/27 Python
解决Python正则表达式匹配反斜杠''\''问题
2019/07/17 Python
解决python 3 urllib 没有 urlencode 属性的问题
2019/08/22 Python
Python基于class()实现面向对象原理详解
2020/03/26 Python
Python实现电视里的5毛特效实例代码详解
2020/05/15 Python
python使用建议与技巧分享(一)
2020/08/17 Python
Python第三方库安装缓慢的解决方法
2021/02/06 Python
Django与AJAX实现网页动态数据显示的示例代码
2021/02/24 Python
12个不为大家熟知的HTML5设计小技巧
2016/06/02 HTML / CSS
英国领先的票务代理商之一:The Ticket Factory
2019/02/09 全球购物
买卖正宗运动鞋:GOAT
2019/12/06 全球购物
输入N,打印N*N矩阵
2012/02/20 面试题
护士节活动总结
2014/08/29 职场文书
2014离婚协议书范文
2014/09/10 职场文书
党的群众路线教育实践活动心得体会(企业)
2014/11/03 职场文书
摩登时代观后感
2015/06/03 职场文书
SQL Server使用T-SQL语句批处理
2022/05/20 SQL Server