jquery源码浅析_jquery开源吗

hacker|
87

文章目录:

如何正确阅读jquery源码和jquery插件源码

1. jQuery 里面有很多东西是出于兼容性,历史遗留。

比如 .ready() 之类的函数,为什么会很scroll 有关,那是为了兼容某些ie。这种代码对于编程思想来说不仅没用,而且是杂音,你要筛选出来就得了解这段代码的变动,费心费力得不偿失。

2. jQuery 里面的代码不一定是最优的,例如事件委托,每一次事件触发都要调用选择器,实际上是效率很低的。但是我又比较懒,没有提交patch。

3. jQuery 实际上很容易写出来一个 barebone alternative,在使用的过程中多想,多思考多总结就可以了。

4. jQuery 这类框架里真正有思维挑战性的东西不多,一半以上是堆代码而已,剩下的一点价值在于架构、抽象、扩展能力。

5. 我有一句话与所有的同行分享:工程师让需求成为现实,优秀工程师化复杂为简单,顶尖工程师变不可能为可能;架构师掌握现在,优秀架构师展望未来,顶尖架构师创造时代。

jQuery 的设计目的是,让前端工程师的工作更简单更轻松,但它并不适合所有的前端工程师,假如你的目标是成为优秀架构师、顶尖架构师的话,你在jQuery里也看不清未来。

jQuery内部原理和实现方式浅析

这段时间在学习研究jQuery源码,受益于jQuery日益发展强大,研究jQuery的大牛越来越多,学习的资料也比前两年好找了,有很多非常不错的资源,如高云的jQuery1.6.1源码分析系列。这些教程非常细致的分析了jQuery内部原理和实现方式,对学习和理解jQuery有非常大的帮助。但是个人认为很多教程对jQuery的整体结果把握不足,本人试图从整体来阐述一下jQuery的内部实现。

大家知道,调用jQuery有两种方式,一种是高级的实现,通过传递一个参数实现DOM选择,如通过$(“h1″)选择所有的h1元素,第二种是较为低级的实现,如果通过$.ajax实现ajax的操作。那么,这两种方式到底有何不同?用typeof函数检测$(‘h1′)和$.ajax,类型分别为object和function,稍微学过jQuery的都知道或者听过过,前者返回的是一个jQuery对象,那么jQuery对象是什么,它和jQuery是什么关系呢?我们先来通过for(var

i

in

$(”))

document.write(i+”

:::”+$(“”)[i]+””);打印一下jQuery对象的属性和对应的值,可以看到它有100多个属性,通过console输入$(“*”)可以看到大部分属性是继承自jQuery原型的属性,jQuery对象实际上是这样一个对象:

所以我们来推测,jQuery的实现可能是类似这样的:

function

jQuery(){

this[0]="Some

DOM

Element";

this[1]="Some

DOM

Element";

this[2]="Some

DOM

Element";

this.length=3;

this.prevObject="Some

Object";

this.context="Some

Object";

this.selector="Some

selector";

}

jQuery.prototype={

get:function(){},

each:function(){},

......

}

这些代码通过new操作符就就能创建出拥有上述属性的jQuery对象,但是实际上我们调用jQuery创建jQuery对象时并没有使用new操作符,这是如何实现的呢?来看jQuery的实现:

var

jQuery

=

function(

selector,

context

)

{

//

The

jQuery

object

is

actually

just

the

init

constructor

'enhanced'

return

new

jQuery.fn.init(

selector,

context,

rootjQuery

);

}

jQuery.fn=jQuery.prototype={

jquery:

core_version,

init:function(selector,context){

//some

code

return

this;

}

//some

code

there

//......

}

jQuery.fn.init.prototype=jQuery.fn;

这里有几点做得非常巧妙的地方,第一点是通过jQuery原型属性的init方法来创建对象来达到不用new创建对象的目的,第二点是对init方法内this指向的处理。我们知道,通过调用init返回一个jQuery的实例,那么这个实例就必须要继承jQuery.prototype的属性,那么init里面这个this,

