Javascript:未捕获的类型错误:无法调用 null 的方法“addEventListener”

IT技术 javascript addeventlistener
2021-02-07 20:56:04

我正在尝试做一些相当简单的事情,但由于我可能不够好搜索文档,我无法让它工作。

我有一个功能正常的内联 JS,如下所示:

<A title="Wolfram IP Calc" href="javascript:txt=prompt('Enter%20IP%20address,%20e.g.%2010.20.30.40/29','1.2.3.4/5');%20if(txt)%20window.open('http://www.wolframalpha.com/input/?i='+txt);void(O);">Compute!</A>

由于各种原因,我试图分离 JS,这就是我遇到障碍的地方。

我创建了以下给我错误的测试页面Uncaught TypeError: Cannot call method 'addEventListener' of null

<HTML> <HEAD profile="http://www.w3.org/2005/10/profile"> <script type="text/javascript">
var compute = document.getElementById('compute');
compute.addEventListener('click', computeThatThing, false);

function computeThatThing() {
    txt=prompt('Enter%20IP%20address,%20e.g.%2010.20.30.40/29','1.2.3.4/5');
    if(txt) {
        window.open('http://www.wolframalpha.com/input/?i='+txt);
    }
}
</script></HEAD>
<BODY>
<A title="Wolfram IP Calc" id="compute" href="javascript:void(O);">Test</A>
</BODY>
</HTML>

我唯一能找到的指出这样的问题的是它addEventListener无法处理<A>但应该处理<IMG>(这对我来说很好,因为我要把它倒在一些图像上),所以我尝试添加以下无济于事:

<img id="compute" src="http://products.wolframalpha.com/images/products/products-wa.png" />

预先感谢您指出我做错了什么。这可能是显而易见的,但我对 JS 的经验接近于零,而且直到现在我需要它时,我主要通过货物培养。

2个回答

您的代码在<head>=> 元素呈现之前运行,因此document.getElementById('compute');返回 null,正如 MDN Promise的那样......

element = document.getElementById(id);
element 是对 Element 对象的引用,如果具有指定 ID 的元素不在文档中,则为 null。

MDN

解决方案:

  1. 将脚本放在页面底部。
  2. 在加载事件中调用附加代码。
  3. 使用 jQuery 库和它的 DOM 就绪事件。

什么是 jQueryready事件,为什么需要它?
(为什么不只是 JavaScript 的加载事件):

虽然 JavaScript 提供了用于在呈现页面时执行代码的 load 事件,但在完全接收到所有资产(例如图像)之前不会触发此事件。在大多数情况下,只要完全构建了 DOM 层次结构,就可以运行脚本。传递给 .ready() 的处理程序保证在 DOM 准备好后执行,所以这通常是附加所有其他事件处理程序的最佳位置
......

ready 文档

@AndreiGheorghiu 以何种方式误导?如果您认为这里有错误,请随时建议对答案进行编辑。
2021-03-18 20:56:04
我已经在答案中解释过了。由于为清楚起见,解释比您的答案长,我认为最好将其包含在一个额外的答案中,该答案引用您的答案。详细地说,您的回答指出readyjQuery 的事件等待图像加载,即false. 您还使用命名报价的工具来说明这一点,强调它并试图使其看起来“官方”。这对刚开始接触网页设计的人来说尤其有害,比如我的学生。
2021-03-20 20:56:04
谢谢gdoron解决方案 1 立即生效。老实说,我很惊讶它是如此简单且几乎是直观的。现在打破我的生产代码!:)
2021-03-29 20:56:04
您的回答是由正在学习 Web 开发的人推荐给我的。被投票赞成,它具有有用的重要性,但它具有误导性。请更正它或参考我的澄清以防止这种情况发生。根据经验,请确保您引用的内容实际上是正确和最新的。谢谢你。
2021-04-05 20:56:04
我在使用莫里斯图表时面临同样的问题。我已经完成了这一切,但仍然没有希望。
2021-04-10 20:56:04

在 BODY 的末尾而不是 HEAD 移动脚本标签,因为在当前代码中,当计算脚本时,文档中不存在 html 元素。

既然你不想你jquery。使用 window.onload 或 document.onload 来执行当前脚本标签中的整段代码。 window.onload 与 document.onload