是否正在检查DOM过度使用的准备情况?

我正在开发一个使用Web技术开发桌面应用程序的平台。 在这样做的过程中,我一直在努力获得一些与浏览器配合使用的文档/准备就绪功能,我将集成到该平台中。 这就是为什么我以前在SO上问过这个问题:javascript-framework-that-mainly-provides-just-document-onready-functionality

然而,我无法获得我选择的浏览器(嘘,它的秘密;)成功地利用上述唯一的答案建议的功能。 所以,在试图弄清楚可能会发生什么的过程中,我偶然发现了以下情况。

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

不过,我决定看看它是否可以在标准浏览器中正常工作,而且令我惊讶的是,它确实如此! 鉴于此,我的问题是:各种Javascript框架提供的dom / readyiness功能的各种实现,只是矫枉过正?

<!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都不受支持。


你的直觉是良好的和良好的海事组织。 但有人已经打败你了。 简单的答案是setTimeout不是在所有情况下检测DOM准备情况的工作实现。 对于感兴趣的浏览器也许可以,但IE在某些情况下会失败。

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

简而言之,这个问题似乎出现在IE加载速度较慢的脚本中,这可能是由于文件较大(例如〜500K)或网络/服务器延迟造成的。


不,因为当DOM'unreadiness'错误出现时,他们会以非常不寻常的方式这样做,难以预测和追踪方式 - 每一个(当然)对于浏览器来说都是独一无二的。

仅仅完全避免这些问题并且知道你总是要处理一个准备好的DOM会容易得多。

举个例子,前一段时间,我在每个人最喜欢的浏览器中都有一个DOM没有准备好的bug,而不是99%的时间都完美地工作,但是如果页面内容中有一个带有src属性的img元素,内容也有一个ul元素,其中包含任意数量的li's ...如果其中任何一个都不是真的,那么它不会有问题。

对我来说, 现在很容易说'哦,这是一个DOM问题',但在当时......不,并不那么容易。


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

链接地址: http://www.djcxy.com/p/12299.html

上一篇: Is checking for the readiness of the DOM overkill?

下一篇: how to call a function when the page/DOM is ready for it