我有一个Dojo 1.7.4应用程序,当在IE9中加载页面时,该应用程序出现“无法获取属性’dir’的值:对象为null或未定义”的错误.
我使用的是AMD版本,当必须分别加载所有文件时,不会发生该错误.
我控制的所有代码都包装在dojo / ready和dom / domready中!呼吁偏执狂.
当发生错误时,我用IE9调试器捕获了该错误,并且调用堆栈显示在调用isBodyLtr时发生了错误,但是调用堆栈的顶部是nls / synapse_en-gb.js. nls / synapse_en-gb.js文件似乎是带有应用程序使用的所有en-gb转换的编译nls文件.
这似乎是由于将“ en-gb”作为我的dojoConfig中唯一的语言环境条目而被加载的,而且我似乎没有控制权以确保也将其包装在dojo / ready或dojo / domready!中.
是否有任何指针可以防止翻译文件在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之前就已运行,因此我需要找到一种方法来确保在加载DOM之前不运行nls / synapse_en-gb.js.
查看我生成的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加载,直到之后才这样做,因此在dojo这样做之前,很有可能已经加载了DOM.
解决方法:
您可以通过在实际函数之前添加一个数字来控制ready函数的执行:
ready(999999,function() {
package.init();
});
小数字表示早执行,大数字表示晚执行!
您已将ready函数嵌套在ready函数中.我不认为以这种方式使用它们的想法…
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。