zoukankan      html  css  js  c++  java
  • 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
    }
    
  • 相关阅读:
    1094. Car Pooling
    121. Best Time to Buy and Sell Stock
    58. Length of Last Word
    510. Inorder Successor in BST II
    198. House Robber
    57. Insert Interval
    15. 3Sum java solutions
    79. Word Search java solutions
    80. Remove Duplicates from Sorted Array II java solutions
    34. Search for a Range java solutions
  • 原文地址:https://www.cnblogs.com/rubylouvre/p/1705817.html
Copyright © 2011-2022 走看看