是否正在检查DOM过度杀伤的准备情况?

时间:2009-09-04 20:48:23

标签: javascript dom document-ready onready

我正在开发一个使用网络技术开发桌面应用程序的平台。在这样做的过程中,我一直在尝试使用我将集成到平台的浏览器中的一些文档/就绪功能。这就是我之前在SO上提出这个问题的原因:javascript-framework-that-primarily-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>

编辑/进一步的想法 在the page linked to by the answer to my previous related question它声明“对于Firefox和Opera,事件类型的简单检查将确定它是否是DOMContentLoaded.Safari和IE将检查文档的就绪状态....最后万一其他所有失败,onload事件将带来后方。“也许类似于我的setTimeout的setInterval可能是倒数第二个行动,在依赖onload作为最后的手段之前?无论如何,使用我选择的可嵌入浏览器,DOMContentLoaded事件和document.readyState似乎都不受支持。

3 个答案:

答案 0 :(得分:3)

不,因为当DOM'不易发现'的错误表现出来时,他们会以非常不寻常的方式进行预测并难以预测和追踪方式 - 每个方式(当然)都是浏览器所独有的。

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

作为一个例子,前一段时间我在每个人最喜欢的浏览器中都有一个DOM没有准备好的bug,而不是通过99%的时间完美地工作来表现自己,但如果页面内容中有一个带有src属性的img元素则会导致错误。如果内容中还有一个ul元素,其中包含任意数量的li ...如果这些内容中的任何一个不正确,则不会出错。

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

答案 1 :(得分:3)

你的预感是好的,有条不紊的IMO。但是someone has beat you to the punch already。简短的回答是setTimeout 不是在所有情况下检测DOM准备情况的工作实现。对您感兴趣的浏览器可能没问题,但IE在某些情况下会失败。

您可能会感兴趣的是,Microsoft自己的ASP.NET AJAX框架使用setTimeout技巧来检测DOM准备情况。令人惊讶的是,it fails in certain use cases as well

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

答案 2 :(得分:0)

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