如何在IE9加载页面时避免“无法获取属性'dir'的值:对象为null或未定义”的错误。

3
我有一个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文件之前运行?
<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已经被加载完毕。

2个回答

2
您可以通过在实际函数之前添加一个数字来控制ready函数的执行:
    ready(999999,function() {
        package.init();
    });

小的数字表示早期执行,大的数字表示晚期执行!

您已经将一个ready函数嵌套到另一个ready函数中。我不认为它们应该被这样使用...


嵌套是为了确保从synapse/synapse包中加载synapse/overlay,但代码没有执行到那一步。似乎在运行nls/synapse_en-gb.js时停止了,并且我似乎无法控制该文件的加载。因此,我正在寻找如何确保dom在运行nls/synapse_en-gb.js之前已加载,以避免在IE9中出现错误的指针。 - Reuben
你试过我的建议,使用一个高值吗? - Lucian Depold
是的,我试过了,但没有成功。我打算尝试构建一个不混淆函数调用的包,这样我就可以在堆栈跟踪中看到这些函数。 - Reuben

2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接