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 }))); } } },
机器瞎学/数据掩埋/模式混淆/人工智障/深度遗忘/神经掉线/计算机幻觉/专注单身二十五年