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>