这是一个艰辛的课题,我在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('/'));
})(),