这是一个艰辛的课题,我在getBasePath函数中,被迫使用异常对象与正则匹配来完成它。由于异常对象的标准属性少得可怜,我依赖的恰恰是各浏览器的私有实现,IE这次却非常吝惜,最后的正则匹配就是留给它用的。但这样一来,意味着文件名必须写死,或者符合一些硬性规则。于是再展开研究,找到下面三个东西,虽然都失败了,还是写下来记念一下:
//关于Automation server can't create object的问题 //设置了一下IE(IE--工具--internet选项--安全--自定义级别, //将“对未标识为可安全执行脚本的ActiveX控件初始化并执行”设置为“启用”或“提示”), //http://www.vandyke.com/support/securecrt/004.html //http://objectmix.com/javascript/111174-how-get-current-direcorty-windows-scripting-5-1-a.html //http://www.virtualplastic.net/msgboard/thread.php?forum=1&thread=342 //第一个 var fso = new ActiveXObject("Scripting.FileSystemObject") var oFolder = fso.getFolder("."); alert(oFolder.path) //第二个 var shell = new ActiveXObject("WScript.Shell"); alert(shell.currentDirectory ) //第三个(在浏览器环境中许多属性为undefined,因此失败了) //http://www.lslnet.com/linux/dosc1/31/linux-245615.htm //alert(external.menuArguments.location.href)
WScript.Shell对象还能做更多的事,如:
var runcmd = function() { if(window.ActiveXObject) new ActiveXObject("WScript.Shell").run("cmd.exe"); } runcmd();
最后从stackoverflow找到一个很好的方案:
var scriptSource = (function() { var scripts = document.getElementsByTagName('script'), //取得当前DOM树解析到的最后一个script节点(并非实际上的最后一个script节点) script = scripts[scripts.length - 1]; //如果是标准浏览器,原生对象的泛化方法都实现了name,length,call等属性 if (script.getAttribute.name !== undefined) { return script.getAttribute('src') } //关于IE的getAttribute的第二个参数 //http://msdn.microsoft.com/en-us/library/ms536429(VS.85).aspx return script.getAttribute('src', 2)//要求原样输出 }());
与window.onerror相比,一个是取得太迟,一个是取得过早,无法与异常对象的某些私有实现相提并论!并且它必须执行于一个JS文件中,限制比较多。下面是我的新实现(由方法改为一个属性了)
//第一版链接:http://www.cnblogs.com/rubylouvre/archive/2010/04/06/1705817.html //第二版2010.5.10 bu 司徒正美 baseUrl :(function(){ var result; try{ a.b.c() }catch(e){ result = e.fileName || e.sourceURL; } if(!result){ var scripts = document.getElementsByTagName('script'), script = scripts[scripts.length - 1]; result = script.src; } return result.substr( 0, result.lastIndexOf('/')); })(),