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


当前回答

我只是在我的脚本标签中添加了“async”,这似乎已经解决了这个问题。我不知道为什么,如果有人能解释的话,但这对我来说很有效。我的猜测是,页面不会等待脚本加载,因此页面与JavaScript同时加载。

Async/Await使我们能够以同步的方式编写异步代码。它只是使用生成器和yield语句来“暂停”执行的语法糖,使我们能够将它分配给一个变量!

这里是参考链接- https://medium.com/siliconwat/how-javascript-async-await-works-3cab4b7d21da

其他回答

我也有同样的问题,但我的本我是存在的。所以我试着加上“window”。Onload = init;"然后我用init函数包装了我的原始JS代码(你想叫它什么都行)。这是有效的,所以至少在我的情况下,我在加载文档之前添加了一个事件侦听器。这也可能是你正在经历的。

这是因为在执行bundle js时元素还没有加载。

我将移动<script src="sample.js" type="text/javascript"></script>到index.html文件的底部。这样可以确保在解析和呈现所有html元素之后执行脚本。

脚本在主体之前加载,在主体之后保留脚本

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

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

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

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

这个问题已经有答案了,但我喜欢对这些简单的条件使用逻辑AND(&&)操作符:

var el = document.getElementById('overlayBtn');

el && el.addEventListener('click', swapper, false);

在我看来更易于阅读和简洁。