如何防止“无法获取属性值”'dir':对象为空或未定义&;在IE9中加载页面时出现错误

How to prevent "Unable to get value of the property 'dir': object is null or undefined" error when loading pages in IE9

本文关键字:IE9 未定义 加载 错误 对象 获取 何防止 属性 dir      更新时间:2023-09-26

我有一个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翻译的应用程序。

这似乎是通过"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();
        });
    });
});
});
//]]>

更新日期: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 files文件。例如

"*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做它的事情。

您可以通过在实际函数前添加一个数字来控制ready函数的执行:

    ready(999999,function() {
        package.init();
    });

数字小意味着早执行,数字大意味着晚执行!

你在ready函数中嵌套了一个ready函数。我认为他们不应该那样使用……

我最终不得不将脚本的内联部分移动到</body>标记之后。