Как предотвратить ошибку "Невозможно получить значение свойства" 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();
});
Маленькие числа означают раннее исполнение, большие числа - позднее исполнение!
Вы вложили готовую функцию в готовую функцию. Я не думаю, что их можно использовать таким образом...