Как обеспечить правильную загрузку динамических файлов JavaScript?

У меня есть приложение, в котором сгенерированные HTML-страницы указывают один файл JavaScript:

<script language="JavaScript" src="/global.js"></script>

В global.js находится следующий код для загрузки одного пользовательского файла user.js:

var UserJsFile = document.createElement("script");
UserJsFile.type = "text/javascript";
UserJsFile.src = "/user.js";
document.getElementsByTagName("head")[0].appendChild(UserJsFile);

// Add default onLoad handler
window.onload = global_onLoad;

// Global onLoad function
function global_onLoad(){
    submitdisabled = false;
    user_onLoad();
    document.forms[0].onsubmit = global_onSubmit;
}

а в user.js есть аналогичный код, позволяющий пользователю указать несколько пользовательских JS-файлов:

// Define all user-defined JavaScript sub-files
var UserJsFiles = [];
UserJsFiles[0] = "install.js";
UserJsFiles[1] = "complex.js";
UserJsFiles[2] = "gravis.js";
UserJsFiles[3] = "locator.js";
UserJsFiles[4] = "locator_x.js";

// Load all the user-defined JavaScript sub-files
for (i=0; i<UserJsFiles.length; i++) {
    var UserJsFile = document.createElement("script");
    UserJsFile.type = "text/javascript";
    UserJsFile.src = UserJsFiles[i];
    document.getElementsByTagName("head")[0].appendChild(UserJsFile);
}
// Perform any user-defined onLoad functionality
function user_onLoad() {
    // user code goes here
    return;
}

Проблема, которую я получаю, заключается в том, что после запуска кода в global.js (для присоединения user.js) страница, кажется, думает, что она загружена (даже если не все пользовательские файлы JS были прикреплены/загружены), поэтому он запускает global_onLoad(), который терпит неудачу, потому что он вызывает user_onLoad(), который может вызывать определенные пользователем функции onLoad в некоторых других файлах...

По крайней мере, я думаю, что происходит...

Я что-то упустил? Присоединение каждого определяемого пользователем JS-файла в качестве элемента DOM происходит асинхронно?

Обратите внимание, что мои пользователи не могут использовать JQuery или любую другую среду JS, поэтому, если у меня есть проблема, мне нужно решить ее с помощью простого JS...


person roryhewitt    schedule 23.02.2010    source источник
comment
global.js определяет global_onLoad после того, как присваивает его window.onload. Вызывается ли global_onLoad? Какие сообщения об ошибках вы получаете?   -  person Sean Hogan    schedule 24.02.2010
comment
Да, global_onLoad вызывается, как и user_onLoad, но некоторые функции, вызываемые user_onLoad, не вызываются — предположительно, потому, что JS-файлы, в которых они определены, загружены не полностью. Однако, если я обновлю страницу, все файлы JS будут полностью загружены, поэтому все работает правильно.   -  person roryhewitt    schedule 25.02.2010