就继承jQuery.prototype的属性。但是init里面的this,受制于作用域的限制,并不能访问jQuery.prototype其它的属性,jQuery通过一句'jQuery.fn.init.prototype=jQuery.fn'把它的原型指向jQuery.fn,这样以来,init产生的jQuery对象就拥有了jQuery.fn的属性。

到这里,一个jQuery的基本原型就浮出水面了。这里有两个对象,一个是jQuery这个构造函数,另外一个是这个构造函数产生的对象(我们称之为jQuery对象,它和普通对象没有什么区别),

如下关系图:

可以看到jQuery构造函数和jQuery.prototype均有各自的属性和方法,两者的调用方法各不一样,这两个对象都有一个extend方法,都是用来扩展自身的属性和方法,在jQuery内部,extend的实现实际是靠一样的代码,

将在后面的源码分析中做以详细的分析。

jQuery on()方法绑定动态元素的点击事件实例代码浅析

之前就一直受这个问题的困扰,在jQuery1.7版本之后添加了on方法,之前就了解过,其优越性高于live(),bind(),delegate()等方法,在此之前项目中想用这个来测试结果发现,居然动态生成的标签点击了没反应,而live方法却能够支持,于是乎到处查资料,问网友,结果找了好久在一篇文章中终于找到了答案。。。

jQuery

使用on绑定动态生成的元素时,不能直接用该对象操作,而是选择其非动态生成的父节点然后再找到本身才能达到效果。大家看看源码就知道了。生成的按钮基数项on方法点击无效live方法有效。

比如页面上有下边两个元素:

input

type="button"

name="addbtn"

value="按钮添加"

/

div

id="test"

/div

使用下边的jQuery代码大家可以对比看看区别:

$(function

()

{

var

a

=

1,

$_div

=

$('#test');

$('input[name=addbtn]').on('click',

function

()

{

$_div.append('input

type="button"

name="test'

+

a

+

'"

value="按钮'

+

a

+

'"/');

a++;

});

//偶数项点击事件

$_div.on('click',

'input[name^=test]:even',

function

()

{

alert('我是有效的on方法,你能看见我吗:'

+

this.value);

});

//奇数项绑定的点击事件

发现点击无效,而是用live方法却能够支持

$('input[name^=test]:odd').on('click',

function

()

{

alert('我是无效的on方法,你不能看见我');

});

//奇数项绑定的点击事件

发现点击无效,而是用live方法却能够支持

$('input[name^=test]:odd').live('click',

function

()

{

alert('我是live方法,你能看见我吗:'

+

this.value);

});

});

以上所述是小编给大家介绍的jQuery

on()方法绑定动态元素的点击事件的相关知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

完全理解jQuery源代码,在前端行业算什么水平

依读了2周jQuery源码的人感觉来说,完全理解jQuery,就拿jQuery 1.11这个版本10337行代码来说,水平已经很不错了。谦虚点说,已经入门。骄傲点,国内领先水平。但其码我感觉是js架构之路起行的第一步,完全理解源码,说明有独立构建或组织大型web前端框架的能力和基础。然后看看完全理解jQuery是一个怎么样的状态。

看下面几个链接就明白了:

RubyLouvre/avalon · GitHub

artDialog

aui/artDialog · GitHub(后来的新版代码有所改变)

没错,这两个里边,就是在继承jquery的基础上做了自己的创新尝试。

然后在看下面这位:

[原创] jQuery1.6.1源码分析系列(停止更新)

是唯一出过jquery源码分析书的一位:

《jQuery技术内幕:深入解析jQuery架构设计与实现原理》(高云)【摘要 书评 试读】

然后在看这位:

jQuery 2.0.3 源码分析系列

是目前一直在更新的一位,通俗有深度且版本比较新。

