繁体   English   中英

Javascript:为什么我得到这个Uncaught TypeError:无法读取null的属性'addEventListener'?

[英]Javascript: Why am I getting this Uncaught TypeError: Cannot read property 'addEventListener' of null?

我正在尝试注册一个事件处理程序,该事件处理程序在按钮触发click事件时将元素添加到DOM中,例如

var b = document.getElementById('evt');

var eventDemo = function(event) {

    console.log('I handled the event');
    console.log(event);
    console.log(Object.prototype.toString.call(event)); 

var imgElement = document.createElement('img');
imgElement.src = 'http://lorempixel.com/150/150/';
document.body.appendChild(imgElement);

};

b.addEventListener('onclick', eventDemo, false);

但我不断得到:

未捕获的TypeError:无法读取null的属性'addEventListener'

为什么会这样

浏览器:chrome

正如你说script加载在head标签,由时的声明

var b = document.getElementById('evt');

执行后, DOM没有ID为evt元素。

使用DOMContentLoaded事件在元素上添加事件侦听器。 这将在DOM完全加载后运行。

当初始HTML文档已完全加载和解析时,无需等待样式表,图像和子帧完成加载,就会触发DOMContentLoaded事件。 完全不同的事件-加载-仅应用于检测页面已完​​全加载。 对于人们来说,使用负载是一个非常普遍的错误,而DOMContentLoaded更合适,因此要谨慎。

码:

document.addEventListener("DOMContentLoaded", function(event) {
    var b = document.getElementById('evt');
    b.addEventListener('click', eventDemo, false);
});

错误本身清楚地解释了! 您没有任何ID为'evt'的html元素。 如果确定有一个ID为'evt'的元素,则使用$(document).ready ,如下所示,这样,在加载html元素时将执行您的js。

$(document).ready(function(){
var b = document.getElementById('evt');

var eventDemo = function(event) {

    console.log('I handled the event');
    console.log(event);
    console.log(Object.prototype.toString.call(event)); 

var imgElement = document.createElement('img');
imgElement.src = 'http://lorempixel.com/150/150/';
document.body.appendChild(imgElement);

};

b.addEventListener('onclick', eventDemo, false);
});

在此脚本运行时,未定义ID为'evt'的元素。 有两种可能性:

  1. 您输入的ID拼写错误或忘记添加,请仔细检查
  2. 您需要在呈现页面之前加载此代码。 您说,您是从script.js加载此脚本的,因此它可能发生在<head> 但是加载脚本时, <body>仍然没有。

将此脚本添加到页面底部,或者更好的方法是使用DOMContentLoaded事件:

document.addEventListener("DOMContentLoaded", function(event) { 
  //place all your code here
});

而且,正如已经提到的那样,该事件称为click ,而不是onclick onclick是DOM属性,例如,等同于HTML中的addEventListener

如果您碰巧使用过jQuery,便捷的包装器是$(document).ready(function() { /* place hode here */ });

来自mdn

element = document.getElementById(id);

element是对Element对象的引用;如果具有指定ID的元素不在文档中,则为null

在您的情况下,找不到b并返回null。 Null不是对象,因此不能具有addEventListener

我遇到了同样的错误,我在同一天浪费了2天。 后来发现同一应用程序在firefox上运行良好。 所以我尝试将chrome版本更新为53.xx,现在没有发生此类问题。 也许这也会对您有帮助:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM