javascript - 如何使用新的传入值验证输入框(存在于 Div 容器中)值?
问题描述
我有两个具有多个作为属性的下拉菜单,如果我选择第一个下拉菜单,那么我将附加input type checkbox
到带有所选行的第二个下拉菜单。但是如果我选择第一行并再次取消选择,我会在第二个框中得到重复的选项。
这是我的代码片段
$('.search-box').on("change", function(e) {
var inputVal1 = $(this).val();
$('#checkboxes input:checked').each(function() {
$("#txtSelectedVal").val($("#txtSelectedVal").val()+ $(this).attr('value')+ ", ");
});
var inputVal = (inputVal1) == null ? 0 : inputVal1;
if (inputVal.length) {
$.get("sub_category.php", {term: inputVal}).done(function(data) {
var lclObj = JSON.parse(data);
// $('#checkboxes').empty();
for(var i = 0; i < lclObj.length; i++) {
var lclSubCat = lclObj[i].sub_category1;
$('#checkboxes').append("<input type='checkbox' id='chkBox' value="+lclSubCat+">"+lclSubCat+"<br>");
}
$("#checkboxes :checkbox").each(function() {
var subCat =
$(".txtSelectedValuesSubFromCategory1").html();
var array = subCat.split(",");
$.each(array,function(i) {
$("input[type=checkbox[value='"+array[i]+"']").prop('checked',true);
});
});
});
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="form-group col-sm-6">
<label class="control-label">Category:*</label><br>
<select class="form-control search-box" id="selCategory"
name="selCategory" multiple style="width: 300px;">
<option>1</option>
<option>2</option>
<option>3</option>
</select>
</div>
<div class="multiselect col-sm-6">
<label>Sub Category:</label>
<div class="selectBox form-group">
<select class="form-control">
<option value="">Select an option</option>
</select>
<div class="overSelect"></div>
</div>
<div id="checkboxes">
</div>
</div>
我不想在第二个下拉菜单中显示重复值。我不想使用 empty() 方法,因为我想保留以前选择的复选框。
解决方案
下面是一个如何完成的小例子。
有一些步骤:
- 声明一个数组变量,每次单击复选框时都会更新(
checkedCheckboxes
此处)。 - 当下拉列表的值更改时执行 AJAX 调用。
- 当 AJAX 结束时,您就获得了类别。删除所有现有的复选框,然后通过循环为每个类别创建一个新的复选框。不要忘记检查是否
checkedCheckboxes
包含当前循环的类别以在需要时重新检查它。 - 将事件侦听器添加到这些将更新的复选框
checkedCheckboxes
。
// Here's the variable that keep the checked checkboxes.
let checkedCheckboxes = [];
$('#multiple').on('change', function() {
const values = $(this).val();
// Simulates your AJAX call.
let categories = [];
values.forEach((value) => {
// Avoids to make another loop and to push at each iteration.
categories = [].concat(categories, getCategories(value));
});
// ^^^ Simulating your AJAX call finished.
// Empties the checkbox container.
$('#checkboxes').empty();
// For each got categories...
categories.forEach((cat) => {
// Creates a checkbox <input>.
const checkbox = $('<input>')
.attr('type', 'checkbox')
.val(cat);
// If that category was already checked,
// then check it again.
if (checkedCheckboxes.includes(cat)) {
checkbox.prop('checked', true);
}
// On click on a checkbox...
checkbox.on('change', handleOnClickCheckbox);
// Appends the checkbox to DOM.
$('#checkboxes').append(checkbox, cat);
});
});
// Adds or removes from the concerned variable which checkboxes
// is or isn't checked.
function handleOnClickCheckbox() {
const value = $(this).val(),
isChecked = $(this).is(':checked');
// Keep in memory that that checkbox was checked.
if (isChecked && !checkedCheckboxes.includes(value)) {
checkedCheckboxes.push(value);
} // Removes that checkbox if we are unchecking it.
else if (!isChecked && checkedCheckboxes.includes(value)) {
checkedCheckboxes.splice(checkedCheckboxes.indexOf(value), 1);
}
}
// Simulates ajax.
function getCategories(id) {
const cats = {
'1': ['1-A', '1-B'],
'2': ['2-A'],
'3': ['3-A', '3-B', '3-C']
};
return cats[id];
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select id="multiple" multiple>
<option value="1">Cat 1</option>
<option value="2">Cat 2</option>
<option value="3">Cat 3</option>
</select>
<div id="checkboxes"></div>
在这里,您的代码片段按照我之前所说的步骤进行操作:
// Here's the variable that keep the checked checkboxes.
let checkedCheckboxes = [];
$('.search-box').on('change', function (e) {
// "VAL = A || B" syntax is the same as:
// "VAL = (!VAL) ? 0 : VAL"
const inputVal = $(this).val() || 0;
if (inputVal.length > 0) {
$
.get("sub_category.php", {term: inputVal})
.done(function (data) {
const lclObj = JSON.parse(data);
$('#checkboxes').empty();
for (let item of lclObj) {
const cat = item.sub_category1,
jLabel = $(`<label><input type='checkbox' value=${cat}>${cat}</label>`),
jCheckbox = jLabel.find('input');
// If that category was already checked,
// then check it again.
if (checkedCheckboxes.includes(cat)) {
jCheckbox.prop('checked', true);
}
// On click on a checkbox...
jCheckbox.on('change', handleOnClickCheckbox);
// Appends the label (containing the checkbox) to DOM.
$('#checkboxes').append(jLabel);
}
});
}
});
// Adds or removes from the concerned variable which checkboxes
// is or isn't checked.
function handleOnClickCheckbox() {
const value = $(this).val(),
isChecked = $(this).is(':checked');
// Keep in memory that that checkbox was checked.
if (isChecked && !checkedCheckboxes.includes(value)) {
checkedCheckboxes.push(value);
} // Removes that checkbox if we are unchecking it.
else if (!isChecked && checkedCheckboxes.includes(value)) {
checkedCheckboxes.splice(checkedCheckboxes.indexOf(value), 1);
}
}
推荐阅读
- css - 如何让自定义选择浮动过滤器成为 ag-grid 角度中列的全宽
- c# - 正确处理泛型方法中的初始化
- vue.js - 在 Vue JS 中,如何使我的 APIService.js 类对组件全局可用,而不需要单独的组件导入它?
- apache-kafka - 为什么多个 Kafka 消费者在分组时以不同的速度消费,而不是没有?
- ios - getInitialLink 不起作用,但 onLink 在 react-native-firebase v6 中工作
- python - 在python pandas中将字符串与空格连接的最佳方法
- php - 来自远程服务器的 fopen (php) 仅用于读取
- python - 应用过滤器在 django 中搜索
- r - R闪亮中updateSliderInput的舍入行为
- javascript - 同一页面上的简单联系表成功弹出窗口