我必须使用香草JavaScript的项目。我有几个功能,其中之一是打开菜单的按钮。它在目标id存在的页面上工作,但在id不存在的页面上导致错误。在那些页面上,函数找不到id,我收到一个“不能读取属性'addEventListener'的空”错误,我的其他函数都不起作用。

下面是打开菜单的按钮的代码。

function swapper() {
toggleClass(document.getElementById('overlay'), 'open');
}

var el = document.getElementById('overlayBtn');
el.addEventListener('click', swapper, false);

var text = document.getElementById('overlayBtn');
text.onclick = function(){
this.innerHTML = (this.innerHTML === "Menu") ? "Close" : "Menu";
return false;
};

我该怎么处理呢?我可能需要将这段代码全部包装在另一个函数中,或者使用if/else语句,以便它只搜索特定页面上的id,但不确定。


当前回答

我最近得到了这个问题,我发现我在getElementById和querySelector中提供了一个错误的类名。所以,我建议也交叉检查你的脚本和html文件中的类名和id名。

其他回答

您可以将属性defer添加到脚本标记中。您看到这个错误的原因是因为脚本在DOM加载之前运行。

<!DOCTYPE html > < html lang =“en”> < >头 < meta charset = " utf - 8 " > <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <标题>文档< /名称> <link rel="stylesheet" href="css/styles.css"> <script src="scripts/main.js" defer="defer"></script> .js > < /头

Defer是一个布尔值,表示一旦解析完DOM就运行脚本

当我试图通过Id获取一个类的元素时,我遇到了这个问题。检查并确认通过正确的属性(例如id或class)获取元素。否则就会出现这个错误

我认为最简单的方法是使用defer。不知道为什么没人发这个答案

<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="style.js" defer></script>
</head>

这是因为,人们习惯在头部本身定义他们的javascript文件,所以当你在html标签比你的javscript文件首先执行比你的html文件,所以返回的值是NULL。

解决方案:在bodytag '的末尾定义Javascript文件;

正如其他人所说,问题是脚本在页面(特别是目标元素)加载之前执行。

但我不喜欢重新排列内容的解决方案。

首选的解决方案是在页面onload事件上放置一个事件处理程序,并在那里设置监听器。这将确保在执行赋值之前加载页面和目标元素。如

    <script>
    function onLoadFunct(){
            // set Listener here, also using suggested test for null
    }
    ....
    </script>

    <body onload="onLoadFunct()" ....>
    .....