将事件监听器添加到未来的项目(没有 jQuery)[重复]

2024-01-03

很好奇我是否愿意接受用 Vanilla JS 编写列表应用程序的挑战。问题是事件监听器没有添加到新的列表项中。

我向列表中的现有项目添加删除按钮:

const deleteButton = document.querySelectorAll('span');
deleteButton.forEach(button => button.addEventListener('click', deleteItem));

我想为新项目添加删除按钮。

我知道 jQuery 的on()方法将为动态创建的事件添加一个侦听器 - Vanilla JS 中有等效的吗?


jQuery 不会为动态创建的元素添加侦听器。它的作用是它有一个语法可以为您设置事件委托。

您可以通过侦听某些容器元素并检查单击的内容来查看处理程序是否应该运行来执行相同的操作。

例如,这会监听body,但建议使用更本地化的容器。

document.body.addEventListener("click", function(event) {
  if (event.target.matches("span")) {
    deleteItem.call(this, event);
  }
});

这是一个有限的实现,因为它只检查event.target查看它是否与选择器匹配。为了更彻底,您需要从event.target通过其向上.parentNodes,并检查每一项,直到到达this元素。

这可以轻松地抽象为构建处理程序的辅助函数。

document.body.addEventListener("click", delegate("span", deleteItem));

function deleteItem(event) {
  console.log("clicked on '%s'", this.textContent);
}

function delegate(selector, handler) {
  return function(event) {
    var targ = event.target;
    do {
      if (targ.matches(selector)) {
        handler.call(targ, event);
      }
    } while ((targ = targ.parentNode) && targ != event.currentTarget);
  }
}
span { color: red; }
<div>
  <span>I'm a span!</span>
  Not a span
  <p>
    <span>Another span!</span>
  </p>
</div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将事件监听器添加到未来的项目(没有 jQuery)[重复] 的相关文章

随机推荐

  • 是否可以挑选并运行与 Maven 阶段绑定的特定目标?

    更新以 希望 澄清 如果将目标定义为在给定阶段运行 是否可以运行单个目标而不运行所有阶段 换句话说 是否可以运行antrun run目标 定义为下面安装阶段的一部分 没有获取依赖项 生成资源 编译 测试 打包等 我正在使用 antrun 插
  • 用于播放以毫秒为单位指定的音频部分的命令行程序

    有人会推荐一个命令行实用程序 它可以播放以毫秒为单位指定的音频文件的任何部分 例如 player start time 0 1234 end time 5 6789 audio wav 我遇到的音频播放器似乎都没有此功能 vlc 支持开始和
  • 如何在按 Tab 键时旋转 HTML 元素?

    不使用 JQuery 尝试这个AFTER field4
  • Lo-Dash 按字符串格式的日期数组排序

    我想知道为什么 lodash 与普通 javascript 相比不以字符串格式对日期数组进行排序sort 这是预期的行为还是错误 var array 2014 11 11 2014 11 12 null 2014 11 01 null nu
  • recyclerView 的 setOnClickListener 不起作用

    For RecyclerView如果没有任何项目 则单击RecyclerView作品 但如果它有点击的项目RecyclerView不起作用 小心 我的意思是点击RecyclerView not RecyclerView s item rec
  • 如何通过node js执行存储过程

    我正在使用 db oracle 模块 node js 来查询表 SEARCH 命令 我能够成功获取记录 我需要执行存储过程 知道如何从 Node js 代码执行 Oracle 存储过程吗 我可以通过 db oracle 模块执行吗 或者有其
  • 以编程方式更改 UIButton 类型

    我有一个用 IB 制作的 UIButton 它设置为 圆角矩形 有一次 我想在代码中将类型更改为 自定义 这可能吗 我看到可以在创建时设置类型 但没有看到以后是否可以更改它 如果我没记错的话 不同的按钮类型由 UIButton 的不同 私有
  • 如何重置 virtualenv 和 pip?

    我在 Ubuntu 10 04 服务器上安装了 virtualenv 现在 当我执行 pip freeze 时 它 会显示以下软件包 Django 1 2 4 distribute 0 6 10 python apt 0 7 94 2ubu
  • Bootstrap 3 的 Angular Dialog 指令

    我们正在尝试从 Bootstrap 2 3 2 迁移到 Bootstrap 3 RC1 但遇到了问题AngularJS 对话框指令 http angular ui github io bootstrap dialog 单击相关按钮时 不会出
  • “调整调整大小”Android

    我有一个使用以下方式全屏运行的应用程序 getWindow setFlags WindowManager LayoutParams FLAG FULLSCREEN WindowManager LayoutParams FLAG FULLSC
  • 如何在我的在线站点中使数据库联机

    我通过右键单击 数据库 gt 任务 gt 脱机 在 Sql studio 中使数据库脱机 之后我的登录在 SQL Studio 中停止 我创建了另一个数据库用户来登录 但它显示我的数据库离线 当我过去右键单击我的数据库 gt 任务 gt 联
  • 如何解决 ASP.Net MVC 5 中的 glyphicons-halflings-regular.woff2 Err_Aborted 问题

    所以我有一个项目想要更改 BootStrap 的主题 所以 我的主题来自启动样本 https bootswatch com 并且选择的主题是Lumen https bootswatch com lumen bootstrap css 现在在
  • 在 .NET 2.0 中使用扩展方法?

    我想这样做 但出现此错误 错误1 无法定义新的扩展方法 因为编译器 所需类型 System Runtime CompilerServices ExtensionAttribute 找不到 您是否缺少对 System Core dll 的引用
  • OS X 中 PyDev 和外部库的问题

    我已经在 OS X 10 6 3 下的 Eclipse 3 5 1 中成功安装了最新版本的 PyDev 使用 python 2 6 1我在使已安装的库正常工作时遇到了麻烦 例如 我正在尝试使用 cx Oracle 库 如果从使用某些文本编辑
  • IE7不理解显示:inline-block

    有人可以帮我解决这个错误吗 使用 Firefox 可以正常工作 但使用 Internet Explorer 7 则不行 貌似不太明白display inline block html div class frame header h2 h2
  • 使用 ETag 但状态代码始终为 200 而不是 304

    当我尝试请求http graph facebook com me fields friends http graph facebook com me fields friends使用 ETag 我每次都会得到请求代码 200 我们做了两次连
  • Java Spring MVC 在浏览器中显示 PDF

    如何强制浏览器显示 pdf 而不是下载 这是控制器 RequestMapping value preview pdf method RequestMethod GET protected String preivewSection Http
  • 将静态子域添加到网站的推荐方法是什么?

    我想创建一些静态子域 例如 mycategory mydomain com 在一个相当小的网站中 并希望它指向该文件夹 mydomain com mycategory 不在浏览器地址栏中显示此类重定向 实现它的最简单方法是什么 我可以在 I
  • 吸收 HTML 元素的宽度

    我正在思考如何使用 html 元素来做到这一点 颜色没有什么特别的 所以我不需要把它们做成图像 请注意 文本是右对齐的 此外 颜色条从左侧上升到文本 因此 这可以通过让文本向右浮动 背景颜色为白色 并在其旁边设置一个背景颜色的 div 然后
  • 将事件监听器添加到未来的项目(没有 jQuery)[重复]

    这个问题在这里已经有答案了 很好奇我是否愿意接受用 Vanilla JS 编写列表应用程序的挑战 问题是事件监听器没有添加到新的列表项中 我向列表中的现有项目添加删除按钮 const deleteButton document queryS