Ruby's Louvre

每天学习一点点算法

导航

getBasePath 函数第二版

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

posted on 2010-05-20 12:54  司徒正美  阅读(2164)  评论(2编辑  收藏  举报