2009-12-21 64 views
2

我遇到了Firefox和Dojo的奇怪行为。我有在<头>节这几行HTML页面:dojo.require()阻止Firefox呈现页面

... 
<script type="text/javascript" src="dojo.js" djconfig="parseOnLoad: true, locale: 'de'"></script> 
<script type="text/javascript"> 
    dojo.require("dojo.number"); 
</script> 
... 

有时在页面加载正常。但有时它不会。 Firefox将获取整个html页面,但不会呈现它。我只看到一个灰色的窗户。

经过一番实验后,我发现渲染问题与html的加载时间有关。 Firefox在加载时开始评估html页面。如果页面需要太长的时间才能加载上面的javascript,那么在html完成加载之前将执行该JavaScript。

如果发生这种情况,我会得到灰色的窗口。建议Firefox向我展示页面的源代码将显示正确的完整HTML代码。但是:如果我的页面保存到磁盘(文件 - >页面另存为...),HTML代码将被截断,上述部分将是这样的:

... 
<script type="text/javascript" src="dojo.js" djconfig="parseOnLoad: true, locale: 'de'"></script> 
<script type="text/javascript"> 
    dojo.require("dojo.number"); 
</script></head><body></body></html> 

这就解释了为什么我能看到一个灰色地带。但为什么这个代码出现在那里?我认为Dojo的require()方法做了一些“邪恶”的事情。但我无法弄清楚什么。没有write.document(“</head > <body> </body > </html >”);在Dojo代码中。我检查了它。

如果我放置dojo.require(“dojo.number”),问题将被修复。声明在window.load事件:

<script type="text/javascript"> 
    window.load=function() { 
     dojo.require("dojo.number"); 
    } 
</script> 

但我很好奇为什么会发生这种情况。是否有Javasctript函数强制Firefox停止评估页面? Dojo会做一些“坏”的事吗?任何人都可以向我解释这种行为吗?

编辑:Dojo 1.3.1,没有JS错误或警告。

+1

您是否尝试安装Firebug并查看页面实际加载的方式?你还在用什么版本的dojo? – Kitson 2009-12-21 22:38:56

+0

除了查看如何在Firebug网络面板中加载页面,您是否尝试过检查是否存在任何JS错误? – Annie 2009-12-21 22:43:11

+0

Firebug让我发现时机会触发它。但没有更多有用的信息。 – 2009-12-21 22:43:19

回答

0

页面的其他部分是什么样的?应该渲染哪些元素不是?你有什么其他的Javascript?

你看起来很好,但是你将无法使用dojo.number中的方法或其他任何通过dojo.require加载的内容,直到页面加载完毕 - 你必须等待window.onload触发,或者使用dojo.addOnLoad()方法触发回调。后者实际上比onload快一点。

dojo.require使用synch xhr来加载阻止浏览器的负载,所以如果负载异常缓慢,您会注意到页面渲染延迟。

+0

正如我写的,页面根本不渲染。在dojo.number中使用方法不是问题。渲染没有延迟。 Firefox只是没有。 – 2009-12-22 09:50:21

+1

是的,但它可能有助于了解页面上还有哪些内容,或者生成此行为的最简单可能的顺序。这个片段不仅需要重现这个问题,还必须发挥一些互动作用。 – peller 2009-12-22 18:06:31

0

我认为这是Firefox中的一个渲染错误,我在许多上下文中看到,其中一个公共因素是浏览器加载页面中加载的所有资源所需的时间。头脑中需要花费很长时间才能通过网络或eval请求的脚本越多,碰到的机会就越高。使用热缓存打印页面显着降低了遇到绘制错误的可能性。减轻它的另一种方法是将JavaScript放在最后,这也是一个最佳实践,因为它不会立即阻止浏览器预览标记。

关于使用dojo的具体情况,常见用例包括运行onload,如创建和启动小部件。如果您在使用dojo模块(如widget)的onload处理程序中有代码,请粘贴dojo。在onload处理程序中需要语句,而不是在onload处理程序之前。如果您以后不需要它,那么承受性能损失或阻止最初的UI渲染毫无意义。然后构建自定义的dojo图层以包含最小的核心(可能是一个自定义的基础,使其更小)以及另外90%的需求。在头部加载最小的核心层(以获得dojo.addOnLoad等),然后在主体的末端加载其他层。如果您生活在一个模块化应用程序框架中,根据您所在的页面,应用程序在页面内容区域中来来去去,每个应用程序应该在其实际引用模块之前立即为其使用的相应dojo模块放置dojo.require语句。

如果您需要立即在内联脚本中使用模块,这将无法正常工作,但如果是这种情况,则自定义dojo构建也将有助于缓解该情况。

我不知道Mozilla的一个报告问题,但是我也在前一段时间在其他浏览器上看到过这种情况。