jquery实现原理,jquery源码实现原理

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,而是简单选择器,目的就是定义范围,

提高速度,这次就说这些,选择写法的优化,其他的优化,下次再说。

jquery拖动层的工作原理

主要分三个部分,注册Handler的Click事件

Click事件引发是开始拖动,此时注册Document的MouseMove事件,Move的时候修改对象的位置

松开或者ESC的时候取消移动,注销Document的Move事件

基本上所有的DragDrop都是这么实现的

jQuery的getScript.fail实现的原理是怎样的

jquery用AJAX读回来代码字符串然后用下面的代码执行读取回来的script

( window.execScript || function( script ) {

window[ "eval" ].call( window, script );

} )( script );

JavaScript中Promise模式。

ajax在jquery的底层是怎么实现的呢?

它的底层实现包括下面几个方面:1.jQuery底层在实现ajax功能时,调用了浏览器中的XMLHttpRequest对象,在最新的2.0版本后,由于不考虑IE浏览器的支持,直接使用该对象获取用户请求的数据,包括地址和参数等。2.它将对象打开请求地址时的相关参数封装在相关函数如ajax()的配置项中,一旦传入了必需选项,则直接调用相应的send()方法进行数据的请求。3.jQuery底层将对象请求后返回的数据结果,直接封装到相关函数的success方法中,所以,一旦异步请求成功,返回的数据对象直接注入到方法中,因此,可以调用success方法获取服务端返回的数据。我之前在黑马程序员的免费视频中看到过ajax和jQuery的相关视频,讲的都还挺不错的。


文章标题:jquery实现原理,jquery源码实现原理
本文来源:http://ybzwz.com/article/hosohp.html