3

我正在开发一个使用 Web 技术开发桌面应用程序的平台。在此过程中,我一直在尝试让一些文档/就绪功能与我将集成到平台中的浏览器一起使用。这就是为什么我之前在 SO 上问过这个问题:javascript-framework-that-primarily-provides-just-document-onready-functionality

但是,我无法让我选择的浏览器(嘘,这是一个秘密;)成功利用该浏览器建议的功能,并且只能回答上述问题。所以,在试图弄清楚什么可能有效的过程中,我偶然发现了以下内容。

下面的代码在我正在使用的浏览器中具有相同的效果,只需在 1 毫秒超时后执行一个函数:我可以在加载大图像时写入 DOM。这对我来说可能不是最终的解决方案,我可能会写一些特定于这个浏览器的 Javascript 引擎如何实现 DOM 功能的东西。

尽管如此,我还是决定看看这是否适用于标准浏览器,令我惊讶的是,它确实有效!有鉴于此,我的问题是:各种 Javascript 框架提供的 dom/readiness 功能的各种实现,只是矫枉过正吗?

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script>
setTimeout(function() {
    var txtNode = document.createTextNode("ready_yet?");
    var ready_yet_el = document.getElementById("ready_yet");
    ready_yet_el.appendChild(txtNode);
},1);
</script>
</head>

<body>
<div id="ready_yet"></div>
<img src="http://www.ryanmorr.com/tests/ondomready/pic.jpg" />
</body>

</html>

编辑/进一步的想法在我之前相关问题的答案所链接的页面上,它指出“对于 Firefox 和 Opera,事件类型的简单检查将确定它是否为 DOMContentLoaded。Safari 和 IE 将检查文档的就绪状态...... .最后,万一所有其他方法都失败了,onload 事件将出现在后面。” 也许类似于我上面的 setTimeout 的 setInterval 可能是倒数第二个行动方案,然后才将 onload 作为最后的手段?无论如何,使用我选择的可嵌入浏览器,似乎既不支持 DOMContentLoaded 事件,也不支持 document.readyState。

4

3 回答 3

4

你的预感很好,而且有充分的依据 IMO。但是已经有人打败了你。简短的回答是,这不是setTimeout在所有情况下检测 DOM 就绪的有效实现。您感兴趣的浏览器可能没问题,但 IE 在某些情况下会失败。

您可能会感兴趣的是,Microsoft 自己的 ASP.NET AJAX 框架使用该setTimeout技巧来检测 DOM 准备情况。惊喜,惊喜:它在某些用例中也失败了

简而言之,问题似乎在于加载脚本缓慢的 IE,这可能是由于文件大小(例如 ~500K)或网络/服务器延迟所致。

于 2009-09-05T00:09:21.120 回答
3

不,因为当 DOM 的“未就绪”错误出现时,它们会以非常不寻常且难以预测和追踪的方式出现——每个(当然)对于它发生的浏览器来说都是独一无二的。

完全避免这些问题并知道您将始终处理准备好的 DOM 会容易得多。

例如,不久前,我在每个人最喜欢的浏览器中遇到了一个 DOM 未就绪的错误,它通过 99% 的时间完美地表现出来,但是如果页面内容中有一个带有 src 属性的 img 元素并且如果content 也有一个 ul 元素,其中包含任意数量的 li...如果其中任何一个不是真的,它不会出错。

我现在很容易说“哦,这是一个 DOM 问题”,但当时……不,没那么容易。

于 2009-09-04T20:53:56.577 回答
0

简单地说,没有。连接速度较慢且要加载多个文件的人不会欣赏他们的浏览器尝试在尚不存在的元素上运行脚本。

于 2009-09-04T20:56:03.360 回答