为什么页面加载时只有一行javascript启动?

为什么页面加载时只有一行javascript启动?,javascript,Javascript,我试图真正理解浏览器如何加载网页的细节 在一个.js文件中,我有两个javascript语句附加到一个HTML文件: d3.select("body").append("span").text("Hello, world!"); alert("huh?"); 当我加载页面时,我看到一个警告“huh”。因此“huh”语句触发 但是,“Hello,world”并没有附加到文档正文中 然后,如果我在控制台中运行d3.select(“body”).append(“span”).text(“H

我试图真正理解浏览器如何加载网页的细节

在一个.js文件中,我有两个javascript语句附加到一个HTML文件:

d3.select("body").append("span").text("Hello, world!");
alert("huh?"); 
当我加载页面时,我看到一个警告“huh”。因此“huh”语句触发

但是,“Hello,world”并没有附加到文档正文中

然后,如果我在控制台中运行
d3.select(“body”).append(“span”).text(“Hello,world!”)
,那么它将按预期执行——也就是说,它将“Hello,world”添加到body中

这是怎么回事<代码>警报(“嗯?”)在DOM中的window.onload事件后激发,对吗?但是
d3.选择…
不会开火吗


为什么会出现差异?

操作
DOM
的代码没有触发的原因是因为还没有
DOM
。要解决这个问题,你可以

  • 将您的
    标记放在
    正文中,这样一旦有正文,它就会运行
  • 将您的代码封装在
    窗口中。onload
    ,这样当DOM准备就绪时它就会启动
第二个选项的示例:

window.onload = function(){

    d3.select("body").append("span").text("Hello, world!");
    alert("huh?"); 

}

窗口加载事件时,函数d3.select(“body”).append(“span”).text(“Hello,world!”);触发器,但元素尚未加载,因此它不反映。
当我们使用$(document).ready函数时,这将在页面满负荷后触发该函数,因此触发器可能会反射并可见。其中as-alert在window.onload和$(document)中都是相同的。为此,您需要确保仅在DOM树中存在目标元素后才调用元素选择器。这就是为什么jQuery的DOM ready如此流行的原因

基本上,有时页面内容很重(图像大小较大等),需要时间加载。在窗口加载事件之前首先触发DOM就绪

在确保节点位于DOM树中后,或者换句话说,在您选择的任何函数(如案例中所示)都需要启动;至少在DOM就绪事件激发之后。否则,即使它在一个浏览器上工作一次,也可能是间歇性的,因为它取决于竞争,竞争首先发生——执行JS或创建元素。每当前者发生时,它就会失败


我希望这有帮助

还没有身体元素。有两种解决方案:

要么等待文档加载

<head>
<script>
$(document).ready(function() {
d3.select("body").append("span").text("Hello, world!")
});
</head>

$(文档).ready(函数(){
d3.选择(“body”).追加(“span”).文本(“你好,世界!”)
});
或者你把它放在身体里

<body>
<script>
d3.select("body").append("span").text("Hello, world!")
</script>
</body>

d3.选择(“body”).追加(“span”).文本(“你好,世界!”)

如果您在
中导入脚本,那么当代码运行时,还没有
——浏览器在继续解析HTML文档之前,会在看到脚本代码后立即运行脚本代码。特别是,浏览器不会等待“加载”事件,除非您通过将代码放入函数并将其绑定为事件的处理程序来专门安排“加载”事件。在页面生命周期的哪一点上存在DOM?所有包含的js fire是否曾经包含?如果没有dom,它就什么也不做了?当页面加载时,就有了dom
onload
是在DOM就绪时触发的事件。加载DOM后,
onload
事件中的所有javascript都将触发。在某个时候应该有一个DOM。从技术上讲,即使是空白页也有DOM。如果在空白HTML页面中有
onload
事件,代码仍然会触发。浏览器会在找到它后立即运行它找到的所有js吗?除非它在事件处理程序中(如window.onload)