【问题标题】:Splice JSON array JavaScript拼接 JSON 数组 JavaScript
【发布时间】:2020-01-10 03:56:01
【问题描述】:

我创建了一个函数来重用 javascript 数组的拼接功能,但是,在我运行一次之后,它就不能被重用了。

var removePerson = function(d, person_id) { 
  var person_index = d.findIndex(i => i.id == person_id);
  d.splice(person_index, 1);
  return d;
};

我没有收到控制台错误。我不知道如何调试它。这是我的JSFiddle

如果您运行该示例,您将看到您可以从列表中删除任何 1 个人,但是当您尝试删除剩余 2 个人中的任何一个时,什么都不会发生(例如控制台错误、控制台响应)。知道如何支持 removePerson() 函数的重用吗?

【问题讨论】:

  • 一旦你重新使用populateList 填充,所有使用$(".delete").on("click" 附加的事件处理程序都消失了 - 你会想要查看Event Delegation - 或者你可以每次调用 populateList 后重新附加事件处理程序

标签: javascript jquery json


【解决方案1】:

由于populateList 的工作方式,您的解决方案不起作用。

在你的populateList,你有一行:

$('#load').empty();

此行清空表格并移除带有click 事件侦听器的按钮。

然后,您添加全新的button.delete,它没有附加任何事件侦听器。

要解决这个问题,您可以将.on() 放入populateList 函数中。

var populateList = function(d) {
    $("#load").empty();
    var new_rows;
    for(var i = 0; i < d.length; i++) {
        new_rows += "<tr>" + 
            "<td>" + d[i].id + "</td>" +
            "<td>" + d[i].name + "</td>" +
            "<td>" + d[i].phone + "</td>" +
            "<td><button class='delete' data-id='" + d[i].id + "'>delete</button></td>" +
            "</tr>";
    }
    $("#load").append(new_rows);

    // delete event
    $(".delete").on("click", function() {
      var delete_sel = $(this).attr("data-id");
      populateList(removePerson(d, delete_sel));
    });
};

这是一个有效的jsFiddle

或者,您可以使用来自this answer 的解决方案(这是一个更清洁的解决方案 imo)。

$("table").on("click",".delete", function() {
  var delete_sel = $(this).attr("data-id");
  populateList(removePerson(data, delete_sel));
});

更多解释为什么他的答案适用于jQuery documentation(查看selector 参数)。

【讨论】:

  • 感谢您解释发生了什么。您的解决方案与@TC Lynks 一样有效。在他们两个之间,你会说哪个更详细?你会说你的是吗,因为它涉及事件委托,正如 Jaromanda X 所提到的那样?
  • 我更喜欢@TCLynks 的实现,因为它利用了事件委托,从逻辑上讲,他的解决方案将具有更好的性能,因为脚本不需要重复添加事件监听器。我的解决方案是为了便于理解。
【解决方案2】:

试试这个代码:JSFiddle

或代码sn-p:

var removePerson = function(d, person_id) {	
	var person_index = d.findIndex(i => i.id == person_id);
	d.splice(person_index, 1);
  return d;
};

var populateList = function(d) {
	$("#load").empty();
	var new_rows;
	for(var i = 0; i < d.length; i++) {
		new_rows += "<tr>" + 
			"<td>" + d[i].id + "</td>" +
			"<td>" + d[i].name + "</td>" +
			"<td>" + d[i].phone + "</td>" +
			"<td><button class='delete' data-id='" + d[i].id + "'>delete</button></td>" +
			"</tr>";
	}
	$("#load").append(new_rows);
};


$(document).ready( function() {

		// initial list
    var data = [
    	{
        "id": 1001,
        "name": "Andy Roy",
        "phone": "555-555-5551"
      },
      {
        "id": 1002,
        "name": "Bob Dillon",
        "phone": "555-555-5552"
      },
      {
        "id": 1003,
        "name": "Carl Sagan",
        "phone": "555-555-5553"
      }
    ];
		
    //initial populate list
    populateList(data);
    
    // delete event
    $("table").on("click",".delete", function() {
      var delete_sel = $(this).attr("data-id");
      populateList(removePerson(data, delete_sel));
    });
    
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table border>
<thead>
<tr><th>ID</th><th>Name</th><th>Phone</th></tr>
</thead>
<tbody id="load"></tbody>
</table>

 $("table").on("click",".delete", function() {
  var delete_sel = $(this).attr("data-id");
  populateList(removePerson(data, delete_sel));
});

【讨论】:

  • 看起来是一个解决方案。所以这是一个 DOM 选择问题?这与缓存内存有关吗?
猜你喜欢
  • 2015-05-18
  • 2017-11-20
  • 1970-01-01
  • 2011-10-29
  • 2010-12-24
  • 2018-10-19
  • 2015-02-22
  • 2018-11-16
  • 1970-01-01
相关资源
最近更新 更多