我正在开发一个包含多个功能的项目,因此我尝试在一个单独的JavaScript文件中组织每个功能,以便按需加载代码。我想标准化加载和执行过程,所以我试图开发一个可以加载和执行JavaScript文件的函数,如果它不存在于内存中,或者只是在已经加载的情况下执行它。一种方法是使函数需要两个参数,文件名和入口点函数的名称,然后检查脚本是否已经加载,如果它只是执行入口点函数,或者如果它不是,那么加载脚本并在onload事件上执行入口点函数,这种方法工作正常,但它需要主模块知道所有入口点函数名称,这在将来可能会变得痛苦,因为粗心的程序员可能无意中复制了一个函数名。一个更清洁,更安全的方法是命名" main"所有的入口点函数,并在第一次执行时关联" main"到它的脚本DOM对象......或多或少是这样的:
加载模块:
function(){
function main(){
.
. some code here
.
}
Install(getThisFileName(),main);
}();
主要模块:
function Load(fn){
var el,ff,i
el = document.getElementsByTagName("script");
ff = "http://"+window.location.host+fn;
for(i=el.length-1;i>=0;i--){
if(el[i] && el[i].src==ff){
el[i].Main();
return;
}
}
el = document.createElement("script");
el.type = "text/javascript";
el.src = ff;
}
function Install(ff,ep){
var el,i;
el = document.getElementsByTagName("script");
for(i=el.length-1;i>=0;i--){
if(el[i] && el[i].src==ff){
el[i].Main = ep;
ep();
return;
}
}
}
但是为了做到这一点,我需要知道正在执行的JavaScript文件的名称,我甚至不知道它是否可能。任何想法?
答案 0 :(得分:1)
最简单的方法可能是先包括:
var currentFile;
function getThisFileName() {
return currentFile;
}
在顶部的每个文件的开头,只需执行:
currentFile = 'thisFileName.js';
这只会在你的代码按顺序执行时才有效,一旦加载了所有文件,currentFile将始终是最后一个文件的名称。
另一种方法是在每个文件的每个函数的开头设置currentFile
。因此,在访问该特定功能时,您可以调用getThisFileName()
,它将告诉您上次运行的文件或正在运行的当前文件。
不幸的是,这会对您的代码本身产生一些开销。
答案 1 :(得分:0)
以下内容将为您提供所有脚本作为数组。
var allScripts = document.getElementsByTagName("script");
当前文件将始终是最后一个..所以allScripts[allScripts.length-1]
将为您提供当前的javascript文件。您可以从此处访问src
属性。
编辑: 这对于异步实现不起作用。
答案 2 :(得分:0)
您可以全局声明一个对象,如:
var scripts = {
addScript : function(filename) {
scripts[filename] = {
loaded : true,
executed : false
}
}
}
然后在每个文件调用的最底部:
scripts.addScript('myFilename.js');
然后在脚本的执行调用结束时:
scripts['myFilename.js'].executed = true;
然后,您可以随时检查scripts
以查看是否加载/执行了特定文件。