Ruby's Louvre

每天学习一点点算法

导航

getBasePath 函数

假如我们有这样一个javascript文件,它叫dom.js,不过随着版本的不同,它可能叫dom.1.0.js, dom.1.2.js,或者dom-1.2.js。我们要求在这个文件内写一些代码,获得它的路径,然后跟据它动态加载这个路径下的其他JS文件。更明确地说,其实这个JS文件的内容是一个加载器,其他JS文件需要依赖它实现整个框架的模块化。那么我们的首要问题是如何获得这JS文件的路径呢?

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta content="IE=8" http-equiv="X-UA-Compatible"/>

    <title>获取JS文件的路径 by 司徒正美</title>

    <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
    <script src="/javascripts/dom-1.0.js?1270565974" type="text/javascript"></script>

  </head>
  <body>
    <div>获取JS文件的路径 by 司徒正美</div>


  </body>
</html>

下面是JS文件的内容,当然现在放出来的只针对本博文讨论的东西:

//2010.5.14更新
dom = {};
dom.getBasePath : function(){
            var result = "",m;
            try{
                a.b.c();
            }catch(e){
                if(e.fileName){//firefox
                    result = e.fileName;
                }else if(e.sourceURL){//safari
                    result = e.sourceURL;
                }else if(e.stacktrace){//opera9
                    m = e.stacktrace.match(/\(\) in\s+(.*?\:\/\/\S+)/m);
                    if (m && m[1])
                        result =  m[1]
                }else if(e.stack){//chrome 4+
                    m= e.stack.match(/\(([^)]+)\)/)
                    if (m && m[1])
                        result = m[1]
                }
            }
            if(!result){//IE与chrome4- opera10+
                var scripts = document.getElementsByTagName("script");
                var reg = /dom([.-]\d)*\.js(\W|$)/i,src
                for(var i=0, el; el = scripts[i++];){
                    src = !!document.querySelector ? el.src:
                    el.getAttribute("src",4);
                    if(src && reg.test(src)){
                        result = src
                        break;
                    }
                }
            }
            return result.substr( 0, result.lastIndexOf('/'));
        }
alert(dom.getBasePath());// http://localhost:3000/javascripts/

充分利用异常对象,有时也能提高效率。标准浏览器的异常对象被添加了许多私有实现,如这次我们想获得当前异常发生的文件的URL,在firefox下可以用fileName,在safari下可以用sourceURL,在opera下可以用stacktrace,其他浏览器就没有办法了,只能取得所有script标签的src属性逐个比较了。由于是取得绝对路径,这牵及IE老版本不区分属性特性的问题了,不过IE的getAttribute为我们准备了第二个参数,标准浏览器直接el.src就行了。然而在IE8中(更严格地说,是运行于IE8模式下),这bug又修复了,但微软又多事取消了第二个参数,搞得我们还得判定当前的IE浏览器是否运行于IE8模式下,这方法很多,如documentMode,这里我建议取用querySelector 这个高级选择器。这样,我们就能取得其文件位置了。


IE新的方法,可惜是异步的,需要过几毫秒才能用,因此只适宜框架内部:

//2010.5.14更新
dom.path =""
try{
    r = u
}catch(e){
    window.onerror = function (msg, url, num) {
        dom.path = url;
        return true; // prevents browser error messages
    }
    window.fireEvent &&  window.fireEvent("onerror",e)
   //........下略.....
   //window.onerror目前只在IE与FF中正常工作,其他标准浏览器没有反应
   //这个地址是关于异常对象的
   //http://github.com/emwendelin/javascript-stacktrace
}

posted on 2010-04-06 23:58  司徒正美  阅读(5976)  评论(6编辑  收藏  举报