在动态呈现的 select 中保留默认选项 - 当默认为 selected 时使输出为 null 并具有相应的结果(Javascript Only Please)
Keep a default option in dynamically rendered select - when default is selected make output null with corresponding result (Javascript Only Please)
我下面有一些代码显示两个 select。名称 Select 根据标记 Select 中的选项 select 过滤。
这一切都很好,但是,我想在名称 Select 中保留一个默认选项,即使在标记 selected 之后也是如此。
无论在标签 Select 中选择了什么,第一个选项都是“请 Select”之类的内容。 - 我仍然希望保留当前功能,因此在单击标签 Select 后,它仍会根据标签 Select 中的内容 Select 在名称 Select 中显示选项 Select .
基本上它会像现在一样运行,但有一个默认选项作为名称的第一个选项。
更新:下面的代码已经用@CharlesEF 提供的答案进行了更新,它适用于这个问题的第一部分。但是,由于答案已在回复中提供,因此我无法将其标记为正确。
我在下面包含了带有其他问题的更新代码。如果默认名称或标签选项“请select”是selected.
,我需要价格输出恢复为空值或默认值
使用当前代码,当名称或标签的“请select”选项被select编辑时,价格输出与之前select编辑的名称保持一致。
let result = [{
name: "some name",
tag: "some tag",
price: "50"
},
{
name: "some name1",
tag: "some tag1",
price: "10"
},
{
name: "some name1-2",
tag: "some tag1",
price: "20"
},
{
name: "some name2",
tag: "some tag2",
price: "30"
},
{
name: "some name2-2",
tag: "some tag2",
price: "40"
}
];
//Generic function to fill a dropdown with options
let populateDropDown = (params) => {
let set = new Set()
params.optionsToPopulate.forEach(item => {
const txt = item[params.text];
if (!set.has(txt)) {
params.element.add(new Option(txt, txt))
set.add(txt);
}
})
}
//Initialize tags dropdown
(function() {
document.getElementById("tags").addEventListener('change', (event) => {
tagChanged(event);
});
let params = {
optionsToPopulate: result,
element: document.getElementById("tags"),
id: "tag",
text: "tag"
}
populateDropDown(params);
})();
//Tags dropdown change event.
let tagChanged = (event) => {
let tagValue = event.target.value;
//filter the results based on the value of tags dropdown
let optionsToAdd = result.filter(item => item.tag === tagValue);
let names = document.getElementById("names");
names.options.length = 1;
let params = {
optionsToPopulate: optionsToAdd,
element: names,
id: "name",
text: "name"
}
populateDropDown(params);
}
//Function to place price in span
let populatePrice = (params) => {
params.priceToPopulate.forEach((item) => {
params.spanElement.innerHTML =
(item[`${params.text}`], item[`${params.text}`]);
});
};
//Initialize price span
(function () {
names.addEventListener("change", (event) => {
nameChanged(event);
});
})();
//Names dropdown change event.
let nameChanged = (event) => {
let nameValue = event.target.value;
//Filter URL results based on the value of names dropdown
let priceToAdd = result.filter((item) => item.name === nameValue);
let priceSpan = document.getElementById("price");
let params = {
priceToPopulate: priceToAdd,
spanElement: priceSpan,
id: "price",
text: "price",
};
populatePrice(params);
};
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
Tags:
<select id="tags">
<option value="please select">please select</option>
</select>
<br><br><br> Names:
<select id="names">
<option value="please select">please select</option>
</select>
<br><br><br> Price:
<span id="price"></span>
</body>
</html>
您可以使用特定标签存储默认值:
let result = [{
name: "default name",
tag: "__$__"
},
{
name: "some name",
tag: "some tag"
},
{
name: "some name1",
tag: "some tag1"
},
{
name: "some name1-2",
tag: "some tag1"
},
{
name: "some name2",
tag: "some tag2"
},
{
name: "some name2-2",
tag: "some tag2"
}
];
然后将您的选择器扩展为:
//filter the results based on the value of tags dropdown
let optionsToAdd = result.filter(item => item.tag === "__$__" || item.tag === tagValue);
这样做的好处是您可以在数据源和渲染之间保持角色分离。
第一个选项
在 HTML 标记中硬编码默认的第一个选项,然后使用 'names.options.length = 1;'。这将保留默认的第一个选项。
第二个选项
在 Javascript 中添加默认的第一个选项,在循环之前填写名称。
您的跨度需要使用 javascript 清除。只需添加 1 行代码,'document.getElementById("price").innerHTML = "";'。您可以将此行放在 'tagChanged' 函数或填充下拉列表的函数中。
编辑:
如果要在选择第一个选项时清除'price',则需要在'tagChanged' 函数中添加一个if 测试。测试选项值是否等于默认第一个选项的值。如果是,清除跨度。
很高兴这有帮助。
我下面有一些代码显示两个 select。名称 Select 根据标记 Select 中的选项 select 过滤。
这一切都很好,但是,我想在名称 Select 中保留一个默认选项,即使在标记 selected 之后也是如此。
无论在标签 Select 中选择了什么,第一个选项都是“请 Select”之类的内容。 - 我仍然希望保留当前功能,因此在单击标签 Select 后,它仍会根据标签 Select 中的内容 Select 在名称 Select 中显示选项 Select .
基本上它会像现在一样运行,但有一个默认选项作为名称的第一个选项。
更新:下面的代码已经用@CharlesEF 提供的答案进行了更新,它适用于这个问题的第一部分。但是,由于答案已在回复中提供,因此我无法将其标记为正确。
我在下面包含了带有其他问题的更新代码。如果默认名称或标签选项“请select”是selected.
,我需要价格输出恢复为空值或默认值使用当前代码,当名称或标签的“请select”选项被select编辑时,价格输出与之前select编辑的名称保持一致。
let result = [{
name: "some name",
tag: "some tag",
price: "50"
},
{
name: "some name1",
tag: "some tag1",
price: "10"
},
{
name: "some name1-2",
tag: "some tag1",
price: "20"
},
{
name: "some name2",
tag: "some tag2",
price: "30"
},
{
name: "some name2-2",
tag: "some tag2",
price: "40"
}
];
//Generic function to fill a dropdown with options
let populateDropDown = (params) => {
let set = new Set()
params.optionsToPopulate.forEach(item => {
const txt = item[params.text];
if (!set.has(txt)) {
params.element.add(new Option(txt, txt))
set.add(txt);
}
})
}
//Initialize tags dropdown
(function() {
document.getElementById("tags").addEventListener('change', (event) => {
tagChanged(event);
});
let params = {
optionsToPopulate: result,
element: document.getElementById("tags"),
id: "tag",
text: "tag"
}
populateDropDown(params);
})();
//Tags dropdown change event.
let tagChanged = (event) => {
let tagValue = event.target.value;
//filter the results based on the value of tags dropdown
let optionsToAdd = result.filter(item => item.tag === tagValue);
let names = document.getElementById("names");
names.options.length = 1;
let params = {
optionsToPopulate: optionsToAdd,
element: names,
id: "name",
text: "name"
}
populateDropDown(params);
}
//Function to place price in span
let populatePrice = (params) => {
params.priceToPopulate.forEach((item) => {
params.spanElement.innerHTML =
(item[`${params.text}`], item[`${params.text}`]);
});
};
//Initialize price span
(function () {
names.addEventListener("change", (event) => {
nameChanged(event);
});
})();
//Names dropdown change event.
let nameChanged = (event) => {
let nameValue = event.target.value;
//Filter URL results based on the value of names dropdown
let priceToAdd = result.filter((item) => item.name === nameValue);
let priceSpan = document.getElementById("price");
let params = {
priceToPopulate: priceToAdd,
spanElement: priceSpan,
id: "price",
text: "price",
};
populatePrice(params);
};
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
Tags:
<select id="tags">
<option value="please select">please select</option>
</select>
<br><br><br> Names:
<select id="names">
<option value="please select">please select</option>
</select>
<br><br><br> Price:
<span id="price"></span>
</body>
</html>
您可以使用特定标签存储默认值:
let result = [{
name: "default name",
tag: "__$__"
},
{
name: "some name",
tag: "some tag"
},
{
name: "some name1",
tag: "some tag1"
},
{
name: "some name1-2",
tag: "some tag1"
},
{
name: "some name2",
tag: "some tag2"
},
{
name: "some name2-2",
tag: "some tag2"
}
];
然后将您的选择器扩展为:
//filter the results based on the value of tags dropdown
let optionsToAdd = result.filter(item => item.tag === "__$__" || item.tag === tagValue);
这样做的好处是您可以在数据源和渲染之间保持角色分离。
第一个选项 在 HTML 标记中硬编码默认的第一个选项,然后使用 'names.options.length = 1;'。这将保留默认的第一个选项。
第二个选项 在 Javascript 中添加默认的第一个选项,在循环之前填写名称。
您的跨度需要使用 javascript 清除。只需添加 1 行代码,'document.getElementById("price").innerHTML = "";'。您可以将此行放在 'tagChanged' 函数或填充下拉列表的函数中。
编辑:
如果要在选择第一个选项时清除'price',则需要在'tagChanged' 函数中添加一个if 测试。测试选项值是否等于默认第一个选项的值。如果是,清除跨度。
很高兴这有帮助。