javascript - 将函数分配给动态添加的 HTML

标签 javascript jquery

我正在尝试使用 jQuery 和 JavaScript 编写一些代码来设置一个或多个小部件。该小部件接受 input 中的文本,并在单击 button 时将其添加到 ul 中。

然后项目被添加到ul,点击监听器是一个在点击时删除特定项目的设置。

代码如下所示:

    function WidgetThing(className) {
    	
      var items = [];
      
      function removeItem(e) {
        var idx = parseInt($(e.target).attr('data-index'));
        items.splice(idx, 1);
        updateItems();
      }
    
    	function updateItems() {
      	var ul = $('.' + className + ' .items ul');
        ul.html('');
      	items.forEach(function(item, idx) {
        	ul.append('<li data-index="' + idx + '">' + item + '</li>');
        });
        ul.on('click', 'li', removeItem);
      }
    
      $('.' + className + ' .add-button').click(function(e) {
      	var input = $('.' + className + ' input');
      	items.push(input.val());
        input.val('');
        updateItems();
      });
    
    }
    
    $(document).ready(function() {
    	WidgetThing('widget1');
      WidgetThing('widget2');
    });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Widget1
    <div class="widget1">
      <div class="controls">
        <input type="text" />
        <button class='add-button'>Add Item</button>
      </div>
    
      <div class="items">
        <ul></ul>
      </div>
    </div>
    
    Widget2
    <div class="widget2">
      <div class="controls">
        <input type="text" />
        <button class='add-button'>Add Item</button>
      </div>
    
      <div class="items">
        <ul></ul>
      </div>
    </div>

这对于添加项目来说效果很好。

但是,如果我单击该项目将其删除,它也会删除所选项目下方的所有项目。

我怎样才能让这个代码工作?我采取了错误的方法吗?

更新说明:在实际应用中,我的 updateItems() 函数有一些副作用,因此我需要采用这种方法从数组中删除项目。

最佳答案

<强> Working fiddle

这可以用比这更少的代码来实现,您可以将两个事件附加到按钮,另一个附加到用于删除的 li 元素:

$(document).ready(function() {
  $('.add-button').click(function() {
    var items = $(this).closest('.controls').next('.items');
    $('ul', items).append('<li>' + $(this).prev('input').val() + '</li>');
  });

  $('ul').on('click', 'li', function() {
    $(this).remove();
  });
});

这是一个工作片段:

$(document).ready(function() {
  $('.add-button').click(function() {
    var items = $(this).closest('.controls').next('.items');
    $('ul', items).append('<li>' + $(this).prev('input').val() + '</li>');
  });

  $('ul').on('click', 'li', function() {
    $(this).remove();
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Widget1
<div class="widget1">
  <div class="controls">
    <input type="text" />
    <button class='add-button'>Add Item</button>
  </div>

  <div class="items">
    <ul></ul>
  </div>
</div>

Widget2
<div class="widget2">
  <div class="controls">
    <input type="text" />
    <button class='add-button'>Add Item</button>
  </div>

  <div class="items">
    <ul></ul>
  </div>
</div>

关于javascript - 将函数分配给动态添加的 HTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53524922/

相关文章:

javascript - 在.js文件中调用ajax

javascript - 我们可以向用户控件 (.ascx) 发出 ajax 请求吗?

javascript - 如何缩小我的谷歌浏览器扩展程序的 javascript 文件

javascript - 在 Chrome 扩展应用程序中存储设置的位置

javascript - 无法使用 JQuery 获取 asp.net 元素 Text 属性

jquery - 使用 jquery masonry 隐藏元素后重新组织所有元素

php - 将 jquery 发布到 php 时遇到问题

javascript - 使用 Jquery Validator 出现验证错误时如何避免或禁用表单提交

javascript - 替换为jquery函数

javascript - backbone.js 错误 TypeError : this. on is not a function this.on ("change:src", function(){