Javascript:Uncaught TypeError:无法调用null的方法'addEventListener'

Jan*_*Jan 24 javascript addeventlistener

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

我有一个功能强大的内联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>
Run Code Online (Sandbox Code Playgroud)

出于各种原因,我正试图分离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>
Run Code Online (Sandbox Code Playgroud)

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

<img id="compute" src="http://products.wolframalpha.com/images/products/products-wa.png" />
Run Code Online (Sandbox Code Playgroud)

提前谢谢你指出我做错了什么.这可能是显而易见的,但我对JS的经验几近为零,而且到目前为止,我已经大部分都是通过货物结果.

gdo*_*ica 54

您的代码在<head>=>运行之前运行元素,因此document.getElementById('compute');返回null,作为MDN承诺...

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

MDN

解决方案:

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

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

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

ready 文档