Как предотвратить "Невозможно получить значение свойства" dir ": объект имеет значение null или undefined" при загрузке страниц в IE9

У меня есть приложение 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 сделает это.

Ответ 1

Мне пришлось переместить встроенную часть script после тега </body>.

Ответ 2

вы можете управлять выполнением функции готовности, добавив число перед фактической функцией:

    ready(999999,function() {
        package.init();
    });

Маленькие цифры означают раннее исполнение, большое количество позднего исполнения!

Вложенная функция готова в готовой функции. Я не думаю, что их можно использовать таким образом...