Я сделал фреймворк пространств имен для javascript. Я загружаю некоторые плагины (файлы .js), которые динамически добавляются в HTML.
Я собираюсь попытаться упростить код.
Эта функция используется для динамической загрузки JS. Функция обратного вызова вызывается после загрузки файла .js. Учтите, что следующий код уже был выполнен.
MYNAMESPACE.plugins = ["plugin1", "plugin2"];
MYNAMESPACE.getJS = {
get: function (url, callback) {
var script = document.createElement("script");
var head = document.getElementsByTagName('head')[0];
script.type = "text/javascript";
script.src = url;
head.insertBefore(script, head.firstChild)
script.onload = callback;
script.onreadystate = callback;
return script;
}
};
У меня есть функция init, которая загружает плагины, содержащиеся в MYNAMESPACE.plugins, следующим образом:
MYNAMESPACE.init = function (callback) {
for (index in MYNAMESPACE.plugins) {
plugin = MYNAMESPACE.plugins[index];
MYNAMESPACE.getJS.get(plugin + '.js', function ()
{
// This callback is executed when the js file is loaded
});
}
// Here I want to execute callback function, but after all the callbacks in the for loop have been executed. Something like: if (alljsloaded) callback();
}
В моем HTML у меня есть следующий тег script:
<html>
<head>
<script type="text/javascript">
$(document).ready(function () {
MYNAMESPACE.init();
// The following line is not executed correctlybecause init finished before the scripts are loaded and the functionOnPlugin1 is undefined.
MYNAMESPACE.functionOnPlugin1();
});
</script>
</head>
<body>
</body>
</html>
И я хочу изменить это на что-то вроде этого:
<html>
<head>
<script type="text/javascript">
$(document).ready(function () {
MYNAMESPACE.init(function() { MYNAMESPACE.functionOnPlugin1(); });
});
</script>
</head>
<body>
</body>
</html>
Но я не знаю, как изменить функцию MYNAMESPACE.init (), чтобы она выполняла обратный вызов после загрузки ВСЕХ скриптов плагина.
Есть идеи? Возможно, используя замыкания.