【发布时间】:2017-03-31 19:33:33
【问题描述】:
TL;DR:
我使用$(..).append(node),但尽管新添加的节点(假设)匹配 jQuery 选择器,但不考虑包含它们。
问题
我在下面有一些使用复选框但模拟单选按钮行为的代码。换句话说,任何时候只能(有效地)选择一个复选框。最多只能选择一个。
如果您运行下面的示例并单击前 3 个复选框,它们的行为将类似于单选按钮。无论您单击多少,都只会选择一个。
但是,如果你添加点,新添加的点将不会被 JS 考虑,即使理论上它也应该抓住它们......
具体说明:您可以选中新添加的复选框,它会在之前已经选中的复选框之外被选中。这是不正确的,因为在任何时候都应该只选择 1 并且应该取消选择所有其他的。
发生了什么?如何将新添加的节点包含到 jQuery 选择器中?
$(function() {
//check first box
$("input.duty:first").prop("checked", true);
//clicking unchecked box should check that box
//unchecks all others
$(".duty").on('click', function(event) {
$("input.duty").prop("checked", false);
$(this).prop("checked", true);
});
$("#addCasePoint").on("click", function() {
var newRowIndex = $('#newRowIndex').text();
var template = $('#casePointTemplate').data('template');
template = template.replace(/__index__/g, newRowIndex);
$('#casePointsFieldset').append(template);
$('#newRowIndex').text(++newRowIndex);
return false;
});
//deletes case point
$("#selection").on("click", ".removeCase", function() {
var caseCount = $('#selection .casePointFieldset').length
if (caseCount === 1) return false; //keep at least one row
$(this).closest("fieldset").remove();
return false;
});
});
.casePointFieldset {
display: inline-block;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form id="selection">
<fieldset id="casePointsFieldset">
<legend>Case Points</legend>
<div id="pointFieldset">
<fieldset class="casePointFieldset">
<div>
<label><span>Duty:</span> <input name="point[1]" class="duty" value="1" type="checkbox"></label>
</div>
<button class="removeCase">Remove</button>
</fieldset>
<fieldset class="casePointFieldset">
<div>
<label><span>Duty:</span> <input name="point[1]" class="duty" value="1" type="checkbox"></label>
</div>
<button class="removeCase">Remove</button>
</fieldset>
<fieldset class="casePointFieldset">
<div>
<label><span>Duty:</span> <input name="point[1]" class="duty" value="1" type="checkbox"></label>
</div>
<button class="removeCase">Remove</button>
</fieldset>
</div>
<!-- include template -->
<span id="casePointTemplate" data-template="<fieldset class="casePointFieldset"><div><label><span>Duty:</span> <input name="point[__index__]" class="duty" value="1" type="checkbox"></label></div><button class="removeCase">Remove</button></fieldset>">
</span>
</fieldset>
<button id="addCasePoint">Add Point</button>
</form>
【问题讨论】:
-
事件委托对您来说是一个很好的主题,可以让您在 Google 上学习一些知识。
标签: javascript jquery html jquery-selectors event-delegation