使用jQuery从JavaScript对象添加选项的最佳方法是什么?
我正在寻找一些我不需要插件的东西,但我也会对那些插件感兴趣.
这就是我做的:
selectValues = { "1": "test 1", "2": "test 2" }; for (key in selectValues) { if (typeof (selectValues[key] == 'string') { $('#mySelect').append(''); } }
简洁明了的解决方案:
这是matdumsa的清理和简化版本:
$.each(selectValues, function(key, value) { $('#mySelect') .append($('
来自matdumsa的更改:(1)删除了append()中选项的close标记,(2)将属性/属性移动到map中作为append()的第二个参数.
与其他答案一样,以jQuery方式:
$.each(selectValues, function(key, value) { $('#mySelect') .append($("") .attr("value",key) .text(value)); });
var output = []; $.each(selectValues, function(key, value) { output.push(''); }); $('#mySelect').html(output.join(''));
通过这种方式,您只能"触摸DOM"一次.
我不确定最新的行是否可以转换为$('#mySelect').html(output.join(''))因为我不知道jQuery内部(也许它在html()中进行了一些解析方法)
var list = $("#selectList"); $.each(items, function(index, item) { list.append(new Option(item.text, item.value)); });
var list = document.getElementById("selectList"); for(var i in items) { list.add(new Option(items[i].text, items[i].value)); }
使用DOM Elements Creator插件(我最喜欢的):
$(new Option('myText', 'val')).appendTo('#mySelect');
使用Option
构造函数(不确定浏览器支持):
$("").attr("value", "val").text("myText")).appendTo('#mySelect');
使用Option
(避免额外的工作解析HTML Option
):
$(new Option('myText', 'val')).appendTo('#mySelect');
这看起来更好,提供可读性,但比其他方法慢.
$.each(selectData, function(i, option) { $("").val(option.id).text(option.title).appendTo("#selectBox"); });
如果你想要速度,最快(经过测试!)的方式就是这个,使用数组,而不是字符串连接,并且只使用一个追加调用.
auxArr = []; $.each(selectData, function(i, option) { auxArr[i] = "" + option.title + " "; }); $('#selectBox').append(auxArr.join(''));
@joshperry
似乎普通.append也按预期工作,
$("mySelect").append( $.map(selectValues, function(v,k){ return $("").val(k).text(v); }) );
所有这些答案似乎都不必要地复杂化.所有你需要的是:
var options = $('#mySelect').get(0).options; $.each(selectValues, function(key, value) { options[options.length] = new Option(value, key); });
这完全是跨浏览器兼容的.
var output = []; var length = data.length; for(var i = 0; i < length; i++) { output[i++] = '' + data[i].start + ' '; } $('#choose_schedule').get(0).innerHTML = output.join('');
我做了一些测试,我相信,这项工作最快.:P
转发...我在Android 2.2(Cyanogen 7.0.1)手机(T-Mobile G2)上使用带有PhoneGap 1.0.0的jQuery Mobile 1.0b2并且无法使用.append()方法.我必须使用.html(),如下所示:
var options; $.each(data, function(index, object) { options += '' + object.stop + ' '; }); $('#selectMenu').html(options);
有一种方法使用Microsoft Templating方法,该方法目前正在提议包含在jQuery核心中.使用模板的能力更强,因此对于最简单的情况,它可能不是最佳选择.有关详细信息,请参阅Scott Gu的帖子,其中概述了这些功能.
首先包括可从github获得的模板化js文件.
接下来设置一个模板
然后用你的数据调用.render()方法
var someData = [ { Text: "one", Value: "1" }, { Text: "two", Value: "2" }, { Text: "three", Value: "3"}]; $("#templateOptionItem").render(someData).appendTo("#mySelect");
我已经更详细地发表了这种方法的博客.
我做了类似的事情,通过Ajax加载一个下拉项.上面的响应也是可以接受的,但是为了获得更好的性能,尽可能少地修改DOM总是好的.
因此,不是在循环中添加每个项目,而是最好在循环内收集项目并在完成后附加它.
$(data).each(function(){ ... Collect items })
附加它,
$('#select_id').append(items);
甚至更好
$('#select_id').html(items);
简单的方法是:
$('#SelectId').html("select Laguna ");
前两个答案之间的妥协,在"一线"中:
$.fn.append.apply($('mySelect'), $.map(selectValues, function(val, idx) { return $("") .val(val.key) .text(val.value); }) );
使用map构建一个Option元素数组,然后使用apply
将每个Option作为append
函数的单独参数发送,将它们全部附加到Select .
而不是在任何地方重复相同的代码,我建议你更喜欢编写自己的jQuery函数,如:
jQuery.fn.addOption = function (key, value) { $(this).append($('', { value: key }).text(value)); };
然后添加选项只需执行以下操作:
$('select').addOption('0', 'None');
function populateDropdown(select, data) { select.html(''); $.each(data, function(id, option) { select.append($('').val(option.value).html(option.name)); }); }
它适用于jQuery 1.4.1.
有关在ASP.NET MVC和jQuery中使用动态列表的完整文章,请访问:http: //www.codecapers.com/post/Dynamic-Select-Lists-with-MVC-and-jQuery.aspx
$.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[i].name + ""; } $('#mySelect').html(option);
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将如下所示:
$.each(optionValues0, function(order, object) { key = object.id; value = object.value; $('#mySelect').append($('', { value : key }).text(value)); });
虽然之前的答案都是有效的答案 - 最好先将所有这些答案附加到documentFragmnet,然后将该文档片段作为元素追加到......之后.
看John Resig关于此事的想法 ......
有点像:
var frag = document.createDocumentFragment(); for(item in data.Events) { var option = document.createElement("option"); option.setAttribute("value", data.Events[item].Key); option.innerText = data.Events[item].Value; frag.appendChild(option); } eventDrop.empty(); eventDrop.append(frag);
另一种方法:
var options = []; $.each(selectValues, function(key, value) { options.push($("", { value: key, text: value })); }); $('#mySelect').append(options);
if (data.length != 0) { var opts = ""; for (i in data) opts += ""+data[i][text]+" "; $("#myselect").empty().append(opts); }
这之后首先构建一个巨大的字符串操纵DOM只有一次.
您可以使用以下代码遍历json数组
$('