在说一下我2周阅读jquery源码的心得,初看源码写的恶心,再看写的不错,细看写的真是精妙。然后今天在看ext 4.2的源码,真是流畅易读。基本来说,看懂jQuery源码,以后的源码学习之路可以说,平坦。

然后说是不是高手,高手只是一个自我定位的心理暗示,是一种人格魅力的体现,是业务与技术的完美结合。个人感觉只能无限的接近,不能在有限的生命里边到达。我们在通往目的地过程中享受一路的风景,这才是生命的意义。

然后在说前端,前端的核心是js,外围打酱油的技术太多,不一一列举。

css就像一瓶酒,得品。

html,css总共就那些标签跟选择器属性什么的,但是要写一个有扩展性,健壮性或维护性的页面不容易。现在写页面基本条件反射,不是如何快速的完成,而是思考如果有前端界面需求修改,怎么在修改代码最少的情况下完成整体需求任务。

js就像一把剑,得磨。

js刚开始只是为了较验,随便技术社会的发展,承担的角色越来越重,刚开始玩玩jQuery感觉已经会js了,其实只是冰山一角。随着对js的了解越来越多,他即变态又可爱,即好玩又难控,即有很多兼容问题,但解决兼容是我们基本生存之道。

人生就是一场梦,得作。

技术只是生活的一部分,曾经雄心斗志,如今低头写码。改变能改变的,接受不能改变的。人生有限,兄争朝夕啊。

最后说,什么时候能阅读jQuery源码,我感觉其码是纯js编码一年以上,js基础知识没有盲点。阅读源码,确实能学到很多东西。不只是技术,而是一种生活的态度。一种把一件事情做到极致的态度

jQuery源码分析之实例find和filter方法的区别七问

filter()过滤DOM元素包装集,是指操作当前元素集,删除不匹配的元素,得到一个新的集合

$('div').filter('.div1');//选择div标签中class属性为div1的div元素

find()在当前选中元素的上下文中找到符合条件的后代,返回的是子元素

$('div').find('em');//选择div标签中的em标签的元素

filter()是对选中的元素集合操作,得到这些元素中符合条件的元素,而find()是得到选中元素 中符合条件的后代子元素。

jquery源码 ,jquery选择器,javascript,正则表达式

quickExpr应该是个二义正则。前半段是:

^[^]*([\w\W]+)[^]*$:我猜测意思是一个简单的标签。如$('divnew Div/div')匹配的用法。

后半段是:

^#([\w-]+)$:这个显然就是id选择器。-getElementById

注意两个正则用了|来分隔二义,所以你这里的匹配不成功是正常的。

jquery应该是根据这个quickExpr来判断

if(match[1]) createNewfragment();....

else if(match[2]) getElementById();

当然这只是个人猜测,没有细读jquery源码。仅做参考

3条大神的评论

  • avatar
    访客 2022-07-08 下午 05:51:48

    源码学习之路可以说,平坦。然后说是不是高手,高手只是一个自我定位的心理暗示,是一种人格魅力的体现,是业务与技术的完美结合。个人感觉只能无限的接近,不能在有限的生命

  • avatar
    访客 2022-07-08 下午 08:10:08

    数,为什么会很scroll 有关,那是为了兼容某些ie。这种代码对于编程思想来说不仅没用,而且是杂音,你要筛选出来就得了解这段代码的变动,费心费力得不偿失。2. jQuery 里面的代码不一定是最优的,例如事件委托,每一次事件触发都要调用选择器,实际

  • avatar
    访客 2022-07-08 下午 11:44:14

    个问题的困扰,在jQuery1.7版本之后添加了on方法,之前就了解过,其优越性高于live(),bind(),delegate()等方法,在此之前项目中想用这个来测试结果发现,居然动态生成的标签点击了没反应,而live方法却能够支持,于是乎到处查资料,问

发表评论