我有一个按钮Edit,点击它可以将所有按钮的类别从btn更改为btnDel.

所以,在点击Edit次之后,我预计$('.btnDel').on('click', function() {...}会被触发.

然而,$('.btn').on('click', function() {...}仍然被触发.

我遗漏了什么?

$('.btnEdit').on('click', function() {
  console.log("btnEdit was clicked");
  $(".btn").removeClass("btn").addClass("btnDel");
});

$('.btn').on('click', function() {
  console.log("btn was clicked");
});

$('.btnDel').on('click', function() {
  console.log("btnDel was clicked");
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<button class="btnEdit">Edit</button>
<br/><br/>
<button class="btn">1</button>
<button class="btn">2</button>
<button class="btn">3</button>

推荐答案

导致该问题的原因是在页面加载时绑定事件处理程序,而不是在按下按钮时.在页面加载时,没有btnDel按钮,因此处理程序不绑定到任何元素.要解决这个问题,你可以用event delegation.

$('.btnEdit').on('click', function() {
  console.log("btnEdit was clicked");
  $(".btn").removeClass("btn").addClass("btnDel");
});

$('#delegator').on('click', '.btn', function() {
  console.log("btn was clicked");
});

$('#delegator').on('click', '.btnDel', function() {
  console.log("btnDel was clicked");
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<button class="btnEdit">Edit</button>
<br/><br/>
<div id=delegator>
  <button class="btn">1</button>
  <button class="btn">2</button>
  <button class="btn">3</button>
</div>

Jquery相关问答推荐

使用 howler.js 中的变量播放多种声音

如何使用 JQuery 将详细信息中的项目包装在容器中?

jQuery .first() 方法返回第一个元素的集合

缺少 .map 资源?

使用 jQuery,当用户仍在编辑该字段时,如何将文本字段的第一个字母大写?

jQuery.parseJSON 单引号与双引号

jQuery 绑定点击 *ANYTHING* 但 *ELEMENT*

如何使用 jQuery 清空输入值?

可以在删除类时反转css动画吗?

为特定请求禁用 ajaxStart() 和 ajaxStop()

如何在 JQuery UI 自动完成中使用 source:function()... 和 AJAX

如何使用 jQuery 显示忙碌指示器?

你如何获得文本区域中的光标位置?

如何使用 jQuery 为文本对齐动态添加样式

使用 JQuery 获取触发事件的元素的类

更改占位符文本

使用 jQuery 获取 div 的可见高度

无法更新数据属性值

如何在 ReactJS 中使用 JQuery

为什么我应该创建异步 WebAPI 操作而不是同步操作?