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 } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .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 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义