javascript - 如何使用 vanilla JS 向下拉列表动态添加更多元素
问题描述
我不能使用 Jquery 或其他任何东西,只能使用 Vanilla Javascript。
我最初的方法是在全局范围内有一个数组来存储每个注册的项目,然后使用 foreach 将一个<option>
子项附加到<select>
,但显然这只会创建一个选项并重命名它
HTML
<label for="productList">Show Products</label>
<select name="products" id="productList">
</select>
JS
let productArray = [];
let dropdown = document.getElementById("productList");
dropdown.addEventListener("click", initializeList());
function initializeList(){
//initializing with an example
productArray.push("PROD1");
productArray.push("PROD2");
productArray.push("PROD3");
productArray.forEach( item => {
option = document.createElement("option");
option.text = item;
dropdown.appendChild(option)
});
}
不幸的是,这不是一种非常有效的方法,因为每次我想添加一些东西时都必须手动创建一个变量。我将创建一个方法,您只需传递一个选项名称并将其添加到下拉选项中。似乎即使它是一个 forEach,添加的每个选项都是相同的。我怎样才能避免这种情况?
解决方案
设置时addEventListener
,您需要发送函数本身,而不是return
值。
在运行函数之前,您还需要测试是否select
已经创建了列表。initializeList
这样你只初始化一次。
let productArray = [];
let dropdown = document.getElementById("productList");
dropdown.addEventListener("click", initializeList); // send initializeList not initializeList()
function initializeList() {
if (productArray.length != 0) { // Don't initialize more than once
return;
}
//initializing with an example
productArray.push("PROD1");
productArray.push("PROD2");
productArray.push("PROD3");
productArray.forEach(item => {
option = document.createElement("option");
option.text = item;
dropdown.appendChild(option)
});
}
<label for="productList">Show Products</label>
<select name="products" id="productList">
</select>
推荐阅读
- r - 在我的基准测试项目中,Base R 对数据集的排序比 dplyr 或 data.table 快得多。为什么是这样?我们都应该使用base R吗?
- typescript - 输入'AxiosResponse
' 缺少来自类型 'countries[]' 的以下属性:length、pop、push、concat - javascript - Vuesjs 3 组合中的计算函数返回 refImpl
- swift - 如果另一个动作在 10 秒内没有完成,如何执行一个动作?
- graphics - 如何驱动基于骨架的 3D 角色的运动?
- python - 如何使用axisartist设置脊柱线的界限?
- algorithm - 计算非重叠间隔的数量
- ubuntu - 在 Linux/Mac 上开发 Ineo+ 458 Print with color
- python - 如何使用 IsolationForest 绘制 3 标签图
- python - 有没有办法使用 ffmpeg 将 RTSP 音频流仅流式传输到标准输出