Сбой сборки Dojo в IE9 при загрузке слоя из заголовка HTML: свойство 'dir' не определено
Я сделал сборку Dojo, но я хотел гибкости при включении / отключении сборки, поэтому я попытался загрузить в <script>
теги в заголовке HTML:
<script src="js/config.js"></script>
<script src="/dojo/1.9/dojo/dojo.js" data-dojo-config="async: true"></script>
<script src="/dojo/1.9/dojo/dojo-all.js"></script>
и я оставил свой файл JS без изменений. Кажется, он работает, но была проблема, но только в IE9 и только в версии приложения, развернутой в WebSphere (я тестировал на Apache2). Проблема была в том, что свойство 'dir' было неопределенным в этом конкретном фрагменте кода:
geom.isBodyLtr = function isBodyLtr(doc) {
doc = doc || win.doc;
return (win.body(doc).dir || doc.documentElement.dir
|| "ltr").toLowerCase() == "ltr";
};
После некоторого поиска похожих проблем (таких как: Как предотвратить ошибку "Невозможно получить значение свойства" dir ": объект имеет значение null или undefined" при загрузке страниц в IE9), я обнаружил, что это может быть некоторая последовательность загрузки проблема. Я удалил слой из заголовка HTML и загрузил его в свой JS в следующей последовательности:
require(["dojo/domReady!"], function(){
// load the layers, but only after document is ready
require(['dojo/dojo-all'], function(){
require(["dojo", "dojo/on", "dojo/dom-attr", "dojo/dom-class", (... and hundred more)
Однако я знаю, что люди загружают сборки в заголовке HTML, например, из темы здесь: Сборки Dojo...? Что теперь?
Итак, мой вопрос, я делаю что-то не так, или этот трюк с заголовком HTML не гарантированно работает во всех браузерах?
Это моя конфигурация сценария сборки:
'dojo/dojo': {
include: ['dojo/dojo', 'dojo/domReady', 'dojo/_base/declare'],
boot: true,
customBase: true
},
'dojo/dojo-all': {
include: ["dojo/on", "dojo/dom-attr", "dojo/dom-class", "dojo/query", "dojo/_base/lang", "dojo/request/xhr",
"dijit/registry","dijit/form/TextBox", "dijit/form/Textarea", "dijit/form/ComboBox", "dijit/form/FilteringSelect", "dijit/form/CheckBox", "dijit/form/Button",
"gridx/core/model/cache/Sync", "gridx/Grid", "gridx/modules/SingleSort", "gridx/modules/ColumnResizer",
(...and hundred more)],
boot: false, // exclude bootstrap modules
customBase: false
},
и это build.bat из dojo:
java -Xms256m -Xmx256m -cp "%~dp0../shrinksafe/js.jar";"%
~dp0../closureCompiler/compiler.jar";"%~dp0../shrinksafe/shrinksafe.jar"
org.mozilla.javascript.tools.shell.Main "%~dp0../../dojo/dojo.js"
baseUrl="%~dp0../../dojo" load=build %*
1 ответ
У нас недавно была такая же проблема с порядком загрузки файлов слоев. Чтобы заставить его работать с IE9, вам действительно нужно взять под контроль порядок загрузки файлов слоев, так что да, самый простой и надежный подход - это require
ваши файлы слоев, а не с помощью <script>
загрузить их.
Посмотрите на образец внизу этой страницы, который содержит требование, вложенное в другое требование:
http://www.sitepen.com/blog/2012/06/11/dgrid-and-dojo-nano-build/
Мы только что сделали точно такие же изменения в продукте, чтобы избежать случайных сбоев в IE9 и IE10 (с 7-слойными файлами, один из которых должен был переопределить более старую версию модуля, определенного в одном из других). <script
> Казалось, какое-то время работало нормально, но оказалось, что мы не можем на это полагаться.