首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多次触发嵌套事件

问多次触发嵌套事件
EN

Stack Overflow用户
提问于 2022-01-30 15:14:45
回答 1查看 40关注 0票数 0

我有一个关于以下代码的问题:

​

代码语言:javascript
复制
$(function() {
  var checkboxCnt = 1;
  var checkboxHtml =
    `<br><input type="checkbox" id="checkbox${checkboxCnt}">` +
    `<label for="checkbox${checkboxCnt}">Checkbox 1</label>`;

  // ******************************************
  $('div :checkbox').change(function(e) {
    checkboxChanged(e);
  });
  // ******************************************

  $('#btn').click(function() {
    checkboxCnt++;
    checkboxHtml = checkboxHtml.replaceAll(checkboxCnt - 1, checkboxCnt);
    $(this).before($(checkboxHtml));

    // ******************************************
    $('div :checkbox').change(function(e) {
      checkboxChanged(e);
    });
    // ******************************************
  });

  function checkboxChanged(e) {
    var checkboxID = '#' + e.target.id;
    if ($(checkboxID).is(':checked')) {
      console.log(checkboxID + ' is checked');
    } else {
      console.log(checkboxID + ' is unchecked');
    }
  }

});
代码语言:javascript
复制
#btn {
  width: 100px;
  height: 100px;
  background-color: yellow;
  display: block;
}
代码语言:javascript
复制
<script type="text/javascript" src="https://code.jquery.com/jquery-3.6.0.js"></script>

<div>
  <input type="checkbox" id="checkbox1">
  <label for="checkbox1">Checkbox 1</label>
  <button type="button" id="btn">Click Me!</button>
</div>

​

样品可在https://jsfiddle.net/da7wLukz/上找到。

这只是我目前正在编辑的代码的一个简化版本,每次单击该按钮时,它都会添加一个复选框。每次选中复选框时,我都想执行一些操作,但是我遇到了这样的问题:当您有4个复选框并选中checkbox4时,更改事件只被触发一次,但是当您检查checkbox3时,它被触发了两次,当您检查checkbox2时,它被触发了3次等等。代码在$('#btn).click内和外部都有相同的行,因为假设在$('#btn).click事件中没有$('div :复选框).change事件,那么当checkbox2,3,4.都检查过了。

我只希望在选中复选框时只触发一次更改事件,但如何才能这样做呢?谢谢你提前提供帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-30 15:46:35

不要嵌套事件处理程序。通过$(document).on() (文档)使用不引人注目的事件处理:

​

代码语言:javascript
复制
$(function() {
  var checkboxCnt = 0;
  var checkboxHtml =
    `<input type="checkbox" id="checkbox$%%">` +
    `<label for="checkbox$%%">Checkbox %%</label><br>`;
    
  function addCheckbox() {
    checkboxCnt++;
    $("#btn").before(checkboxHtml.replaceAll('%%', checkboxCnt));
  }

  $(document).on('change', 'div :checkbox', function () {
    if (this.checked) {
      console.log(this.id + ' is checked');
    } else {
      console.log(this.id + ' is unchecked');
    }
  });

  $('#btn').click(addCheckbox);
  addCheckbox();
});
代码语言:javascript
复制
#btn {
  width: 100px;
  height: 100px;
  background-color: yellow;
  display: block;
}
代码语言:javascript
复制
<script type="text/javascript" src="https://code.jquery.com/jquery-3.6.0.js"></script>

<div>
  <button type="button" id="btn">Click Me!</button>
</div>

​

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70915966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档