Dojo addOnLoad, но загружен Dojo?

Я столкнулся с тем, что похоже на проблему с курицей и яйцом, и есть то, что я считаю логичным решением. Однако мне пришло в голову, что другие, должно быть, столкнулись с чем-то подобным, поэтому я подумал, что буду плавать там там для масс.

Ситуация заключается в том, что я хочу использовать функцию dojo addOnLoad для очереди на несколько обратных вызовов, которые должны выполняться после завершения выполнения DOM на стороне клиента. Итак, я делаю следующее:

<html>
    <head>
        <script type="text/javascript" src="dojo.xd.js"></script>
        ...
    </head>
    <body>
        ...
        <script type="text/javascript">
            dojo.addOnLoad( ... );
            dojo.addOnLoad( ... );
            ...
        </script>
    </body>
</html>

Теперь проблема заключается в том, что я, кажется, вызываю dojo.addOnLoad, прежде чем вся библиотека dojo была загружена в браузер. Это имеет смысл в некотором смысле, потому что содержимое встроенного SCRIPT должно быть выполнено до загрузки всей DOM (и запускается обратный вызов нормальной загрузки тела).

Мой вопрос в том, что это - мой подход, или было бы более целесообразно зарегистрировать нормальный/стандартный орган для загрузки JavaScript-кода для вызова функции, которая выполняет ту же работу, что и каждый из dojo.addOnLoads в блоке SCRIPT. Конечно, это задает вопрос, почему бы вам тогда использовать dojo.addOnLoad, если вам не гарантировано, что библиотека dojo будет загружена до использования библиотеки?

Надеюсь, эта ситуация имеет смысл для кого-то, кроме меня. Похоже, что кто-то другой столкнулся с этой ситуацией.

Мысли?

С наилучшими пожеланиями, Адам Райс

Ответ 1

Вы делаете это правильно. Внешние файлы Javascript загружаются и выполняются синхронно по порядку, поэтому к моменту, когда он достигнет вашего dojo.addOnLoad( ... ); Dojo, он загрузится. Используйте dojo.addOnLoad вместо window.onload по двум причинам:

  • он срабатывает раньше, потому что он использует DOMContentLoaded
  • он обрабатывает асинхронную загрузку dojo.require, отложив выполнение до тех пор, пока все необходимые сценарии не будут прочитаны.

Объясняется в DojoCampus как (dojo.addOnLoad):

dojo.addOnLoad - фундаментальный аспект использования Dojo. Передача addOnLoad a функция зарегистрирует функцию для когда Dom будет готов. Эта немного отличается от document.ready и body.onload в том, что addOnLoad до тех пор, пока все Dojo.require() (и их рекурсивных зависимостей) загружен до стрельбы.

Ответ 2

Это может не иметь ничего общего с вашей проблемой, но у меня только что был случай, когда у меня были те же симптомы. Для меня все отлично работало для Firefox, Chrome и т.д., Но не для IE8.

Я получал то, что выглядело как dojo не загружалось, ошибка в IE8, в которой говорилось, что dojo был undefined (но не все время), и я мог бы разделить все до таблиц стилей и импортировать dojo и все равно получите ошибку.

Я запускал локальный сервер разработки движка Google. Это похоже на pythons SimpleHTTPServer, который, в свою очередь, использует SocketServer.BaseServer. У этого есть BaseServer.request_queue_size, который по умолчанию имеет значение 5 - я не мог найти что-либо в движке приложения, которое перегружает это значение, поэтому я предполагаю, что сервер движка разработки Google имеет верхний предел из 5 подключений.

Использование regedit и переход на HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings

"MaxConnectionsPerServer" = DWORD: 00000010 "MaxConnectionsPer1_0Server" = DWORD: 0000010

Это показывает, что IE собирается попытаться открыть до 10 одновременных соединений. Я отредактировал эти два ключа и сделал их 2 и перезапустил компьютер, проблема исчезла.