原文:javascript中外部js文件取得自身完整路径得办法
有时候我们需要引入一个外部js文件,这个js文件又需要用到自己的路径或者是所在的目录,别问怎么又这么变态的需求,开发做久了各种奇葩需求也就有了!
有人第一时间想到的是location.href,可是哥哥,那个引用页面的路径啊。比如a.html:
<html>
<script src="/b/c.js"></script>
</html>
这样的话我们用location.href获取到的值是a.html文件本身的路径,并不是我们需要的c.js的路径。
那怎么办?
我先开始想到了一个方法,就是通过js的文件名去匹配,比如我写一个插件叫做dragondean.js,那么我可以将引用页(a.html)中所有的script标签获取到,然后通过匹配src属性中是否含有dragondean来获得我们需要的js文件路径。
但是这样一来就有问题了:
1.我们的插件dragondean.js在使用的时候不能被更名。
2.一个插件的js文件重复引用会导致错误
这种方式总是没有一种踏实的感觉...
后来.....我看了一片文章:http://blog.sina.com.cn/s/blog_715fa5c00100pwrj.html
里面提到的思路用到了浏览器对网页加载顺序的一个技巧,经过测试确实可行!
原理就是网页文档在解析的时候一边加载一边解析,当解析到script的时候先下载src中的内容并解析或者解析script中间的内容,然后再往下解析。当解析到当前script的时候我们可以获取已经加载的所有script标签,最后一个就是我们需要得到的这个了。
用到的方法代码如下:
获取自身的完整路径:
function getMySrc(){
var scriptSrc = document.getElementsByTagName('script')[document.getElementsByTagName('script').length -1].src;
return scriptSrc;
}
获得自身的文件名:
function getMyScriptName(){
var scriptSrc = document.getElementsByTagName('script')[document.getElementsByTagName('script').length -1].src;
var jsName = scriptSrc.split('/')[scriptSrc.split('/').length-1];
return jsName;
}
获得自身所在的目录路径:
function getMyPath(){
var scriptSrc = document.getElementsByTagName('script')[document.getElementsByTagName('script').length -1].src;
var jsName = scriptSrc.split('/')[scriptSrc.split('/').length-1];
return scriptSrc.replace(jsName,'');
}
这些内容都是借鉴的前面那篇博文的,只不过做了一个细化!再次感谢原文作者!