javascript - ReadyState 交互与 DOMContentLoaded

标签 javascript html interactive readystate domcontentloaded

我正在设置一个非常简单的页面来从 DOMContentLoaded 事件上的数组填充下拉列表,但是在我的环境(VS 代码 + 实时服务器扩展)中,我收到错误,因为整个主体对象不存在在 DOMContentLoaded 的那一刻,这对我来说很奇怪。

我在线阅读了一些网站,但它们确实表明,除了较旧的浏览器支持之外,交互式的 DOMContentedLoaded 和 readState 是可以互换的。 https://caniuse.com/#search=DOMContentLoaded https://developer.mozilla.org/en-US/docs/Web/API/Document/readyState

所以我探索了它,似乎如果我在浏览器中调用匿名函数(其中具有相同的函数调用),它将具有“交互”的就绪状态,但如果我直接调用该函数,它将处于“正在加载”的就绪状态。现在在 codpen.io 和 Stacks Snippets 中它甚至渲染得很好,但在我的本地环境中它会出错,最终就绪状态不应该是交互式的吗?

我链接的文档讨论了使用 document.onreadychange 提供更广泛的支持,我想对于我的具体情况,我会走这条路,但我想问一下是否有其他人遇到过这种情况? 我使用的是 Chrome 版本 67.0.3396.99(官方版本)(64 位),在 Chrome、Firefox 和 Opera 上进行了测试,结果相同。

function DomLoaded(element) {
  console.log("Looking for " +element + " | current document state:" + document.readyState);
  var typelist = document.getElementById(element);
  listofTypes.forEach(function(currentvalue, index) {
    var option = document.createElement("option");
    option.text = currentvalue;
    typelist.add(option);
  });
}
var listofTypes = ["accounting", "airport", "amusement_park", "aquarium"];
document.addEventListener("DOMContentLoaded", function() {
DomLoaded("typelistanonfunc");});
document.addEventListener("DOMContentLoaded", DomLoaded("typelist"));
  <html>
<head>
    <title>Document Load</title>
</head>
<body>
    <h1 id="header1">Test 1</h1>
    <select id="typelist" style="max-width: 90%;"></select>
    <select id="typelistanonfunc" style="max-width: 90%;"></select>
</body>
</html>

最佳答案

这里:

document.addEventListener("DOMContentLoaded", DomLoaded("typelist"));

您正在调用DomLoaded()函数并将 ( undefined ) 返回值传递给 addEventListener() 。这将在触发“ready”事件之前发生,并且您收到的错误将是由于目标 <select> 造成的。元素尚未在 DOM 中。

类似 something(somethingElse) 的表达式是一个函数调用。在所有情况下都会立即对其进行评估。

第一种形式:

document.addEventListener("DOMContentLoaded", function() { DomLoaded("typelist"); });

是正确的。围绕对处理程序的调用创建的函数表达式不是函数调用;它只是对该匿名函数的引用。这将正确地为“ready”( DOMContentLoaded ) 事件创建一个事件处理程序。

关于javascript - ReadyState 交互与 DOMContentLoaded,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51119279/

相关文章:

python - Altair 双下拉菜单

javascript - 更改少于 3 个字符的 <li> 的文本值

javascript - 在其他页面打开 jQuery Fancybox

javascript - 从 angularjs Controller 调用 div

javascript - Bootstrap : Responsive Image in Panel

css - 如何获得网站的高度以适应各种大小的 iframe 页面?

javascript - 在 jquery 插件模式中从公共(public)函数调用私有(private)函数

javascript foreach onclick

python - 如何在 Python 的 Tkinter 中制作一个交互式列表,并包含可以编辑这些列表的按钮?

python - IPython笔记本交互函数: how to set the slider range