如何动态插入<optgroup>进入列表框
How to dynamically insert a <optgroup> into a listbox
我找不到一个关于如何在选择框中动态插入选项组选项的好例子。我在w3CSchools找到的一个例子似乎只在w3CSchools 中选择了一个项目例子
这是我的代码,我只是在每个组前面插入另一个没有值的选项。我希望在选项列表流出时插入3个组标签作为组选项,这将使它们变为粗体并缩进下面的项目。
var list = aCallBack.docs;
//build document list select options
document.getElementById("delDoc").options.length = 0;
document.getElementById("delDoc").options[0] = new Option("Select Document To Delete", "", true, true);
var optLen = document.getElementById("delDoc").options.length;
document.getElementById("delDoc").options[optLen] = new Option("Job Scope Documents", "", true, true);
for (i = 0; i < list.scope.length; i++) {
var optn = document.createElement("OPTION");
optn.text = list.scope[i];
optn.value = list.scope[i];
document.getElementById("delDoc").options.add(optn);
}
var optLen = document.getElementById("delDoc").options.length;
document.getElementById("delDoc").options[optLen] = new Option("Field Reports", "", true, true);
for (i = 0; i < list.field.length; i++) {
var optn = document.createElement("OPTION");
optn.text = list.field[i];
optn.value = list.field[i];
document.getElementById("delDoc").options.add(optn);
}
var optLen = document.getElementById("delDoc").options.length;
document.getElementById("delDoc").options[optLen] = new Option("Final Reports", "", true, true);
for (i = 0; i < list.final.length; i++) {
var optn = document.createElement("OPTION");
optn.text = list.final[i];
optn.value = list.final[i];
document.getElementById("delDoc").options.add(optn);
}
document.getElementById("delDoc").selectedIndex = 0;
一个不使用jQuery的简单例子会很受欢迎
感谢Teemu的解决方案,我能够在下拉列表中获得组标题。作为一个附带的好处,我还可以通过一个额外的外循环来缩短代码。这是修改后的代码。
this.getFileListResponse = function(msg)
{
aCallBack = JSON.parse(msg);
if (aCallBack.errors.length==0)
{
//simplfy reference to call back results
var list = aCallBack.docs;
//delete any previous entries
document.getElementById("delDoc").options.length=0;
//build document list select options
document.getElementById("delDoc").options[0]=new Option( "Select Document To Delete" , "", true, true);
//double array to store reference to returned records as well as the group header
var groups = [['scope','Job Scope Documents'],['field','Field Reports'],['final','Final Reports']];
for (i = 0; i < 3; i++)
{
var group = document.createElement('optgroup'),
opt = document.createElement('option'),
n;
//retrive group label from groups array
group.label = groups[i][1];
//retrive document name from the call back data stored in list
//in this case I used a single value for both the text and value of the option
// that could easily be expanded into separate items.
for (n = 0; n < list[groups[i][0]].length; n++) {
opt.value = list[groups[i][0]][n];
opt.text = list[groups[i][0]][n];
group.appendChild(opt.cloneNode(true));
}
document.getElementById('delDoc').appendChild(group);
}
}else{
aMsg = '';
for (var i = 0; i < aCallBack.errors.length; i++)
aMsg += aCallBack.errors[i]+''n';
alert(aMsg);
}
};
以下是原始代码和修订代码的前后屏幕截图使用旧代码和使用修订后的代码
只剩下一个烦人的功能。如果用户单击按钮列出文档两次,则组标签将插入两次,即使例程从清除以前的内容开始。这个问题也出现在我在最初的问题中发布的w3cSchools示例中。所以,如果有人能解决这个问题,那就太好了。抱歉,您没有足够的信誉来发布此失败的图片。请查看我在上面发布的w3cSchools中的示例,单击按钮两次以演示问题。
找到了如何删除列表框选项组的解决方案
由于我在两个地方清除了列表框,所以我只创建了这个小方法,并从每个位置调用它。
function clearDocList()
{
var optgrp = ['scope','field','final'];
if (document.getElementById('scope'))
{
for (i=0; i<3; i++)
{
grp = document.getElementById(optgrp[i]);
// remove the group from its parent
grp.parentNode.removeChild(grp);
}
document.getElementById("delDoc").options[0]=new Option( "Select Document To Delete" , "", true, true);
}
}
必须对代码进行另一项更改。由于这个函数需要使用元素id。我不得不像这样为每个组添加一个id。
//retrive group label from groups array
group.id = groups[i][0];
group.label = groups[i][1];
请注意,就在我分配组标签之前,我使用第一个数组值来分配组id。这现在允许我在列表中引用该组。
相关文章:
- 在<页眉>标签
- 如何更改<svg>标记为<img>用js标记
- Ckeditor-plugin:插入虚假元素add不情愿<p>标签前后
- Ajax文件加载和<输入>文件加载
- 为什么要使用0>javascript中的0
- 检测电话窃听,即:<a href="电话:xxx">在UIWebview上
- 下拉框,带有展开的optgroup
- 链接所有<a>Meteor
- 在<输入类型=“;文件“/>
- Div根据<选择>菜单
- 可以<脚本类型=“;text/javascript”>window.location=“/"</
- 如何首先设置样式<td>表中包含在窗体中的元素
- 通过点击<李>在jQuery中
- 正在检测导航到<a name=“;最新主题”></a>
- 将所选类别循环到ul>李用加载更多按钮
- 如何更改<选择>使用angularJS从控制器获得的值
- 使用下拉列表筛选列表(ul>li)
- 这个问号在Flow中意味着什么:“;?()=>“无效”;
- 如何动态插入<optgroup>进入列表框
- 如何在<选择>转换为optgroup