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源码实现原理
URL网址:http://scyanting.com/article/hosohp.html