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 }
机器瞎学/数据掩埋/模式混淆/人工智障/深度遗忘/神经掉线/计算机幻觉/专注单身二十五年