11

我遇到了看似鸡和蛋的问题,并且有我认为合乎逻辑的解决方案。但是,我突然想到其他人一定遇到过类似的事情,所以我想我会把它浮出水面给大众。

情况是我想使用 dojo 的 addOnLoad 函数来排队一些回调,这些回调应该在 DOM 在客户端完成渲染后执行。所以我正在做的事情如下:

<html>
    <head>
        <script type="text/javascript" src="dojo.xd.js"></script>
        ...
    </head>
    <body>
        ...
        <script type="text/javascript">
            dojo.addOnLoad( ... );
            dojo.addOnLoad( ... );
            ...
        </script>
    </body>
</html>

现在,问题是我似乎在将整个 Dojo 库下载到浏览器之前调用了 dojo.addOnLoad。这在某种程度上是有道理的,因为内联 SCRIPT 内容应该在整个 DOM 加载之前执行(并且触发正常的正文 onload 回调)。

我的问题是 - 我的方法是否合理,或者注册一个普通/标准主体 onload JavaScript 回调来调用一个函数是否更有意义,该函数与每个 dojo.addOnLoads 在 SCRIPT 块中所做的工作相同。当然,这引出了一个问题,如果您不能保证 Dojo 库会在使用库之前被加载,为什么还要使用 dojo.addOnLoad?

希望这种情况对我以外的人有意义。似乎其他人可能遇到过这种情况。

想法?

最好的问候,亚当赖斯

4

2 回答 2

13

你做对了。外部 Javascript 文件按顺序同步加载和执行,因此当它到达您的dojo.addOnLoad( ... );Dojo 时已经加载。使用dojo.addOnLoad而不是有window.onload两个原因:

  • 它触发得更早,因为它利用了DOMContentLoaded
  • 它通过推迟执行来处理异步加载,dojo.require直到已读取所有必需的脚本

在 DojoCampus 中解释为 ( dojo.addOnLoad ):

dojo.addOnLoad 是使用 Dojo 的一个基本方面。传递 addOnLoad 一个函数将注册该函数以在 Dom 准备好时运行。这与 document.ready 和 body.onload 略有不同,因为 addOnLoad 等到所有 dojo.require() (以及它们的递归依赖项)在触发之前都已加载。

于 2009-01-23T16:20:52.540 回答
-5

这可能与您的问题无关,但我只是有一个案例,我有相同的症状。对我来说,一切都适用于 Firefox、Chrome 等,但不适用于 IE8。

我得到了看起来像 dojo 没有被加载的东西,IE8 中的一个错误说 dojo 是未定义的(但不是所有时间),我可以将所有内容简化为样式表并导入 dojo,但仍然得到错误。

我正在运行一个本地谷歌应用引擎开发服务器。这看起来是基于 python 的 SimpleHTTPServer,而后者又使用了 SocketServer.BaseServer。这有 BaseServer.request_queue_size 默认为 5 - 我在应用引擎中找不到任何覆盖这个值的东西,所以我猜开发谷歌应用引擎服务器的上限为 5 个连接。

使用 regedit 并转到 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings

“MaxConnectionsPerServer”=dword:00000010 “MaxConnectionsPer1_0Server”=dword:0000010

这表明 IE 将尝试打开最多 10 个同时连接。我编辑了这两个键并将它们设为 2 并重新启动计算机,问题就消失了。

于 2010-03-28T05:10:05.773 回答