我的要求是选择一顿饭'下拉列表,第二个下拉列表'类别'应该在第一个下拉列表中动态填充与选择相关的值。然后,根据用餐下拉列表中选择的内容,列表应在类别中更改。我编写了以下Javascript函数,但我得到的输出并没有新填充第二个下拉列表。在更改选择时,新列表将被附加到旧列表。
function changecat() {
var selectHTML = "";
var A = ["Soup", "Juice", "Tea", "Others"];
var B = ["Soup", "Juice", "Water", "Others"];
var C = ["Soup", "Juice", "Coffee", "Tea", "Others"];
if (document.getElementById("meal").value == "A") {
var select = document.getElementById('category').options.length;
for (var i = 0; i < select; i++) {
document.getElementById('category').options.remove(i);
}
for (var i = 0; i < A.length; i++) {
var newSelect = document.createElement('option');
selectHTML = "<option value='" + A[i] + "'>" + A[i] + "</option>";
newSelect.innerHTML = selectHTML;
document.getElementById('category').add(newSelect);
}
}
else if (document.getElementById("meal").value == "B") {
var select = document.getElementById('category').options.length;
for (var i = 0; i < select; i++) {
document.getElementById('category').options.remove(i);
}
for (var i = 0; i < B.length; i++) {
var newSelect = document.createElement('option');
selectHTML = "<option value='" + B[i] + "'>" + B[i] + "</option>";
newSelect.innerHTML = selectHTML;
document.getElementById('category').add(newSelect);
}
}
else if (document.getElementById("project").value == "C") {
var select = document.getElementById('category').options.length;
for (var i = 0; i < select; i++) {
document.getElementById('category').options.remove(i);
}
for (var i = 0; i < C.length; i++) {
var newSelect = document.createElement('option');
selectHTML = "<option value='" + C[i] + "'>" + C[i] + "</option>";
newSelect.innerHTML = selectHTML;
document.getElementById('category').add(newSelect);
}
}
}
HTML-
<select name="meal" id="meal" onchange="changecat();">
<option value="">Select</option>
<option value="A">A</option>
<option value="B">B</option>
<option value="C">C</option>
</select>
<select name="category" id="category">
<option value="">Select</option>
</select>
答案 0 :(得分:12)
它可能对你有帮助
<强> HTML 强>
<select name="meal" id="meal" onChange="changecat(this.value);">
<option value="" disabled selected>Select</option>
<option value="A">A</option>
<option value="B">B</option>
<option value="C">C</option>
</select>
<select name="category" id="category">
<option value="" disabled selected>Select</option>
</select>
<强> JS 强>
var mealsByCategory = {
A: ["Soup", "Juice", "Tea", "Others"],
B: ["Soup", "Juice", "Water", "Others"],
C: ["Soup", "Juice", "Coffee", "Tea", "Others"]
}
function changecat(value) {
if (value.length == 0) document.getElementById("category").innerHTML = "<option></option>";
else {
var catOptions = "";
for (categoryId in mealsByCategory[value]) {
catOptions += "<option>" + mealsByCategory[value][categoryId] + "</option>";
}
document.getElementById("category").innerHTML = catOptions;
}
}
实际上JavaScript支持一种循环,即for ... in循环。
for ... in循环只迭代可枚举的属性。对象 从像Array和Object这样的内置构造函数创建的 从Object.prototype和。继承的非可枚举属性 String.prototype,例如String的indexOf()方法或Object&#39 toString()方法。循环将遍历所有可枚举的循环 对象本身的属性以及对象从其继承的属性 构造函数的原型(更接近于对象的属性) 原型链覆盖原型&#39;属性)。
在每次迭代中,对象的一个属性被赋值给变量名,并且这个循环继续,直到对象的所有属性都用完为止。
了解更多Link
答案 1 :(得分:1)
您可以使用onchange
事件并使用带有第一个下拉列表中所选值的switch语句,并根据它将选项附加到第二个列表:
var A= ["Soup", "Juice", "Tea","Others"];
var B= ["Soup","Juice","Water", "Others"];
var C= ["Soup","Juice","Coffee", "Tea","Others"];
var changeCat = function changeCat(firstList) {
var newSel = document.getElementById("category");
//if you want to remove this default option use newSel.innerHTML=""
newSel.innerHTML="<option value=\"\">Select</option>"; // to reset the second list everytime
var opt;
//test according to the selected value
switch (firstList.options[firstList.selectedIndex].value) {
case "A":
for (var i=0; len=A.length, i<len; i++) {
opt = document.createElement("option");
opt.value = A[i];
opt.text = A[i];
newSel.appendChild(opt);
}
break;
case "B":
for (var i=0; len=B.length, i<len; i++) {
opt = document.createElement("option");
opt.value = B[i];
opt.text = B[i];
newSel.appendChild(opt);
}
break;
case "C":
for (var i=0; len=C.length, i<len; i++) {
opt = document.createElement("option");
opt.value = C[i];
opt.text = C[i];
newSel.appendChild(opt);
}
break;
}
}
&#13;
<select name="meal" id="meal" onchange="changeCat(this);">
<option value="">Select</option>
<option value="A">A</option>
<option value="B">B</option>
<option value="C">C</option>
</select>
<select name="category" id="category" size="5">
<option value="">Select</option>
</select>
&#13;
我使用size="5"
和第二个下拉列表查看每个选项的实时结果更改。
答案 2 :(得分:1)
你的代码被追加的原因是因为在用于清除第二个下拉列表的for循环中,不需要更新表达式,因为列表本身正在减小,因此在每次迭代中列表的长度减少,所以你无法清除整个列表。删除功能也应该在if条件之外,以避免冗余.function changecat(){ var selectHTML =&#34;&#34 ;;
return ref.on("value", function(snapshot){
console.log("Val = " + snapshot.val());
},
function (errorObject) {
console.log("The read failed: " + errorObject.code);
});
}