Ruby's Louvre

每天学习一点点算法

导航

globalEval函数

不知怎么翻译这个eval,感觉应该叫做动态解析执行脚本吧。分析一下几种执行脚本的方式。

  • eval,这个在IE与标准浏览器差别很大。IE下,前面加不加“window.eval”前缀,都是当前作用域执行,FF如果加了就是全局执行。
  • execScript,全局解析执行。IE 与chrome都支持此方法。
  • (new Function("return " + code))(),这个限制很多,如"var a = 8"就完蛋了,jQuery好像用它来解析JSON。
  • script标签,无可口非,这是它的专长,当我们把它插入到DOM树中,它就会解析执行里面的内容,内部脚本或是外部脚本。这里当然是内部脚本。注意,如果设置了src属性,它就无法解析内部脚本了。在IE下如果script标签设置了defer属性,可以不插入DOM树就能执行脚本,但是在IE7中,如果不加入DOM树,可能回收不了此节点。

第三种方法非常麻烦,但适合性最强。首先,我们需要有一个script节点。下面是我创建script节点的方法,使用innerHTML来创建节点。注意,IE用innerHTML序列化节点存在些bug,直接用"<script><\/script>"是不行的,需要在前面加点东西,如 "<br><script><\/script>",相同的情况也发生在link节点上。然后,是使用何种属性来写入代码,具体可参看我另一篇博文《javascript 动态解析脚本》

      script:function(obj){
        dom.parser.innerHTML = '<br><script type="text/javascript" charset="utf-8" ><\/script>'
        return dom.mixin(dom.parser.childNodes[1],obj);
      },

dom.parser其实就是document.createElement("div"),dom.mixin是一个属性添加方法,没有什么好说的。最后附上我的globalEval函数的演变史:

//2010.5.18
//============第一版:============
        globalEval: function( code ) {
            if ( code && /\S/.test(code) ) {
                var script = dom.script({
                    text:code
                }),head = dom.head();       
                //不要用appendChild,但因为IE6的base自闭合形式导致页面结构崩坏
                head.insertBefore( script, head.firstChild);
                head.removeChild( script );
            }
        },
//============第二版:============
        globalEval: function( code ) {
            if ( code && /\S/.test(code) ) {
                var method = window.execScript ? "execScript" : "eval"
                window[method](code);
            }
        },
 //============第三版:============
        globalEval: function( code ) {
            if ( code && /\S/.test(code) ) {
                if (window.execScript){
                    window.execScript(code)
                } else {
                    var head = dom.head();
                    head.removeChild( head.appendChild(dom.script({//opera下出问题了,
                        text:code
                    })));
                }
            }
        },

posted on 2010-04-09 16:14  司徒正美  阅读(4321)  评论(9编辑  收藏  举报