Ответ 1
Мне пришлось переместить встроенную часть script после тега </body>
.
У меня есть приложение Dojo 1.7.4, которое получает "Невозможно получить значение свойства" dir ": object is null или undefined" при загрузке страниц в IE9.
Я использую сборку AMD, и ошибка не возникает, когда она должна загружать все файлы по отдельности.
Весь код, который я контролирую, завернут в dojo/ready и dom/domReady! звонит в точку паранойи.
При возникновении ошибки, и я поймаю ее с помощью отладчика IE9, а стек вызовов обнаруживает, что ошибка возникает при вызове isBodyLtr, но верхняя часть стека вызовов равна nls/synapse_en-gb.js. Файл nls/synapse_en-gb.js представляет собой файл компиляции nls со всеми трансами en-gb, используемыми приложением.
Кажется, что это загружается благодаря тому, что "en-gb" является моей единственной записью локали в моем dojoConfig, и у меня нет контроля, чтобы убедиться, что она также завернута в dojo/ready или dojo/domReady!.
Вот пример кода в моем HTML, который загружает пакет Dojo.
Любые указатели на предотвращение запуска файла перевода до полной загрузки файлов dom и оставшихся Dojo?
<script type="text/javascript">
//<![CDATA[
var dojoConfig = {
async: true,
parseOnLoad: true,
isDebug: true,
locale: "en-gb",
baseUrl: "/synapse/js/dojo/dojo/",
paths: {"synapse": "../../synapse"}
};
//]]>
</script>
<script type="text/javascript" src="/synapse/js/dojo/dojo/dojo.js"></script>
<script type="text/javascript">
//<![CDATA[
require(['dojo/ready', 'synapse/synapse', 'dojo/domReady!'], function(ready) {
ready(function () {
require(['dojo/ready', 'synapse/overlay','dojo/domReady!'], function (ready, package) {
ready(function() {
package.init();
});
});
});
});
//]]>
Обновление: 17 апреля 2013 г. Чтобы попытаться выяснить, какие вызовы функций находятся в трассировке стека, я загрузился из dojo.js.uncompress.js.
Это показывает мне, что nls/synapse_en-gb.js является точкой входа, с вызовами var def = function()
(которая открывается в глобальном пространстве имен как define
, затем checkComplete
, затем execModule
и так д.
Поскольку это, кажется, выполняется до того, как DOM загружен, мне нужно найти способ гарантировать, что nls/synapse_en-gb.js не будет запущен до загрузки DOM.
Глядя на мой сгенерированный synapse/synapse.js, в базе есть функция * now, которая, как представляется, предварительно загружает файл файлов i18n. то есть.
"*now":function(r){
r(["dojo/i18n!*preload*synapse/nls/synapse*[\"ar\",\"ca\",\"cs\",\"da\",\"de\",\"el\",\"en-gb\",\"en-us\",\"es-es\",\"fi-fi\",\"fr-fr\",\"he-il\",\"hu\",\"it-it\",\"ja-jp\",\"ko-kr\",\"nl-nl\",\"nb\",\"pl\",\"pt-br\",\"pt-pt\",\"ru\",\"sk\",\"sl\",\"sv\",\"th\",\"tr\",\"zh-tw\",\"zh-cn\",\"ROOT\"]"]);
}
Мне может потребоваться переместить всю загрузку Dojo до тех пор, пока не будет намного больше шансов на загрузку DOM, прежде чем Dojo сделает это.
Мне пришлось переместить встроенную часть script после тега </body>
.
вы можете управлять выполнением функции готовности, добавив число перед фактической функцией:
ready(999999,function() {
package.init();
});
Маленькие цифры означают раннее исполнение, большое количество позднего исполнения!
Вложенная функция готова в готовой функции. Я не думаю, что их можно использовать таким образом...