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

У меня есть приложение Dojo 1.7.4, которое получает ошибку "Невозможно получить значение свойства" dir ": объект является нулевым или неопределенным" при загрузке страниц в 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\"]"]);
}

Я могу в конечном итоге переместить всю загрузку додзё до тех пор, так что есть гораздо больше шансов, что DOM будет загружен, прежде чем додзё сделает это.

2 ответа

Решение

В конечном итоге мне пришлось переместить встроенную часть сценария в после </body> тег.

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

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

Маленькие числа означают раннее исполнение, большие числа - позднее исполнение!

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

Другие вопросы по тегам