我有一个Dojo 1.7.4应用程序,在IE9中加载页面时出现“无法获取属性'dir'的值:对象为空或未定义”的错误。
我正在使用AMD构建,在必须单独加载所有文件时不会发生错误。
所有我可以控制的代码都包裹在dojo/ready和dom/domReady!调用中,非常小心谨慎。
当错误发生时,并且我使用IE9调试器捕获它时,调用堆栈显示当调用isBodyLtr时出错,但是调用堆栈的顶部是nls/synapse_en-gb.js。 nls/synapse_en-gb.js文件似乎是编译nls文件,其中包含应用程序使用的所有en-gb翻译。
这似乎是因为我的dojoConfig中只有"en-gb"作为区域设置条目而被加载,而我似乎无法确保它也被包裹在dojo/ready或dojo/domReady!中。
以下是在我的HTML中引导Dojo包的示例代码。
有何提示可以防止翻译文件在完全加载dom和其余Dojo文件之前运行?
我正在使用AMD构建,在必须单独加载所有文件时不会发生错误。
所有我可以控制的代码都包裹在dojo/ready和dom/domReady!调用中,非常小心谨慎。
当错误发生时,并且我使用IE9调试器捕获它时,调用堆栈显示当调用isBodyLtr时出错,但是调用堆栈的顶部是nls/synapse_en-gb.js。 nls/synapse_en-gb.js文件似乎是编译nls文件,其中包含应用程序使用的所有en-gb翻译。
这似乎是因为我的dojoConfig中只有"en-gb"作为区域设置条目而被加载,而我似乎无法确保它也被包裹在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();
});
});
});
});
//]]>
更新:2013年4月17日 为了尝试找出堆栈跟踪中的函数调用,我从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加载放到after后面,以便更有机会在dojo执行之前DOM已经被加载完毕。