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
    }
    
  • 相关阅读:
    四十一:HTML5之HTML5属性变化之input新增类型
    四十:HTML5之HTML5标签变化之删除的标签和重定义的标签
    三十九:HTML5之HTML5标签变化之新增的其他标签和简单的使用示例
    三十八:HTML5之HTML5标签变化之新增的web应用标签和简单的使用示例
    三十七:HTML5之HTML5标签变化之新增的多媒体标签和简单的使用示例
    三十六:HTML5之HTML5标签变化之新增的结构标签和简单的使用示例
    三十五:布局之布局小案例
    python初识-day2
    Python初识-day1
    leetcode maximum product subarray
  • 原文地址:https://www.cnblogs.com/rubylouvre/p/1705817.html
Copyright © 2011-2022 走看看