百度首页 | 百度空间
 
查看文章
 
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秒。当能,要考虑开发人员的计算机还是比较快的。

类别:雕虫小技 | 添加到搜藏 | 浏览() | 评论 (1)
 
最近读者:
 
网友评论:
1
2008-05-16 13:35
使用引擎代号可能是为了更准确,之前是用ie,ie6和ie7标识的,但是还有很多用ie内核的浏览器,这样可能会造成误解,就像webkit和gecko,也不是单指某个浏览器,当然,这种做法可能是在底层开发者角度考虑的,一般用户可能会迷糊,按现在的用户体验理论来说,也是不可取的

用了hack就得时时小心谨慎了:
http://dean.edwards.name/weblog/2007/03/rules/#rule8
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码:
 

     

©2008 Baidu