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
                    })));
                }
            }
        },
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值