Javascript 我如何知道DOM“;阀体&x201D;元素是否可用?

Javascript 我如何知道DOM“;阀体&x201D;元素是否可用?,javascript,events,dom,onload,Javascript,Events,Dom,Onload,只要bodyDOM节点可用,我就想用JavaScript向其添加一个类。 我希望在加载任何body的子项之前尽快执行此操作 现在,在打开bodytag之后,我正在使用一个内联脚本。有没有一种不那么突兀的方式 我想这在不同的浏览器中会有所不同 一种解决方案可能是测试它,方法是将一个脚本立即放在打开的标记中,然后每隔一段时间运行代码以添加类 <body> <script> function add_class() { if(document.

只要
body
DOM节点可用,我就想用JavaScript向其添加一个类。
我希望在加载任何
body
的子项之前尽快执行此操作


现在,在打开
body
tag之后,我正在使用一个内联脚本。有没有一种不那么突兀的方式

我想这在不同的浏览器中会有所不同

一种解决方案可能是测试它,方法是将一个脚本立即放在打开的
标记中,然后每隔一段时间运行代码以添加类

<body>
    <script>
    function add_class() { 
        if(document.body)
             document.body.className = 'some_class';
        else 
            setTimeout(add_class, 10);  // keep trying until body is available
    }
    add_class();
    </script>

    <!-- rest of your elements-->
</body>

函数add_class(){
if(document.body)
document.body.className='some_class';
其他的
setTimeout(add_class,10);//继续尝试,直到body可用为止
}
添加_类();
jQuery在内部执行类似的操作来处理特定的IE bug

但是,不能保证不会加载子元素,因为这同样取决于特定实现何时使
主体可用


jQuery采用类似的方法,测试其主
jQuery.ready
处理程序中是否存在
body
,如果
body
不可用,则通过
setTimeout
重复调用
jQuery.ready

并查看您的浏览器是否可以在脚本中看到元素顶部的
元素,然后是其他元素。(打开控制台)


不需要控制台。

参加聚会可能有点晚,但

只需点击浏览器渲染周期即可。因此,您不必处理泄漏内存的超时(如果使用不当)


body.onload=function(){…}?body.onload事件是否也会等待子项加载?为什么要这样做?@Xander:您可以使用
js
追加
body{display:none;}
。这是唯一可能的原因吗?@qwertymk:一个页面有多个选项卡,这些选项卡取决于
位置.hash
。通过从一开始就阅读
location.hash
,并设置相应的样式,我能够立即只显示当前的选项卡元素。jQuery根本不做任何类似的事情。@jAndy:是的,在一个特定的情况下,它可以绕过IE bug,在IE bug中显示DOM就绪,而
主体实际上不可用。@jAndy:嗯,这不是IE中缺少的
DOMContentLoaded
事件的实际解决代码。它只是一个顶部检查。@jAndy:是的,这就是我的意思。我不是说这是真正的DOM就绪方法。只是一个IE bug的解决方法。这就是我一直在寻找的。但我在这个早期的状态中遇到了一些问题。例如,MutationObserver的突变不会跟随所有子树,即使指定了
  var script = document.createElement('script');
  script.src = '//localhost:4000/app.js';
  (function appendScript() {
    if (document.body) return document.body.appendChild(script);
    window.requestAnimationFrame(appendScript);
  })();