如何从当前源文件的工作目录加载javascript源代码?
我有一个CGI应用程序,它已经正常工作了很长一段时间,但最近坏了,显然是因为加载js脚本的规则发生了变化。我使用的解决方案是从外部源有条件地加载js代码。我的代码版本如下所示:如何从当前源文件的工作目录加载javascript源代码?,javascript,Javascript,我有一个CGI应用程序,它已经正常工作了很长一段时间,但最近坏了,显然是因为加载js脚本的规则发生了变化。我使用的解决方案是从外部源有条件地加载js代码。我的代码版本如下所示: function load_external_js(s) { // usage: load_external_js({src:"http://foo.com/bar.js", // element:"head",type:"text/javascript"});
function load_external_js(s) {
// usage: load_external_js({src:"http://foo.com/bar.js",
// element:"head",type:"text/javascript"});
// ... defaults (the values shown above) are provided for element and type
// http://stackoverflow.com/a/15521523/1142217
// src can be a url or a filename
var js = document.createElement("script");
js.src = s.src;
js.type = (typeof s.type === 'undefined') ? 'text/javascript' : s.type;
var element = (typeof s.element === 'undefined') ? 'head' : s.element;
var e = document.getElementsByTagName(element)[0];
e.appendChild(js);
// BUG -- no error handling if src doesn't exist
}
load_external_js({src:"/js/3.0.4/mathjax_config.js"});
我遇到的问题似乎与浏览器或服务器在此上下文中如何解析相对文件路径有关。我当时所做的是:
load_external_js({src:"foo.js"});
这用于从调用js脚本所在的目录加载foo.js
,该目录类似于/var/www/html/js/3.0.4
。但最近这种行为发生了变化,在目录/usr/lib/cgi-bin/myapp
中搜索该文件,可能是因为html是由cgi脚本生成的。我可以这样硬编码目录:
function load_external_js(s) {
// usage: load_external_js({src:"http://foo.com/bar.js",
// element:"head",type:"text/javascript"});
// ... defaults (the values shown above) are provided for element and type
// http://stackoverflow.com/a/15521523/1142217
// src can be a url or a filename
var js = document.createElement("script");
js.src = s.src;
js.type = (typeof s.type === 'undefined') ? 'text/javascript' : s.type;
var element = (typeof s.element === 'undefined') ? 'head' : s.element;
var e = document.getElementsByTagName(element)[0];
e.appendChild(js);
// BUG -- no error handling if src doesn't exist
}
load_external_js({src:"/js/3.0.4/mathjax_config.js"});
但这是丑陋的,我必须有一些机制来设置版本号。纯js中是否有某种方法可以做到这一点,以便从调用脚本所在的目录加载脚本?谷歌搜索已经找到了很多关于node.js或jquery的答案,但我没有使用它们。如果你也可以访问
html
标记,试着使用元素或简单地使用document.baseURI
并自己构建完整路径。如果不复制你正在使用的设置,很难测试这一点,但根据我的经验,这应该很有效:
var load_external_js = (function () {
var base = document.currentScript.src;
var a = document.createElement('a');
a.href = base.split('/').slice(0, -1).join('/') + '/';
var resolve = function (src) {
var a = this.cloneNode();
a.href += src;
return a.href;
}.bind(a);
return function (s) {
// usage: load_external_js({src:'http://foo.com/bar.js',
// element:'head',type:'text/javascript'});
// ... defaults (the values shown above) are provided for element and type
// http://stackoverflow.com/a/15521523/1142217
// src can be a url or a filename
var js = document.createElement('script');
js.src = resolve(s.src); // relative to <script> this is closure is in
js.type = (typeof s.type === 'undefined') ? 'text/javascript' : s.type;
var element = (typeof s.element === 'undefined') ? 'head' : s.element;
var e = document.getElementsByTagName(element)[0];
e.appendChild(js);
};
})();
var load\u external\u js=(函数(){
var base=document.currentScript.src;
var a=document.createElement('a');
a、 href=base.split('/').slice(0,-1).join('/')+'/');
变量解析=函数(src){
var a=this.cloneNode();
a、 href+=src;
返回a.href;
}.约束(a);
返回函数{
//用法:load_external_js({src:'http://foo.com/bar.js',
//元素:'head',类型:'text/javascript'});
//…为元素和类型提供了默认值(如上所示的值)
// http://stackoverflow.com/a/15521523/1142217
//src可以是url或文件名
var js=document.createElement('script');
js.src=resolve(s.src);//与此相关的是闭包在
js.type=(typeof s.type=='undefined')?'text/javascript':s.type;
var element=(typeof s.element=='undefined')?'head':s.element;
var e=document.getElementsByTagName(元素)[0];
e、 儿童(js);
};
})();
我认为这没有帮助。在我的情况下,document.baseURI给出了我不想要的目录。您可能错过了返回的functionha的s
输入参数,我需要知道的是document.currentScript.src。谢谢