【发布时间】:2010-11-25 18:32:41
【问题描述】:
我正在开发一个使用网络技术开发桌面应用程序的平台。在这样做的过程中,我一直在尝试让一些文档/就绪功能与我将集成到平台中的浏览器一起使用。这就是为什么我之前在 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>
编辑/进一步的想法 在the page linked to by the answer to my previous related question 上,它声明“对于 Firefox 和 Opera,只需简单检查事件类型即可确定它是否为 DOMContentLoaded。Safari 和 IE 将检查文档的就绪状态...。最后,万一一切都失败了,onload 事件将带来在后面。”也许类似于我上面的 setTimeout 的 setInterval 可能是倒数第二个行动方案,然后才将 onload 作为最后的手段?无论如何,使用我选择的可嵌入浏览器,似乎既不支持 DOMContentLoaded 事件,也不支持 document.readyState。
【问题讨论】:
-
您的示例有效,因为(您可能知道)在 div 被解析后调用超时函数,一个更简单的版本是让脚本在 div 之后运行(没有超时)已关闭,不是规范,但所有浏览器都会在继续解析 xml/html 节点之前使 dom 节点可用(或至少在下一个 dom 元素被完全读取和执行之前可用)。
-
我认为您在前 3 小时内得到的答案只阅读了问题的标题。他们都说“不,在 DOM 准备好之前运行脚本很糟糕”。
-
我预计会受到更严厉的对待 ;) 但要确认我的直觉,即使有参考资料显示其他人“打败了我”,这正是我所寻找的,并且让我以一定的信心继续沿着这条道路前进;接下来我将看看 Peppy 或 Sizzle 等 CSS 选择框架是否适用于这个特定的浏览器实现。
标签: javascript dom document-ready onready