明天我就要开始改改jq的源码了…
为了配合项目,我设想了一个方式,修改readylist的执行顺序,以便资源加载完成之后开始初始化页面…
先留个坑,明天实现以后写后续…
2017.2.22 22:41
待续。。。
-------------------------------------------------
2017-10-21 13:43:01
我去。一个待续就等到了这个时候了,要不是来看看,我都快忘了还有这么个东西
这还是在天津的时候搞的东西,现在我在杭州,新公司已经待了快半年了,看看之前的代码,来把这篇补上好了。。。
--------------------------------------------------
正文开始
我印象里边这个修改是因为我们原来的项目里头有一个include插件,也是作为一个jQuery的插件存在的
然后这个插件是同步的,用xhr,这导致了很大的性能问题
所以我希望能改成异步的
但是异步的加载,响应domready事件的时间点又不对了
这样会导致如果页面的js提前加载完毕,但是依赖的插件并没有加载回来,这样就会报错
所以我希望在jQuery执行domready回调的时候,等待我的异步加载完成,加载完成了再开始回调,这样就不会有问题
现在就有两个问题
1. 我需要监测异步加载的完成(当然我们的插件仅依赖于jQuery,所以不需要做依赖管理)
2. 我需要修改jQuery的源码,以等待异步加载完成
具体的include源码在我的github上,本来是在天津的时候说把我自己写的一些插件都放上去,但是后来工作的关系,没时间,公司也不让上传代码,我自己电脑基本就懒得弄那些东西了。。。
其实说出来之后解决就比较简单了,代码简单到随便瞄一眼就能看懂,不解释了,上代码
找到这个domReady处理函数,看一眼,里面起作用的就是被我包起来的那句话
readyList.resoveWith( document, [ jQuery ] );
把这个封起来,做成一个函数,然后监测如果加载了include插件,并且include插件并没有完成所有加载,那么将这个回调传给include插件
否则执行
另外一部分就是在include中处理了,这里不多讲
主要是等待,这个简单到不行,做一个计数器,javascript又没有线程问题,直接加减就可以了
稍微注意一下的是,我做异步加载使用的是script标签形式,这有几个好处,第一是这个异步,第二个是这个能跨域
但是这个也会有个问题,兼容性问题,直接使用原生的技术就会遇到这种狗屁的问题
在ie8下,标签没有load事件,只有一个readystatechange事件(这个事件会相应超过一次,需要判断状态值,跟xhr差不多,不过状态没有那么多就是了),所以需要注册两种事件
but
恩,万事万物都有一个but。。。
but ie9尼玛支持两种事件,所以这里需要稍微注意一下
..............................end.........................