javascript - 动态添加子元素的事件监听器也标记为父元素

标签 javascript jquery html

我正在使用 JQuery 向 HTML 动态添加按钮。我有需要添加到动态添加按钮的事件。但是,我不希望在单击按钮的父 div 时触发相同的事件。

有我目前拥有的代码..

var buttons = (function() {

  var categories = ["cats", "tigers", "dogs", "lions", "pigs", "goats", "chickens", "cats", "tigers", "dogs", "lions", "pigs", "goats", "chickens", "cats", "tigers", "dogs", "lions", "pigs", "goats", "chickens", "cats", "tigers", "dogs", "lions", "pigs", "goats", "chickens"];

  var addButtons = function() {

    for (var i = 0; i < categories.length; i++) {
      var btn = $("<button>");
      btn.attr("id", "btn-" + i);
      btn.addClass("btn btn-primary categories");
      btn.text(categories[i]);
      $("#btnSection").append(btn);
    }

  };

  var addEventListeners = function() {
    $("#btnSection").on("click", function(e) {
      e.stopPropagation();
    });
    $("#btnSection").on("click", $("#btnSection .categories"), function(event) {
      event.stopPropagation();
      console.log(event.target.textContent);

      alert(event.target.textContent);
    });

  };

  return {
    addButtons: addButtons,
    addEventListeners: addEventListeners
  };
})();


buttons.addButtons();
h1 {
  text-align: center;
}

h1 {
  font-family: 'Cinzel', serif;
  font-size: 24px;
  font-weight: 900;
}

div {
  font-family: 'Cinzel', serif;
  /* font-size: 24px; */
  font-weight: 400;
  border: red solid 1px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="row" id="btnSection">
</div>

当您单击按钮时 - 您应该在当前按钮中收到包含动物名称的警报 - 这是所需的行为

但是 - 当您单击红色框内的空白区域时 - 您不应该收到警报..我希望以某种方式阻止它../

非常感谢任何帮助..

最佳答案

您对 JQuery .on() method 的第二个参数 是不正确的。它必须是有效的选择器,而不是 JQuery 对象。

您还拥有:

$("#btnSection").on("click", function(e) {
  e.stopPropagation();
});

这似乎与您的操作无关。

此外,您还需要调用 buttons.addEventListeners() 方法。

var buttons = (function() {

  var categories = ["cats", "tigers", "dogs", "lions", "pigs", "goats", "chickens", "cats", 
                    "tigers", "dogs", "lions", "pigs", "goats", "chickens", "cats", "tigers", 
                    "dogs", "lions", "pigs", "goats", "chickens", "cats", "tigers", "dogs", 
                    "lions", "pigs", "goats", "chickens"];

  var addButtons = function() {
    for (var i = 0; i < categories.length; i++) {
      var btn = $("<button>");
      btn.attr("id", "btn-" + i);
      btn.addClass("btn btn-primary categories");
      btn.text(categories[i]);
      $("#btnSection").append(btn);
    }
  };

  var addEventListeners = function() {
    // The second argument here needs to be a valid CSS selector
    $("#btnSection").on("click", "button.categories", function(event) {
      event.stopPropagation();
      console.log($(this).text()); // Adjusted to the JQuery syntax since you are using JQuery
    });
  };

  return {
    addButtons: addButtons,
    addEventListeners: addEventListeners
  };
})();

buttons.addButtons();
buttons.addEventListeners(); // You didn't have this call!
h1 { text-align: center; }

h1 {
  font-family: 'Cinzel', serif;
  font-size: 24px;
  font-weight: 900;
}

div {
  font-family: 'Cinzel', serif;
  /* font-size: 24px; */
  font-weight: 400;
  border: red solid 1px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="row" id="btnSection"></div>

关于javascript - 动态添加子元素的事件监听器也标记为父元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49929130/

相关文章:

html - 在 HTML 上相对居中一个 div

HTML Canvas - 圆圈周围的虚线描边

javascript - 声明对象的最佳方式是什么?

javascript - 高效的 jQuery 或 HTML5 图像 slider

html - 在购物车中制作自定义 x

javascript - 解析带两位小数的 float ,

javascript - 制作一个滚动功能,向下滚动一定次数然后返回

javascript - 带定时器的弹出框

javascript - 当容器具有绝对位置时,jsPlumb 保留子​​ div 之间的联系

javascript - 这个 javascript 在 Firefox 中运行缓慢,如何让它运行流畅?