• 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
                        })));
                    }
                }
            },
    
  • 相关阅读:
    禁用网络连接后无法访问本机数据库的问题
    DevExpress使用笔记
    DEV控件 皮肤问题
    SQLServer2008导入Excel遇到的问题
    InnoSetup使用笔记
    SQLServer清空数据库中所有表的数据
    MS SQL Server2000转换成MySQL
    由MySQL登录不了引发的一些问题
    onerror事件
    DIV+CSS一些小小的技巧
  • 原文地址:https://www.cnblogs.com/rubylouvre/p/1708419.html
Copyright © 2020-2023  润新知