window.onload似乎在加载DOM之前触发(JavaScript)

window.onload似乎在加载DOM之前触发(JavaScript),dom,dom-events,getelementbyid,onload,onload-event,Dom,Dom Events,Getelementbyid,Onload,Onload Event,我在窗口.onload和文档.onload事件中遇到问题。我读到的所有内容都告诉我,在DOM完全加载其所有资源之前,这些不会触发,我似乎不会这样做: 我在Chrome 4.1.249.1036(41514)和IE 8.0.7600.16385中尝试了以下简单页面,结果相同:两个页面都显示消息“It failed!”,表示未加载MyParague(因此DOM似乎不完整) window.onload=doThis(); //document.onload给出了相同的结果 函数doThis(){ i

我在
窗口.onload
文档.onload
事件中遇到问题。我读到的所有内容都告诉我,在DOM完全加载其所有资源之前,这些不会触发,我似乎不会这样做:

我在Chrome 4.1.249.1036(41514)和IE 8.0.7600.16385中尝试了以下简单页面,结果相同:两个页面都显示消息“It failed!”,表示未加载
MyParague
(因此DOM似乎不完整)


window.onload=doThis();
//document.onload给出了相同的结果
函数doThis(){
if(document.getElementById(“My段落”)){
警惕(“成功了!”);
}否则{
警报(“它失败了!”);
}
}
这里什么都没有

我在一个外部.js文件中使用了比这更复杂的脚本,但这说明了问题所在。我可以通过使用
window.onload
设置一个计时器运行半秒钟
doThis()
,但这似乎是一个不雅观的解决方案,并没有回答为什么
window.onload
似乎并不像大家说的那样。另一个解决方案是设置一个计时器来检查DOM是否已加载,如果未加载,它将在半秒钟后调用自己(因此它将一直检查,直到加载DOM为止),但这对我来说太复杂了


是否有更合适的事件可供使用?

您是否尝试过改用javascript库,例如,它是
$(document)。ready()
函数:

  $(document).ready(function() {
      // put all your jQuery goodness in here.
  });

在加载窗口时,主体尚未加载,因此应按以下方式更正代码:

<script type="text/javascript">
    window.onload = function(){
        window.document.body.onload = doThis; // note removed parentheses
    };

    function doThis() {
        if (document.getElementById("myParagraph")) {
            alert("It worked!");
        } else {
            alert("It failed!");
        }
    }
</script>

window.onload=函数(){
window.document.body.onload=doThis;//注意已删除括号
};
函数doThis(){
if(document.getElementById(“My段落”)){
警惕(“成功了!”);
}否则{
警报(“它失败了!”);
}
}
测试在FF/IE/Chrome中工作,但也考虑处理
document.onload


如前所述,使用js框架将是一个更好的主意。

只需使用
window.onload=doThis
而不是
window.onload=doThis()

这取决于您将onload函数(head或body标记或更向下)放置在何处,不同浏览器中的内部事件绑定似乎略有不同

另见
重要的是要理解
()
是一个操作符,就像
+
&
一样
()
获取一个函数并调用它

在这种情况下,
这是一个函数对象,
()
是调用函数的操作符
doThis()
组合到一起调用
doThis
,执行它,并计算为
doThis

因此
window.onload=doThis()
基本上是将
doThis的返回值赋值给
window.onload

因此,要解决这个问题,您需要引用函数本身,而不是调用它


执行此操作

谢谢,我将在本周查看。我仍然担心,似乎没有任何与DOM相关的事件能够可靠地告诉我何时加载了DOM,而无需借助第三方脚本。仅仅为此添加库肯定是过火了-库下载会增加延迟和数据传输,并且可能只为您节省一些字符。jQuery特别重。话虽如此,如果您已经在为其他事情使用库,那么使用它来处理将函数附加到dom就绪事件可能没有什么害处。@David Mason我完全同意。大多数情况下,我发现jquery会使页面加载时间翻倍。@JamesWalker如果您从CDN加载jquery(或任何其他流行的javascript库),那么浏览器缓存中已经有js文件(访问其他网站)的可能性很大,因此加载时间不会显著增加。谢谢,这似乎解决了我的问题,并解决了我认为是相同问题的递归,即在知道主体是否已成功加载之前,将某些内容附加到body.onload事件。我现在弹出消息“It worked!”,可以继续学究式地保持我的脚本和标记的整洁和独立。请注意,对两个脚本使用这种方法可能会用另一个脚本覆盖其中一个脚本。现在我倾向于使用document.addEventListener(“DOMContentLoaded”,function(event){console.log(“DOM完全加载并解析”);};请参阅:@DavidMason DomContentLoaded在我的测试中加载之前已加载。有时,speechSynthesis.getVoices()在load事件和DOMContentLoaded事件上都是空数组。是否有更晚的事件?@1.21gigawatts我不知道您的
speechSynthesis.getVoices()
应该如何加载,因此查找内容加载可能不是一件需要做的事情-如果有脚本加载它,那么您需要尝试使用它的脚本出现在该脚本之后(而不是将该脚本标记为async).@DavidMason SpeechSynthesis是windows对象的一个属性。getVoices调用获取文本到语音的语音列表。有时它是空的。一个简单的页面刷新,它是可用的。我所做的是先在dom内容加载时调用,然后在加载时调用并将其分配给一个数组,然后如果用户访问voices数组,我会检查数组是否为空,然后再次调用它。似乎就是这样。要了解更多的原因,请看这个:我看到的第一个错误是您正在分配[function result],而不是[function]本身。你能看到
doThis()
<script type="text/javascript">
    window.onload = function(){
        window.document.body.onload = doThis; // note removed parentheses
    };

    function doThis() {
        if (document.getElementById("myParagraph")) {
            alert("It worked!");
        } else {
            alert("It failed!");
        }
    }
</script>