当前位置:编程学习 > JAVA >>

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

 

  &

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,