Ruby's Louvre

每天学习一点点算法

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

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
}

如果您觉得此文有帮助,可以打赏点钱给我支付宝1669866773@qq.com ,或扫描二维码

posted on   司徒正美  阅读(6049)  评论(6编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示