Dojo Ошибка сборки в IE9 при загрузке слоя из заголовка HTML: свойство 'dir' равно undefined

Я создал сборку 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' было undefined в этом конкретном фрагменте кода:

    geom.isBodyLtr = function isBodyLtr(doc) {
        doc = doc || win.doc;
        return (win.body(doc).dir || doc.documentElement.dir 
           || "ltr").toLowerCase() == "ltr";
    };

После некоторого поиска похожих проблем (например: Как предотвратить "Невозможно получить значение свойства dir ': object is 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 Builds...? Что теперь?

Итак, мой вопрос: я что-то не так, или что трюк с HTML-заголовком не гарантированно работает на всех браузерах?

Это моя сборка script config:

'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 > , казалось бы, работал нормально в течение некоторого времени, но оказалось, что мы не можем полагаться на него.