JavaScript 函数在第二次调用时无法获取对 DOM 元素的引用

标签 javascript html dom

下面是一个非常简单的函数,它将设置 DOM 元素的文本内容。

const display = (el, value) => {
  el.textContent = value;
};

display(document.getElementById('element1'), 'One');
display(document.getElementById('element2'), 'Two');
<span id="element1" />
<span id="element2" />

奇怪的是,当第二次调用时,该函数会出现熟悉的错误:

Uncaught TypeError: Cannot set property 'textContent' of null

起初我认为问题可能是由于执行时第二个元素可能尚未加载,但是:

  • 脚本内联在 body 的末尾标记,因此所有 DOM 元素都应该已加载。
  • 仅在第二个元素上调用该函数会正确打印 Two .
  • 将调用替换为 display()console.log(document.getElementById('element1'))console.log(document.getElementById('element2'))成功打印出两个元素。
  • 更改两个调用的顺序仍然只会显示 One ,但没有发生错误。

所以我很困惑。该问题在 stacksnippet 中以及作为单独的 HTML 页面加载时都会出现。当前的 Firefox 和 Chrome 中都会出现这种情况。

我在这里遗漏了一些非常明显的东西吗?谁能告诉我这是怎么回事?

最佳答案

const display = (el, value) => {
  el.textContent = value;
};

display(document.getElementById('element1'), 'One');
display(document.getElementById('element2'), 'Two');
<span id="element1"></span>
<span id="element2"></span>

如果您更正 span 标记,那么它就可以正常工作。这样您就可以正确关闭 span 标记。

关于JavaScript 函数在第二次调用时无法获取对 DOM 元素的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50959558/

相关文章:

javascript - Javascript 中函数(全局)的含义

javascript - 如何让 nyc 覆盖范围与 es6 导入(.mjs 文件)一起使用

javascript - 错误: (SystemJS) Unexpected token < SyntaxError: Unexpected token < at eval (<anonymous>) Angular 2

javascript - 为什么这段代码不同步执行?

javascript - Firefox 不会更改图像源

javascript - NGINX 反向代理的 Cookie 路径

html - HTML 5:没有进度条的音频控件?

javascript - 使用带有 react-leaflet 的 html5 视频

html - 如何水平居中 Bootstrap 按钮组

javascript - Vue : Use data to control DOM (but v-for, v-if、v-model 和 v-show 还不够)