0

我正在开发一个包含多个功能的项目,因此我尝试将每个功能组织在一个单独的 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 文件的名称,我什至不知道这是否可能。有任何想法吗?

4

3 回答 3

1

最简单的方法可能是首先包含:

var currentFile;
function getThisFileName() {
  return currentFile;
}

在顶部的每个文件的开头只需执行以下操作:

currentFile = 'thisFileName.js';

但是,这仅在您的代码按顺序执行时才有效,一旦加载了所有文件, currentFile 将始终是最后一个文件的名称。

另一种方法是currentFile在每个文件中的每个函数的开头进行设置。因此,在访问该特定功能时,您可以调用 your getThisFileName(),它会告诉您上次运行的文件或正在运行的当前文件。

不幸的是,这对您的代码本身有一些开销。

于 2013-08-15T17:46:41.447 回答
0

您可以全局声明一个对象,例如:

var scripts = {
    addScript : function(filename) {
        scripts[filename] = {
            loaded : true,
            executed : false
        }
    }
}

然后在每个文件调用的最底部:

scripts.addScript('myFilename.js');

然后在脚本的执行调用结束时:

scripts['myFilename.js'].executed = true;

然后,您可以随时检查scripts特定文件是否已加载/执行。

于 2013-08-15T18:18:52.820 回答
0

以下将为您提供所有脚本作为数组。

var allScripts = document.getElementsByTagName("script");

当前文件将永远是最后一个.. 所以allScripts[allScripts.length-1]会给你当前的 javascript 文件。您可以src从此访问属性。

编辑:这不适用于异步实现。

于 2013-08-15T17:44:36.487 回答