Dojo addOnLoad,但 Dojo 是不是已加载?

Posted

技术标签:

【中文标题】Dojo addOnLoad,但 Dojo 是不是已加载?【英文标题】:Dojo addOnLoad, but is Dojo loaded?Dojo addOnLoad,但 Dojo 是否已加载? 【发布时间】:2009-01-21 21:48:48 【问题描述】:

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

情况是我想使用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 中的每个 dojo.addOnLoads 所做的工作相同脚本块。当然,这引出了一个问题,如果您不能保证 Dojo 库在使用库之前会被加载,为什么还要使用 dojo.addOnLoad?

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

想法?

最好的问候, 亚当·赖斯

【问题讨论】:

【参考方案1】:

你做得对。外部 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() (和 他们的递归依赖)有 发射前加载。

【讨论】:

【参考方案2】:

这可能与您的问题无关,但我只是遇到了一个我有相同症状的案例。对我来说,一切都适用于 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 并重新启动计算机,问题就消失了。

【讨论】:

以上是关于Dojo addOnLoad,但 Dojo 是不是已加载?的主要内容,如果未能解决你的问题,请参考以下文章

部分刷新触发 XPage 中的 addOnLoad 事件

扩展库中的不可关闭对话框

为啥我不能在 Javascript 中滚动循环?

用dojo检查id是不是存在

Dojo相当于$(document).scrollTop?

Dojo 切换组合按钮