我必须使用香草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,但不确定。


当前回答

把脚本放在正文标签的末尾。

<html>
    <body>
        .........
        <script src="main.js"></script>
    </body>
</html>

其他回答

我认为最简单的方法是使用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>

document.getElementById('overlayBtn');返回null,因为它在DOM完全加载之前执行。

如果你把这行代码放在

window.onload=function(){
  -- put your code here
}

然后它将毫无问题地运行。

例子:

window.onload=function(){
    var mb = document.getElementById("b");
    mb.addEventListener("click", handler);
    mb.addEventListener("click", handler2);
}


function handler() {
    $("p").html("<br>" + $("p").text() + "<br>You clicked me-1!<br>");
}

function handler2() {
    $("p").html("<br>" + $("p").text() + "<br>You clicked me-2!<br>");
}

如果你的js代码是外部文件,使用这种方法:

<script src="filename.js" defer></script>

如果您的代码是内部文件,则使用DOMContentLoaded

以上两种方法将确保DOM在执行js代码之前完全加载!

我得到了同样的错误,但执行空检查似乎没有帮助。

我找到的解决方案是将我的函数包装在整个文档的事件侦听器中,以检查DOM何时完成加载。

document.addEventListener('DOMContentLoaded', function () {
    el.addEventListener('click', swapper, false);
});

我想这是因为我使用的框架(Angular)正在动态地改变我的HTML类和ID。

您的脚本可能被放置在HTML的head标记中,并且在DOM加载之前加载。有两种解决方案:

将脚本标记放在body结束标记(</body>)之前。 将async关键字添加到脚本标记中。

<script async src="script.js"></script> .js

使用async,文件将异步下载,然后在下载完成后立即执行。

我更喜欢第二种选择。点击这里阅读更多关于async和defer的内容