设定:
我在表格标题中有2个复选框:批准和隐藏。如果单击“批准”复选框,则将检查以下行中的所有“批准”复选框。同样,如果单击“隐藏”复选框,它将检查下面行中的所有“隐藏”复选框。有一个批准/隐藏所有按钮,用于发出AJAX请求。如果一行中的复选框已更改,我只希望它发出AJAX请求。加载页面时,将会选择一些复选框。
工作原理:
当用户单击行中的复选框(而不是标题)时,.data('changed', true)
会添加到该单个复选框,而AJAX请求只会发送它而不是所有复选框的信息。
什么不行:
当用户点击表格标题中的“批准”或“隐藏”复选框时,它会将.data('changed', true)
添加到以下行中的所有批准或隐藏复选框。
我想要的是什么:
我只想将.data('changed', true)
添加到以下行中已更改的复选框中。我没有结婚使用.data()
,但这对我来说似乎最简单。
代码:
请参阅jsFidde。
HTML:
<div class="table-responsive">
<table class="creatives table table-condensed">
<thead>
<tr>
<th><label class="checkbox-inline"><input type="checkbox" value="Approve">Approve</label></th>
<th><label class="checkbox-inline"><input type="checkbox" value="Hide">Hide</label></th>
</tr>
</thead>
<tbody>
<tr>
<form>
<td>
<input type="checkbox" name="is_feathr_approved" value="Approve" data-crv_id="{{ crv.id }}">
</td>
<td>
<input type="checkbox" name="is_hidden" value="Hide" data-crv_id="{{ crv.id }}">
</td>
</tr>
<tr>
<td>
<input type="checkbox" name="is_feathr_approved" value="Approve" data-crv_id="{{ crv.id }}">
</td>
<td>
<input type="checkbox" name="is_hidden" value="Hide" data-crv_id="{{ crv.id }}">
</td>
</tr>
<tr>
<td colspan="3" align="center"><input type="submit" class="btn btn-success" value="Approve/Hide All"></td>
<td></td>
</form>
</tr>
</tbody>
</table>
</div>
jQuery的:
$("table.creatives th input[type='checkbox'][value='Approve']").click( function () {
$("table.creatives td input[value='Approve']").prop('checked', this.checked);
// this is adding 'changed' to all checkboxes, instead of only the ones that have changed
// $("table.creatives td input[value='Approve']").data('changed', true);
})
$("table.creatives th input[type='checkbox'][value='Hide']").click( function () {
$("table.creatives td input[value='Hide']").prop('checked', this.checked);
// $("table.creatives td input[value='Hide']").data('changed', true);
})
$("table.creatives td input[type='checkbox']").change( function () {
$(this).data('changed', true);
})
其它
答案 0 :(得分:0)
我无法使用.prop()
找到一种方法,而是修改了上面的jQuery。
// get all checkboxes in the header of this particular table
$("table.creatives th input[type='checkbox']").click( function () {
// get all checkboxes in the table cells
const approveHideArray = $("table.creatives td input[type='checkbox']");
const approveHideArrayLength = approveHideArray.length;
for (let i = 0; i < approveHideArrayLength; i++) {
if (this.value === approveHideArray[i].value) {
// if the cell checkboxes are different from the header checkbox, add data-changed=true to it
if (this.checked !== approveHideArray[i].checked) {
$(approveHideArray[i]).data('changed', true);
}
// finally, check the cell checkbox if the header checkbox is checked, or vice versa
approveHideArray[i].checked = this.checked;
} // end if
} // end for
}); // end anonymous function
// this is unchanged from my original post
$("table.creatives td input[type='checkbox']").change( function () {
$(this).data('changed', true);
}); // end anonymous function