查看文章 |
domready 的改进办法
2008-05-15 21:03
IE 对domready的支持。 一直是最头疼的。 没有直接的事件,而document.readyState又是极不可靠。 我见过的一个最早的版本是通过 hta事件来支持,但是hta这个多出的异物又让很多人看着别扭;于是有了 script defer版。 script defer 必须执行document.write函数,而这个在某些环境下,又是一个令人不安的地雷。 今天看见mootools的domready实现,不错,记录下来: case 'trident':
var temp = document.createElement('div'); (function(){ ($try(function(){ temp.doScroll('left'); return $(temp).inject(document.body).set('html', 'temp').dispose(); })) ? domready() : arguments.callee.delay(50); })(); 看着晕了不?提示以下,trident 又称为MSHTML,是IE的排版引擎的名称。与Mozilla 的Gecko同类。 mootools搞一个这么晦涩的名词,有点郁闷,为何?卖弄? 还有,如果你不熟悉mootools API,那么剩下的那些代码估计也够你受的。我用最直接的代码改写以下: var el = document.createElement('div');
var interval = setInterval(function(){ for(var i=0;i<1000;i++) try{ el.doScroll('left'); document.body.appendChild(el);//以下三行仿照mootools,但不知何意 el.innerHTML = "left"; el.parentNode.removeChild(el); clearInterval(interval); ready(); return; }catch(e){ //$log.info(e) } },10); 不过这种实现也是个很无赖的选择,靠这个异常去判断实在是不可靠啊。没准那天ie就不这么干了:( 所以,保险起见,最后还是放个onload把。 开始还有点担心异常的性能问题,测试了以下,基本不必考虑,我循环了1000次,也就是区区31秒。当能,要考虑开发人员的计算机还是比较快的。 |
最近读者: