[英]Editing, updating and canceling of table cell text not working using jQuery
我尝试使用 jQuery 更新表中的值。 我希望当我单击“更新”时它会更改值并按原样返回表单。 此外,当我单击“取消”时,它会取消更新。 在我的例子中它不起作用。
$(document).on('click', '.btn-edit', function(e) { var name = $(this).parents("tr").attr('data-name'); var email = $(this).parents("tr").attr('data-email'); $(this).parents("tr").find("td:eq(0)").html('<input name="edit_name" value="' + name + '">'); $(this).parents("tr").find("td:eq(1)").html('<input name="edit_email" value="' + email + '">'); $(this).parents("tr").find("td:eq(2)").prepend("<button class='btn btn-info btn-xs btn-update'>Update</button><button class='btn btn-warning btn-xs btn-cancel'>Cancel</button>") $(this).hide(); }); $(document).on('click', '.btn-update', function(e) { var name = $(this).parents("tr").attr('data-name'); var email = $(this).parents("tr").attr('data-email'); $(this).parents("tr").find("td:eq(0)").text(name); $(this).parents("tr").find("td:eq(1)").text(email); $(this).parents("tr").find(".btn-edit").show(); $(this).parents("tr").find(".btn-update").remove(); $(this).parents("tr").find(".btn-cancel").remove(); }); $(document).on('click', '.btn-cancel', function(e) { var name = $(this).parents("tr").find("input[name='edit_name']").val(); var email = $(this).parents("tr").find("input[name='edit_email']").val(); $(this).parents("tr").find("td:eq(0)").text(name); $(this).parents("tr").find("td:eq(1)").text(email); $(this).parents("tr").attr('data-name', name); $(this).parents("tr").attr('data-email', email); $(this).parents("tr").find(".btn-edit").show(); $(this).parents("tr").find(".btn-cancel").remove(); $(this).parents("tr").find(".btn-update").remove(); });
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script> <div class="container"> <table class="table table-bordered "> <thead> <th>Name</th> <th>Email</th> <th width="200px">Action</th> </thead> <tbody> <tr data-name='marzouk najib' data-email='marzouk@gmail.com'> <td>marzouk najib</td> <td>marzouk@gmail.com</td> <td><button class='btn btn-info btn-xs btn-edit'>Edit</button></td> </tr> </tbody> </table> </div>
在动态创建和删除按钮时,您需要使用委托的事件处理程序。
另外你的逻辑不太对。 单击“更新”按钮而不是“取消”时,您需要更新tr
上的数据属性。
也可以通过将选择器缓存在变量中而不是为每个方法调用重新创建它们来改进逻辑。 此外,您可以使用closest()
而不是parents()
来获取最近的父tr
元素, data()
而不是attr()
来读取数据属性,还可以使用children()
而不是find()
来获取子td
。
话虽如此,试试这个:
$(document).on('click', '.btn-edit', function(e) { let $tr = $(this).hide().closest('tr'); $tr.children("td:eq(0)").html(`<input name="edit_name" value="${$tr.data('name')}">`); $tr.children("td:eq(1)").html(`<input name="edit_email" value="${$tr.data('email')}">`); $tr.children("td:eq(2)").prepend("<button class='btn btn-info btn-xs btn-update'>Update</button><button class='btn btn-warning btn-xs btn-cancel'>Cancel</button>") }); $(document).on('click', '.btn-update', function(e) { let $tr = $(this).closest('tr'); let name = $tr.find('[name="edit_name"]').val(); let email = $tr.find('[name="edit_email"]').val(); $tr.data({ name, email }); $tr.children("td:eq(0)").text(name); $tr.children("td:eq(1)").text(email); $tr.find(".btn-edit").show(); $tr.find(".btn-update, .btn-cancel").remove(); }); $(document).on('click', '.btn-cancel', function(e) { let $tr = $(this).closest('tr'); $tr.children("td:eq(0)").text($tr.data('name')); $tr.children("td:eq(1)").text($tr.data('email')); $tr.find(".btn-edit").show(); $tr.find(".btn-update, .btn-cancel").remove(); });
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script> <div class="container"> <table class="table table-bordered "> <thead> <th>Name</th> <th>Email</th> <th width="200px">Action</th> </thead> <tbody> <tr data-name='marzouk najib' data-email='marzouk@gmail.com'> <td>marzouk najib</td> <td>marzouk@gmail.com</td> <td><button class='btn btn-info btn-xs btn-edit'>Edit</button></td> </tr> </tbody> </table> </div>
创建普通事件侦听器时,它会立即绑定到页面上的现有元素。 所以动态元素不会得到事件监听器。
您可以使用委托来解决 btn-update 事件侦听器的问题,请改用:
$(document).on('click','.btn-update', function(e) {
问题是您正在为 btn-cancel 和 btn-update 设置事件侦听器,当它们尚不存在时,尝试在创建按钮后立即设置事件,或者创建按钮并显示/隐藏取消/更新按钮。
$('.btn-edit').on('click', function(e) { var name = $(this).parents("tr").attr('data-name'); var email = $(this).parents("tr").attr('data-email'); $(this).parents("tr").find("td:eq(0)").html('<input name="edit_name" value="'+name+'"/>'); $(this).parents("tr").find("td:eq(1)").html('<input name="edit_email" value="'+email+'"/>'); $(this).parents("tr").find("td:eq(2)").prepend("<button class='btn btn-info btn-xs btn-update'>Update</button><button class='btn btn-warning btn-xs btn-cancel'>Cancel</button>") $(this).hide(); $('.btn-cancel').on('click', function(e) { var name = $(this).parents("tr").attr('data-name'); var email = $(this).parents("tr").attr('data-email'); $(this).parents("tr").find("td:eq(0)").text(name); $(this).parents("tr").find("td:eq(1)").text(email); $(this).parents("tr").find(".btn-edit").show(); $(this).parents("tr").find(".btn-update").remove(); $(this).parents("tr").find(".btn-cancel").remove(); }); $('.btn-update').on('click', function(e) { var name = $(this).parents("tr").find("input[name='edit_name']").val(); var email = $(this).parents("tr").find("input[name='edit_email']").val(); $(this).parents("tr").find("td:eq(0)").text(name); $(this).parents("tr").find("td:eq(1)").text(email); $(this).parents("tr").attr('data-name', name); $(this).parents("tr").attr('data-email', email); $(this).parents("tr").find(".btn-edit").show(); $(this).parents("tr").find(".btn-cancel").remove(); $(this).parents("tr").find(".btn-update").remove(); }); });
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script> <div class="container"> <table class="table table-bordered "> <thead> <th>Name</th> <th>Email</th> <th width="200px">Action</th> </thead> <tbody> <tr data-name='marzouk najib' data-email='marzouk@gmail.com'> <td>marzouk najib</td> <td>marzouk@gmail.com</td> <td><button class='btn btn-info btn-xs btn-edit'>Edit</button></td> </tr> </tbody> </table> </div>
不需要像其他人一样通过使用事件委托on('click','.btn-update', function(e) {
但我可以给你一些其他建议:
.html()
时要小心,他们可以通过转义引号来嵌入 javascript 和其他 html 标签。 (看看我是如何解决的)$(document).on('click'
最好将其缩小到表格,否则对于您在表格外进行的每次点击,事件侦听器都会在 jQuery 的核心内部触发$(this).parent('tr').find()
这可以缓存并减少查询元素所需的工作量,如果您只是缓存 tr 并将其用作选择器容器$('.class', tr)
看看我是如何在下面解决它的 $('table') .on('click', '.btn-edit', function(e) { const tr = $(this).parents("tr")[0] const { name, email } = tr.dataset $("td:eq(0)", tr).empty().append($('<input>', {name: 'edit_name', value: name})) $("td:eq(1)", tr).empty().append($('<input>', {name: 'edit_email', value: email})) $("td:eq(2)", tr).prepend("<button class='btn btn-info btn-xs btn-update'>Update</button><button class='btn btn-warning btn-xs btn-cancel'>Cancel</button>") $(this).hide() }) .on('click', '.btn-cancel', function(e) { const tr = $(this).parents("tr")[0] const { name, email } = tr.dataset $("td:eq(0)", tr).text(name) $("td:eq(1)", tr).text(email) $(".btn-edit", tr).show() $(".btn-update, .btn-cancel", tr).remove() }) .on('click', '.btn-update', function(e) { const tr = $(this).parents("tr")[0] const name = $("input[name='edit_name']", tr).val() const email = $("input[name='edit_email']", tr).val() tr.dataset.name = name tr.dataset.email = email $("td:eq(0)", tr).text(name) $("td:eq(1)", tr).text(email) $(".btn-edit", tr).show() $(".btn-cancel, .btn-update", tr).remove() })
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script> <div class="container"> <table class="table table-bordered "> <thead> <th>Name</th> <th>Email</th> <th width="200px">Action</th> </thead> <tbody> <tr data-name='marzouk najib' data-email='marzouk@gmail.com'> <td>marzouk najib</td> <td>marzouk@gmail.com</td> <td><button class='btn btn-info btn-xs btn-edit'>Edit</button></td> </tr> </tbody> </table> </div>
但这仍然与我如何处理它相去甚远,我会将逻辑与 js/html 分开
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.