简短而简单:因为您要查找的元素在文档中(还)不存在。
对于此答案的其余部分,我将使用getElementById
了实施例,但同样适用于getElementsByTagName
,querySelector
和任何其它DOM方法,其选择的元件。
可能的原因
元素可能不存在的三个原因:
文档中确实不存在具有传递 ID 的元素。您应该仔细检查您传递给的 ID 是否getElementById
真正匹配(生成的)HTML 中现有元素的 ID,并且您没有拼错ID(ID区分大小写!)。
如果您使用的getElementById
是 ,请确保您只提供元素的 ID(例如,document.getElemntById("the-id")
)。如果您使用的方法接受 CSS 选择器(如querySelector
),请确保#
在 ID 之前包含 ,以表明您正在查找 ID(例如document.querySelector("#the-id")
)。您不得使用#
with getElementById
,而必须使用 withquerySelector
和 similar 。还要注意的是,如果该ID在它不在有效的字符CSS标识符(如.
,id
属性包含.
的字符是不良的做法,但有效的),你必须使用时,逃生者querySelector
(document.querySelector("#the\\.id")
)),但不使用时,getElementById
(document.getElementById("the.id")
) .
在您调用 时该元素不存在getElementById
。
即使您可以在页面上看到该元素,该元素也不在您要查询的文档中,因为它位于iframe
(这是它自己的文档)中。iframes
当您搜索包含它们的文档时,不会搜索其中的元素。
如果问题是原因 3(它在 aniframe
或类似的文件中),您需要查看 中的文档,而iframe
不是父文档,也许通过获取iframe
元素并使用其contentDocument
属性来访问其文档(仅限同源)。这个答案的其余部分解决了前两个原因。
第二个原因-它不存在尚未 -是相当普遍的。浏览器从上到下解析和处理 HTML。这意味着在该 DOM 元素出现在 HTML 中之前发生的对该 DOM 元素的任何调用都将失败。
考虑以下示例:
<script>
var element = document.getElementById('my_element');
</script>
<div id="my_element"></div>
在div
出现后的script
。在执行脚本的那一刻,元素不存在尚未和getElementById
返回null
。
jQuery
这同样适用于所有带有 jQuery 的选择器。如果您拼错了选择器或者您试图在它们实际存在之前选择它们, jQuery 将不会找到它们。
一个额外的问题是当你没有找到 jQuery 时,因为你加载了没有协议的脚本并且正在从文件系统运行:
<script src="//somecdn.somewhere.com/jquery.min.js"></script>
此语法用于允许脚本通过 HTTPS 在协议为 https:// 的页面上加载,并在协议为 http:// 的页面上加载 HTTP 版本
它具有尝试加载和加载失败的不幸副作用 file://somecdn.somewhere.com...
解决方案
在您调用getElementById
(或任何与此相关的 DOM 方法)之前,请确保您要访问的元素存在,即 DOM 已加载。
这可以通过简单地将您的 JavaScript 放在相应的 DOM 元素之后来确保
<div id="my_element"></div>
<script>
var element = document.getElementById('my_element');
</script>
在这种情况下,您还可以将代码放在结束正文标记 ( </body>
) 之前(所有 DOM 元素将在脚本执行时可用)。
其他解决方案包括侦听load
[MDN]或DOMContentLoaded
[MDN]事件。在这些情况下,将 JavaScript 代码放置在文档中的哪个位置并不重要,您只需要记住将所有 DOM 处理代码放在事件处理程序中。
例子:
window.onload = function() {
// process DOM elements here
};
// or
// does not work IE 8 and below
document.addEventListener('DOMContentLoaded', function() {
// process DOM elements here
});
有关事件处理和浏览器差异的更多信息,请参阅quirksmode.org 上的文章。
jQuery
首先确保 jQuery 已正确加载。使用浏览器的开发者工具找出jQuery文件是否找到,如果没有则更正URL(例如在开头添加http:
或https:
方案,调整路径等)
监听load
/DOMContentLoaded
事件正是 jQuery 对.ready()
[docs]所做的。所有影响 DOM 元素的 jQuery 代码都应该在该事件处理程序中。
事实上,jQuery 教程明确指出:
由于我们在使用 jQuery 时所做的几乎所有事情都读取或操作文档对象模型 (DOM),因此我们需要确保在 DOM 准备就绪后立即开始添加事件等。
为此,我们为文档注册了一个就绪事件。
$(document).ready(function() {
// do stuff when DOM is ready
});
或者,您也可以使用速记语法:
$(function() {
// do stuff when DOM is ready
});
两者是等价的。