Dojo addOnLoad, но загружен ли Dojo? - PullRequest
11 голосов
/ 22 января 2009

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

Ситуация такова, что я хочу использовать функцию addOnLoad dojo, чтобы поставить в очередь ряд обратных вызовов, которые должны быть выполнены после того, как 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 будет загружена в браузер. В некотором смысле это имеет смысл, поскольку содержимое встроенного сценария должно выполняться до загрузки всего DOM (и запускается нормальный обратный вызов тела при загрузке).

У меня такой вопрос: является ли мой подход подходящим, или было бы более целесообразно зарегистрировать нормальный / стандартный вызов JavaScript для загрузки тела для вызова функции, которая выполняет ту же работу, что и каждый из dojo.addOnLoads СЦЕНАРИЙ блок. Конечно, возникает вопрос: зачем вам тогда использовать dojo.addOnLoad, если вы не уверены, что библиотека Dojo будет загружена до ее использования?

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

Мысли

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

Ответы [ 2 ]

12 голосов
/ 23 января 2009

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

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

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

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

0 голосов
/ 28 марта 2010

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

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

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

Использование regedit и переход на HKEY_CURRENT_USER \ Программное обеспечение \ Microsoft \ Windows \ CurrentVersion \ Internet Settings

«MaxConnectionsPerServer» = DWORD: 00000010 «MaxConnectionsPer1_0Server» = DWORD: 0000010

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

...