5.ready

参考文章
https://segmentfault.com/a/1190000005762854

ready其实自己看看基本能看明白,我写在这里只是为了记录一下,我还是和之前一样,看的是2.0.3的版本,我找了一下,发现以前的版本ready的检测内容更多些,比如参考文章里面是1.8.3版本

先看2.0.3,搜一下ready:可以发现两个,一个很简单,就两句话

jQuery.ready.promise().done( fn );
return this;

这个是挂在jQuery.fn里面的,还有一个是JQuery.extend扩展的,稍微多点,等会儿看

我们平时写ready的时候通常有三种写法

$(document).ready(function)
$().ready(function)
$(function)

$(function)这种方式,显然是先走了JQuery的构造方法,也就是jQuery.fn.init,在init里找一下,可以发现

else if ( jQuery.isFunction( selector ) ) {
    return rootjQuery.ready( selector );
}

上面这个rootjQuery就是jQuery(document),所以这三种写法其实是一模一样的,都是跑到了jQuery.fn.ready里面,执行了jQuery.ready.promise().done(fn)

这个时候这代码看起来像是jQuery.ready是个deferred,然后执行了promise(),其实不是,其实是有个jQuery.ready.promise()函数(汗),搜一下jQuery.ready.promise可以找到,在这个函数里添加了document的DOMContentLoaded和window的load事件的检测(并且绑定了completed函数),返回了一个readyList.promise(),代码很少,自己看一眼

然后就是等待事件触发,事件触发以后,(completed函数里)调用了jQuery.ready(),这就是刚才我们没看的那个ready,里面有一句readyList.resolveWith( document, [ jQuery ] );,这个就是刚才jQuery.ready.promise()函数里的那个deferred,然后传给jQuery.fn.ready的回调就可以执行了。

1.8.3版本多一些检测内容,onreadystatechange、doScroll等,流程还是一样的(大概)

猜你喜欢

转载自blog.csdn.net/u011393161/article/details/80268695