javascript - addEventListener 是否采用注册 eventListener 时的值以供将来执行?
问题描述
const showMovies = function (title, url, rating, id) {
const newMovieElement = document.createElement('li');
newMovieElement.className = 'movie-element';
newMovieElement.innerHTML = <div class='movie-elementimage'>
<img src='${url}' alt='${title}'>
</div>
<div class='movie-elementinfo'>
<h2>${title} </h2>
<p> ${rating}/5 Stars</p>
</div>
;
document.getElementById('movie-list').append(newMovieElement);
newMovieElement.addEventListener('click', function () {
newMovieElement.style.display = 'none';
});
};
每次调用 showMovies 函数时,我都会创建一个新的 LI 并将其存储在 const newMovieElement 中。现在假设这个函数被调用了两次,那么最后创建的 LI 将被存储在 const newMovieElement 中。我还在为删除 LI 而创建的每个 LI 上添加了一个 eventListener。现在假设我单击第一个 LI,那么哪个 LI 应该消失,因为newMovieElement.style.display = 'none';
在单击时,newMovieElement 存储了第二个 LI,因此这将设置display:none
newMovieElement(添加了第二个 LI)而不是第一个 LI?
结果是,如果我单击第一个 LI,那么它只会消失(这确实是必需的),但从技术上讲,第二个 LI 不应该根据代码消失吗?
解决方案
每个动态创建的函数(例如您的事件处理程序)都将周围的范围绑定到它,因此它可以访问这些变量(包括newMovieElement
)。这称为“词法作用域”或“闭包”。每个都newMovieElement
包含另一个<li>
元素。
在这里阅读:
推荐阅读
- libgdx - Libgdx TileMap 纹理问题
- java - Restful 系统调用类字段成员与后端类字段类型不同
- javascript - vuetify v-data-table 不显示嵌套对象数据
- android - 在 Android Studio 3.6 中使用 Import Sceneform Asset 导入 FBX 时出错
- powershell - 如何使用powershell将文件输入可执行文件?
- angular - 如何以角度为子组件的子组件指定路由?
- db2 - DB2 on Cloud 中的高可用性特性
- laravel - 列的工厂相同 ID,自动增量,Laravel
- primefaces - 如何使用 ap:dataTable 和 p:columnGroup 标题使用 p:columns
- talend - 使用 Talend 从 Google Drive 读取文件