使用jQuery从JavaScript对象向<select>添加选项的最佳方法是什么?
我正在寻找一些不需要插件的东西,但我也会对现有的插件感兴趣。
这是我所做的:
selectValues = { "1": "test 1", "2": "test 2" };
for (key in selectValues) {
if (typeof (selectValues[key] == 'string') {
$('#mySelect').append('<option value="' + key + '">' + selectValues[key] + '</option>');
}
}
干净/简单的解决方案:
这是matdumsa的清理和简化版本:
$.each(selectValues, function(key, value) {
$('#mySelect')
.append($('<option>', { value : key })
.text(value));
});
matdumsa的更改:(1)删除了append()内选项的close标记,(2)将财产/属性作为append)的第二个参数移动到映射中。
我做了类似的事情,通过Ajax加载一个下拉项。上面的响应也是可以接受的,但是为了更好的性能,尽可能少地修改DOM总是很好的。
因此,与其在循环中添加每个项目,不如在循环中收集项目,并在完成后将其追加。
$(data).each(function(){
... Collect items
})
附加它,
$('#select_id').append(items);
甚至更好
$('#select_id').html(items);
这看起来更好,提供了可读性,但比其他方法慢。
$.each(selectData, function(i, option)
{
$("<option/>").val(option.id).text(option.title).appendTo("#selectBox");
});
如果您想要速度,最快(经过测试)的方法是使用数组,而不是字符串串联,并且只使用一个追加调用。
auxArr = [];
$.each(selectData, function(i, option)
{
auxArr[i] = "<option value='" + option.id + "'>" + option.title + "</option>";
});
$('#selectBox').append(auxArr.join(''));
有一种使用MicrosoftTemplateing方法的方法,目前正在提议将其纳入jQuery核心。使用模板功能更强大,因此对于最简单的场景,它可能不是最佳选项。有关更多详细信息,请参阅Scott Gu概述这些功能的帖子。
首先包括github提供的模板js文件。
<script src="Scripts/jquery.tmpl.js" type="text/javascript" />
下一步设置模板
<script id="templateOptionItem" type="text/html">
<option value=\'{{= Value}}\'>{{= Text}}</option>
</script>
然后使用数据调用.render()方法
var someData = [
{ Text: "one", Value: "1" },
{ Text: "two", Value: "2" },
{ Text: "three", Value: "3"}];
$("#templateOptionItem").render(someData).appendTo("#mySelect");
我在博客中详细介绍了这种方法。
大多数其他答案使用each函数对selectValues进行迭代。这需要为每个元素调用append,并在单独添加每个元素时触发回流。
将此答案更新为更惯用的函数方法(使用现代JS)可以形成为只调用append一次,使用map和option元素构造函数创建一个option元素数组。
使用OptionDOM元素应该可以减少函数调用开销,因为在创建后不需要更新Option元素,也不需要运行jQuery的解析逻辑。
$('mySelect').append($.map(selectValues, (k, v) => new Option(k, v)))
如果您创建一个将新建选项对象的工厂实用程序函数,则可以进一步简化此过程:
const newoption = (...args) => new Option(...args)
然后,这可以直接提供给地图:
$('mySelect').append($.map(selectValues, newoption))
以前的公式
因为append还允许将值作为可变数量的参数传递,所以我们可以预先创建选项元素映射列表,并使用apply将它们作为参数附加到单个调用中。
$.fn.append.apply($('mySelect'), $.map(selectValues, (k, v) => $("<option/>").val(k).text(v)));
在jQuery的后续版本中,append也接受数组参数,这可以稍微简化:
$('mySelect').append($.map(selectValues, (k, v) => $("<option/>").val(k).text(v)))
这个解决方案在Chrome中存在排序问题(jQuery 1.7.1)(Chrome按名称/编号对对象财产进行排序?)所以为了保持秩序(是的,这是滥用对象),我改变了这个:
optionValues0 = {"4321": "option 1", "1234": "option 2"};
到此为止
optionValues0 = {"1": {id: "4321", value: "option 1"}, "2": {id: "1234", value: "option 2"}};
然后每个$.看起来像:
$.each(optionValues0, function(order, object) {
key = object.id;
value = object.value;
$('#mySelect').append($('<option>', { value : key }).text(value));
});
对老@joshberry的回答进行了改进:
看起来plain.append也能像预期的那样工作,
$("#mySelect").append(
$.map(selectValues, function(v,k){
return $("<option>").val(k).text(v);
})
);
或更短,
$("#mySelect").append(
$.map(selectValues, (v,k) => $("<option>").val(k).text(v))
// $.map(selectValues, (v,k) => new Option(v, k)) // using plain JS
);
$.each比for循环慢每次,DOM选择都不是循环$(“#mySelect”).append()中的最佳实践;
因此,最佳解决方案如下
如果JSON数据resp为
[
{"id":"0001", "name":"Mr. P"},
{"id":"0003", "name":"Mr. Q"},
{"id":"0054", "name":"Mr. R"},
{"id":"0061", "name":"Mr. S"}
]
将其用作
var option = "";
for (i=0; i<resp.length; i++) {
option += "<option value='" + resp[i].id + "'>" + resp[i].name + "</option>";
}
$('#mySelect').html(option);
JSON格式:
[{
"org_name": "Asset Management"
}, {
"org_name": "Debt Equity Foreign services"
}, {
"org_name": "Credit Services"
}]
以及jQuery代码,用于填充Ajax成功时下拉列表的值:
success: function(json) {
var options = [];
$('#org_category').html(''); // Set the Dropdown as Blank before new Data
options.push('<option>-- Select Category --</option>');
$.each(JSON.parse(json), function(i, item) {
options.push($('<option/>',
{
value: item.org_name, text: item.org_name
}));
});
$('#org_category').append(options); // Set the Values to Dropdown
}
将HTML选择id设置为以下行。在这里,mySelect用作select元素的id。
var options = $("#mySelect");
然后获取这个场景中的selectValues对象,并将其设置为每个循环的jquery。它将相应地使用对象的值和文本,并将其附加到选项选择中,如下所示。
$.each(selectValues, function(val, text) {
options.append(
$('<option></option>').val(val).html(text)
);
});
当选择下拉列表时,这将显示文本作为选项列表,一旦选择文本,将使用所选文本的值。
Eg.
“1”:“测试1”,“2”:“测试2”,
下拉列表,
显示名称:测试1->值为1显示名称:测试2->值为2
我决定插嘴。
处理先前选择的选项;当我们附加仅使用追加命中DOM一次添加更多选项时处理多个属性演示如何使用对象演示如何使用对象数组进行映射
//对象作为值/desc让selectValues={“1”:“测试1”,“2”:“测试2”,“3”:“测试3”,“4”:“测试四”};//在这里使用div,因为使用“select”会破坏“mySelect”中的原始选定值let opts=$(“<div/>”);让opt={};$.each(选择值,函数(值,描述){opts.append($('<option/>').prop(“value”,value).text(desc));});opts.find(“option”).appendTo('#mySelect');//对象中称为“选项”的对象数组让selectValuesNew={选项:[{值:“1”,description:“2测试1”},{值:“2”,description:“2测试2”,选定:真},{值:“3”,description:“2测试3”},{值:“4”,description:“2测试四”}]};//在这里使用div,因为使用“select”会破坏原始选定值让opts2=$(“<div/>”);让opt2={}//仅在添加所有选项后追加$.map(selectValuesNew.options,函数(val,索引){opts2.append($('<option/>').prop(“值”,val.value).prop(“选定”,值选定).text(值描述));});opts2.find(“option”).appendTo(“#mySelectNew”);<script src=“https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js“></script><select id=“mySelect”><option value=“”selected=“selected”>空</option></选择><select id=“mySelectNew”multiple=“multiple”><option value=“”selected=“selected”>2空</option></选择>
由于JQuery的append可以将数组作为参数,所以我很惊讶没有人建议将其与map一起使用
$('#the_select').append(['a','b','c'].map(x => $('<option>').text(x)));
或减少
['a','b','c'].reduce((s,x) => s.append($('<option>').text(x)), $('#the_select'));