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