好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

getCurrentScript的改进

getCurrentScript的改进

getCurrentScript的改进

第一版

function   getCurrentScript(){

     if (DOC.currentScript){

         return   DOC.currentScript.src

     }

     var   nodes = head.getElementsByTagName( "script" ) //只在head标签中寻找

     for   ( var   i = 0, node; node = nodes[i++];) {

         if   (  node.readyState === "interactive" ) {

             return    node.className = node.src;

         }

     }

}

第二版

增加对firefox4-与chrome4+的支持

function   getCurrentScript() {

       //取得正在解析的script节点

       if (DOC.currentScript) { //firefox 4+

           return   DOC.currentScript.src;

       }

       var   stack, e, nodes = head.getElementsByTagName( "script" ); //只在head标签中寻找

       //  参考 https://github.com/samyk/jiagra/blob/master/jiagra.js

       try   {

           a.b.c(); //强制报错,以便捕获e.stack

       } catch (e) {

           stack = e.stack;

       }

       if (stack) {

           // chrome IE10使用 at, firefox opera 使用 @

           e = stack.indexOf( ' at ' ) !== -1 ? ' at '   : '@' ;

           while (stack.indexOf(e) !== -1) {

               stack = stack.substring(stack.indexOf(e) + e.length);

           }

           return   stack.replace(/:\d+:\d+$/ig, "" );

       }

       for (i = 0; node = nodes[i++];) {

           if ( node.readyState === "interactive" ) {

               return   node.className = node.src;

           }

       }

   }

第三版

有的e.stack最后只有行号没有出错位置,导致正则取值失败,fix bug

function   getCurrentScript() {

        //取得正在解析的script节点

        if (DOC.currentScript) { //firefox 4+

            return   DOC.currentScript.src;

        }

        //  参考 https://github.com/samyk/jiagra/blob/master/jiagra.js

        var   stack, e, i, node;

        try   {

            a.b.c(); //强制报错,以便捕获e.stack

        } catch (e) {

            stack = e.stack;

        }

        if (stack) {

            // chrome IE10使用 at, firefox opera 使用 @

            e = stack.indexOf( ' at ' ) !== -1 ? ' at '   : '@' ;

            i = stack.lastIndexOf(e);

            var   a = stack.slice(i+e.length).replace(/\s\s*$/, "" ).replace(/(:\d+)?:\d+$/i, "" );

            return   a

        }

        var   nodes = head.getElementsByTagName( "script" ); //只在head标签中寻找

        for (i = 0; node = nodes[i++];) {

            if ( node.readyState === "interactive" ) {

                return   node.className = node.src;

            }

        }

    }

第四版

IE10最后一行与其他浏览器不同,需要转换思路去掉杂质

function   getCurrentScript() {

     //取得正在解析的script节点

     if (DOC.currentScript) { //firefox 4+

         return   DOC.currentScript.src;

     }

     // 参考 https://github.com/samyk/jiagra/blob/master/jiagra.js

     var   stack;

     try   {

         a.b.c(); //强制报错,以便捕获e.stack

     } catch (e) { //safari的错误对象只有line,sourceId,sourceURL

         stack = e.stack;

         if (!stack && window.opera){

             //opera 9没有e.stack,但有e.Backtrace,但不能直接取得,需要对e对象转字符串进行抽取

             stack = (Strin(e).match(/of linked script \S+/g) || []).join( " " );

         }

     }

     if (stack) {

         /**e.stack最后一行在所有支持的浏览器大致如下:

         *chrome23:

         * at http://113.93.50.63/data.js:4:1

         *firefox17:

         *@ http://113.93.50.63/query.js:4

         *opera12:

         *@ http://113.93.50.63/data.js:4

         *IE10:

         *  at Global code ( http://113.93.50.63/data.js:4:1 )

         */

         stack = stack.split( /[@ ]/g).pop(); //取得最后一行,最后一个空格或@之后的部分

         stack = stack[0] == "("   ? stack.slice(1,-1) : stack;

         return   stack.replace(/(:\d+)?:\d+$/i, "" ); //去掉行号与或许存在的出错字符起始位置

     }

     var   nodes = head.getElementsByTagName( "script" ); //只在head标签中寻找

     for ( var   i = 0, node; node = nodes[i++];) {

         if (node.readyState === "interactive" ) {

             return   node.className = node.src;

         }

     }

}

现应用于我的模块加载系统,鲁棒无比,兼容IE6-10,firefox3+, chrome, opera9+。对于safari,则使用慢一点的解析堆栈处理掉。如果大家想用,请记得把DOC,head都换成document。

相关链接:

getBasePath 函数 取到当前正在执行的script元素

 

 

 

标签:  javascript

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于getCurrentScript的改进的详细内容...

  阅读:47次