jquery - 使用内联 jquery 代码删除父级和单击的按钮容器
问题描述
我有这段代码添加了一些表单和按钮
addAdditionalBedroom: function (n) {
//this.bedrooms_number_container = this.bedrooms_number_container + 1;
$("."+n).append("<div class='row blueDiv' id='"+n+"'><div class='col-md-4'> <label>Types Of Beds</label> <select class='form-control'><option>One</option><option>Two</option><option>Three</option><option>Four</option> </select> <br /></div><div class='col-md-4'> <label>Number Of Beds</label> <input type='number' class='form-control' placeholder='Number Of Beds'/></div><div class='col-md-4'> <br /><button id='"+n+"' class='btn btn-danger' onclick='$("+'#'+n+").remove()'>Delete</button></div></div>");
},
当单击按钮时调用上面的函数,因此表单和按钮具有相同的 id(我知道我应该为此使用类)
我希望当单击按钮删除时,它执行一些内联 jquery 代码并删除整个 divblueDiv
以及单击的按钮。
我的内联 jquery 代码看起来像这样
<button id='"+n+"' class='btn btn-danger' onclick='$("+'#'+n+").remove()'>Delete</button>
问题是,onclick 代码形式没有引号,也没有删除整个父级。我怎样才能解决这个问题?
接受的答案是正确的方法,尽管如果有人想保留内联代码,这就是为我解决的问题
addAdditionalBedroom: function (n) {
//this.bedrooms_number_container = this.bedrooms_number_container + 1;
$("."+n).append("<div class='row blueDiv' id='"+n+"'><div class='col-md-4'> <label>Types Of Beds</label> <select class='form-control'><option>One</option><option>Two</option><option>Three</option><option>Four</option> </select> <br /></div><div class='col-md-4'> <label>Number Of Beds</label> <input type='number' class='form-control' placeholder='Number Of Beds'/></div><div class='col-md-4'> <br /><button id='"+n+"' class='btn btn-danger' onclick='$(this).closest(`.row`).remove()'>Delete</button></div></div>");
},
解决方案
不要使用内联 JS 代码、增量 id 或共享 id。所有这些都是反模式,导致的问题多于解决的问题。
为了实现您的目标,请删除重复的增量id
属性,而是使用 DOM 遍历根据单击的“添加”按钮的位置添加内容。
此外,移除内联点击处理程序并为所有“删除”按钮使用单个委托事件处理程序,再次使用 DOM 遍历closest()
方法查找最近的父.row
元素并将其从 DOM 中移除。尝试这个:
let foo = {
addAdditionalBedroom: function($container) {
$container.append('<div class="row blueDiv"><div class="col-md-4"><label>Types Of Beds</label><select class="form-control"><option>One</option><option>Two</option><option>Three</option><option>Four</option> </select><br /></div><div class="col-md-4"><label>Number Of Beds</label><input type="number" class="form-control" placeholder="Number Of Beds"/></div><div class="col-md-4"><br /><button class="btn btn-danger btn-delete" type="button">Delete</button></div></div>');
}
}
// add
$('.add').on('click', e => {
let $house = $(e.target).closest('.house');
foo.addAdditionalBedroom($house);
});
// remove
$(document).on('click', '.btn-delete', e => {
$(e.target).closest('.row').remove();
});
.house {
border: 1px solid #CCC;
padding: 10px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="house">
<button type="button" class="add">Add bedroom</button>
</div>
<div class="house">
<button type="button" class="add">Add bedroom</button>
</div>
<div class="house">
<button type="button" class="add">Add bedroom</button>
</div>
此外,在您的 JS 逻辑中包含这么多 HTML 也是违反最佳实践的。我建议使用模板库,甚至只是克隆 HTML 页面中的隐藏内容并从那里追加。不过,这对于这个问题来说有点离题。
推荐阅读
- c# - 在 Xunit 测试中使用 Moq 库模拟 HttpClient GetAsync
- python - 熊猫 read_csv
- java - Java 测试文件在我作为 Junit Test 运行时工作,而不是作为 Java 应用程序工作
- amazon-web-services - 在无服务器中,SQS 消息总是落后一条消息
- python-2.7 - 基于要插入的列数的 Python + MySQL DB 动态插入查询
- r - 在 ggplot2 中同时使用构面标签和条形标签
- bokeh - Toogle 散景单选按钮组中的单个单选按钮(打开和关闭)
- vhdl - 为什么 Quartus 在我的 if 语句中抛出错误?
- r - 使用 _site.yml 文件时渲染 Xaringan Rmd
- c# - unity 如何在育儿时避免缩放遗产?