YUI在IE浏览器里DOM元素加载很快的时候window.onload执行的要比domready快。这个执行顺序的问题应该算是一个bug,但是在jQuery我做个类似的实验,发现jQuery里没有类似的问题。

对这个问题确实比较好奇,看了看YUI2和jQuery关于DOM ready实现的部分源码。在IE实现DOM Ready基本都是用Diego Perini提出的方法:http://javascript.nwbox.com/IEContentLoaded/

但是jQuery的开发者已经意识到IE浏览器有时存在onload执行的比DOM Ready快的问题,因为这样确实会出现风险。jQuery是这么解决的,我节选了部分解决这个问题的jQuery代码(版本-1.4.2):

DOMContentLoaded = function() {

if ( document.readyState === “complete” ) {

document.detachEvent( “onreadystatechange”, DOMContentLoaded );

jQuery.ready();

}

};

document.attachEvent(“onreadystatechange”, DOMContentLoaded);

YUI没有这样做,我估计是因为效率问题,上面的代码虽然让domready执行的比window.onload快,但是因为绑定了onreadystatechange事件,效率会低一点。

而jQuery采用了更加安全的策略,慢就慢一点,安全一点更重要。如果在使用YUI2的时候确实遇到了这个安全问题,我们也可以牺牲一点效率,修改一下YUI的源码。

终于搞清楚了,又是一个需要权衡的问题。

但是我也抛出一个我没有想明白的问题,YUI2里面为什么不去尝试

document.documentElement.doScroll(‘left’);来判断domready,而是先要在超空间先创造一个p节点,然后再doScroll,domready以后再把这个p节点清空掉,这样做有什么好呢?为什么不采用jQuery和Diego Perini的做法呢?个人觉得创造一个p节点,再释放掉效率更低呀。