提问者:小点点

如何在动态添加的内容上启用jQuery Each


请看一下这个演示,告诉我为什么在向文档动态添加内容时不能使用$('.quantity').each(function()?正如您所看到的,$('.quantity').each()在硬编码但不处理动态内容时运行正常

null

$("#add").on("click", function(){
   $("#content").empty();
   for (var i = 0; i < 2; i++) {
   $("#content").append(`<div class="btn-group d-flex btn-num-controls quantity" role="group" aria-label="Basic example">
    <button type="button" class="btn quantity-button quantity-down outline-0">-</button>
    <button type="button" class="btn number cart-odqty" data-min="1" data-max="8" data-step="1" value="1" id="">1</button>
    <button type="button" class="btn quantity-button quantity-up outline-0">+</button>
</div>`);
   }
   
});

 $('.quantity').each(function() {
        var spinner = jQuery(this),
            input = spinner.find('.number'),
            btnUp = spinner.find('.quantity-up'),
            btnDown = spinner.find('.quantity-down'),
            val = input.text(),
            min = input.data('min'),
            max = input.data('max');
        spinner.find(".number").text(val);
          btnUp.click(function() {
            var oldValue = parseFloat(input.text());
            if (oldValue >= max) {
                var newVal = oldValue;
            } else {
                var newVal = oldValue + 1;
            }
            spinner.find(".number").text(newVal);
            spinner.find(".number").trigger("change");
        });

        btnDown.click(function() {
            var oldValue = parseFloat(input.text());
            if (oldValue <= min) {
                var newVal = oldValue;
            } else {
                var newVal = oldValue - 1;
            }
            spinner.find(".number").text(newVal);
            spinner.find(".number").trigger("change");
        });

    });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button id="add">Add Content</button>
<h3>Dynamic <sub> Not Working</sub></h3>

<div id="content"></div>
========================================
<h3>Hard Coded <sub> Working</sub></h3>
<div class="btn-group d-flex btn-num-controls quantity" role="group" aria-label="Basic example">
    <button type="button" class="btn quantity-button quantity-down outline-0">-</button>
    <button type="button" class="btn number cart-odqty" data-min="1" data-max="8" data-step="1" value="1" id="">1</button>
    <button type="button" class="btn quantity-button quantity-up outline-0">+</button>
</div>

null


共2个答案

匿名用户

在DOM加载时,在具有指定类的所有元素上设置一个侦听器。 稍后,当动态加载元素时,该元素缺少侦听器。

一种解决方案是使侦听器加法器成为一个函数,每当添加动态内容时就调用它。 我已经编辑了此解决方案的代码段。

否则,您可以分离click listener函数,并在创建过程中将其添加到动态内容中。

null

$("#add").on("click", function(){
   $("#content").empty();
   for (var i = 0; i < 2; i++) {
   $("#content").append(`<div class="btn-group d-flex btn-num-controls quantity" role="group" aria-label="Basic example">
    <button type="button" class="btn quantity-button quantity-down outline-0">-</button>
    <button type="button" class="btn number cart-odqty" data-min="1" data-max="8" data-step="1" value="1" id="">1</button>
    <button type="button" class="btn quantity-button quantity-up outline-0">+</button>
</div>`);
   }
   
listenerAdd();
});

function listenerAdd(){
 $('.quantity').each(function() {
        var spinner = jQuery(this),
            input = spinner.find('.number'),
            btnUp = spinner.find('.quantity-up'),
            btnDown = spinner.find('.quantity-down'),
            val = input.text(),
            min = input.data('min'),
            max = input.data('max');
        spinner.find(".number").text(val);
          btnUp.click(function() {
            var oldValue = parseFloat(input.text());
            if (oldValue >= max) {
                var newVal = oldValue;
            } else {
                var newVal = oldValue + 1;
            }
            spinner.find(".number").text(newVal);
            spinner.find(".number").trigger("change");
        });

        btnDown.click(function() {
            var oldValue = parseFloat(input.text());
            if (oldValue <= min) {
                var newVal = oldValue;
            } else {
                var newVal = oldValue - 1;
            }
            spinner.find(".number").text(newVal);
            spinner.find(".number").trigger("change");
        });

    });
}
listenerAdd();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button id="add">Add Content</button>
<h3>Dynamic <sub> Not Working</sub></h3>

<div id="content"></div>
========================================
<h3>Hard Coded <sub> Working</sub></h3>
<div class="btn-group d-flex btn-num-controls quantity" role="group" aria-label="Basic example">
    <button type="button" class="btn quantity-button quantity-down outline-0">-</button>
    <button type="button" class="btn number cart-odqty" data-min="1" data-max="8" data-step="1" value="1" id="">1</button>
    <button type="button" class="btn quantity-button quantity-up outline-0">+</button>
</div>

匿名用户

你的代码没问题,只是放错地方了。 我已经将带有按钮逻辑的代码打包到一个命名函数中。 您将在创建新按钮时使用此函数。

另外,新按钮的HTML应该包装在$(...)中,以便在将它们添加到#content之后存储和使用它们

null

function enableButtons() {
  var spinner = jQuery(this),
    input = spinner.find('.number'),
    btnUp = spinner.find('.quantity-up'),
    btnDown = spinner.find('.quantity-down'),
    val = input.text(),
    min = input.data('min'),
    max = input.data('max');
  spinner.find(".number").text(val);
  btnUp.click(function() {
    var oldValue = parseFloat(input.text());
    if (oldValue >= max) {
      var newVal = oldValue;
    } else {
      var newVal = oldValue + 1;
    }
    spinner.find(".number").text(newVal);
    spinner.find(".number").trigger("change");
  });

  btnDown.click(function() {
    var oldValue = parseFloat(input.text());
    if (oldValue <= min) {
      var newVal = oldValue;
    } else {
      var newVal = oldValue - 1;
    }
    spinner.find(".number").text(newVal);
    spinner.find(".number").trigger("change");
  });

}
$("#add").on("click", function() {
  $("#content").empty();
  for (var i = 0; i < 2; i++) {
    var buttonElements = $(`<div class="btn-group d-flex btn-num-controls quantity" role="group" aria-label="Basic example">
    <button type="button" class="btn quantity-button quantity-down outline-0">-</button>
    <button type="button" class="btn number cart-odqty" data-min="1" data-max="8" data-step="1" value="1" id="">1</button>
    <button type="button" class="btn quantity-button quantity-up outline-0">+</button>
</div>`);
    $("#content").append(buttonElements);

    buttonElements.each(enableButtons);
  }

});

$('.quantity').each(enableButtons);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button id="add">Add Content</button>
<h3>Dynamic <sub> Not Working</sub></h3>

<div id="content"></div>
========================================
<h3>Hard Coded <sub> Working</sub></h3>
<div class="btn-group d-flex btn-num-controls quantity" role="group" aria-label="Basic example">
  <button type="button" class="btn quantity-button quantity-down outline-0">-</button>
  <button type="button" class="btn number cart-odqty" data-min="1" data-max="8" data-step="1" value="1" id="">1</button>
  <button type="button" class="btn quantity-button quantity-up outline-0">+</button>
</div>