jQuery选择的工作原理和优化

至于有那些选择器,在帮助手册中都有,自己去看,这篇主要是分析他的工作原理,而优化我们写的选择器,尤其在页面内容很多的情况下,更应该需要优化。下边就言归正传。

每次申明一个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,而是简单选择器,目的就是定义范围,提高速度,这次就说这些,选择写法的优化,其他的优化,下次再说。

(转载请加上http://lwp8407120426.blog.163.com)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《jQuery高级编程》是一本面向有一定前端开发基础的读者,深入探讨jQuery框架的高级应用与技巧的书籍。这本书内容广泛且深入,包括了jQuery的核心原理、高级选择器、动画效果、Ajax异步请求、事件处理、插件开发等等。 该书首先详细介绍了jQuery的核心原理和基础知识,深入探讨了jQuery选择器的使用技巧和优化方法。接着,书中介绍了如何使用jQuery创建各种动画效果以及如何优化动画性能。此外,还介绍了jQuery的事件处理机制和常见事件处理方法,以及如何使用事件委托和自定义事件。 更进一步,书中还详细讲解了如何使用jQuery实现Ajax异步请求,包括Ajax的基本使用、处理返回数据、错误处理等。此外,书中还介绍了如何进行跨域请求、使用JSONP等相关技术。 最重要的是,该书还涉及了如何开发jQuery插件,包括插件的基本结构、常见插件开发模式、插件的封装和发布等。还介绍了一些实用的jQuery插件,包括轮播图插件、日期选择插件、表单验证插件等等。 总之,《jQuery高级编程》是一本面向有一定基础并希望深入学习jQuery的读者的高级教程。通过阅读该书,读者能够系统地学习和掌握jQuery的高级应用与技巧,提升自己在前端开发中的能力和水平。 ### 回答2: 《jquery高级编程》是一本面向中高级开发者的jQuery编程指南。本书主要包括了jQuery的高级特性、设计模式、插件开发等内容,适合读者已经具备一定jQuery基础并想要深入学习和掌握该库。 首先,本书从jQuery的基础开始介绍,包括选择器、操作DOM元素、事件处理等内容。然后,逐步深入讲解了jQuery的高级特性,如元素动画、效果与动画、Ajax和延迟对象等。通过阅读本书,读者能够对jQuery的核心功能有更深入的理解,并能够运用到实际项目中。 同时,本书还介绍了一些常用的设计模式和最佳实践,帮助读者写出更加优雅、高效的代码。书中也提供了大量的示例和案例,让读者可以更好地理解和应用所学知识。 此外,本书还涵盖了插件开发和扩展jQuery的内容。通过学习如何编写自己的插件,读者能够将jQuery的功能扩展到更广泛的应用场景中,提高开发效率和代码质量。 总而言之,《jquery高级编程》是一本系统全面的jQuery开发指南,适合有一定基础的开发者进一步深入学习并提升技术水平。无论是理论还是实践,本书都能给读者提供宝贵的指导和帮助。 ### 回答3: 《jQuery高级编程》是一本专门介绍jQuery技术的书籍。作为一本高级编程指南,这本书不仅向读者介绍了jQuery的基础知识和常见用法,还深入探讨了更高级的概念和技术。本书的作者具有丰富的经验和深入的理解,为读者提供了极为实用和有洞察力的内容。 在《jQuery高级编程》中,读者将学习到如何使用jQuery来创建交互性强、动态性强的网页。书中提供了大量的代码示例和练习,帮助读者理解和掌握jQuery的各种功能和方法。同时,该书还介绍了jQuery的一些高级特性,如插件开发、事件委托、动画效果和Ajax技术等。 除了介绍和讲解基础知识外,本书还讨论了一些最佳实践和性能优化的方法。通过学习这些技巧,读者可以更好地使用jQuery和其他相关技术,提高网页的加载速度和用户体验。 总的来说,如果你已经熟悉基础的jQuery知识,想要进一步提升自己的技能并深入理解jQuery原理和应用,那么《jQuery高级编程》是一本非常值得推荐的书籍。无论是前端开发人员还是对网页交互性感兴趣的读者,都能从中获得丰富的知识和实用的技巧。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值