使用jQuery将选项添加到JS对象中的最佳方法是什么?
使用jQuery将选项添加到JSON对象的最佳方法是什么?
我正在寻找一些我不需要插件的东西,但也会对插件有兴趣。
这就是我所做的:
selectValues = { "1": "test 1", "2": "test 2" }; for (key in selectValues) { if (typeof (selectValues[key] == 'string') { $('#mySelect').append('<option value="' + key + '">' + selectValues[key] + '</option>'); } } 干净/简单的解决scheme:
这是matdumsa的清理和简化版本 :
 $.each(selectValues, function(key, value) { $('#mySelect') .append($('<option>', { value : key }) .text(value)); }); 
matdumsa的变化:(1)删除append()中的选项的close标签,(2)将属性/属性作为append()的第二个参数移动到地图中。
与其他答案一样,以jQuery时尚:
 $.each(selectValues, function(key, value) { $('#mySelect') .append($("<option></option>") .attr("value",key) .text(value)); }); 
 var output = []; $.each(selectValues, function(key, value) { output.push('<option value="'+ key +'">'+ value +'</option>'); }); $('#mySelect').html(output.join('')); 
通过这种方式,您只需触摸一次DOM即可。
  我不知道如果最新的行可以转换为$('#mySelect')。html(output.join('')),因为我不知道jQuery的内部(也许它在一些parsingHTML()方法) 
这是更快,更清洁。
 $.each(selectValues, function(key, value) { $('#mySelect').append($("<option/>", { value: key, text: value })); }); 
jQuery的
 var list = $("#selectList"); $.each(items, function(index, item) { list.append(new Option(item.text, item.value)); }); 
纯粹的JavaScript
 var list = document.getElementById("selectList"); for(var i in items) { list.add(new Option(items[i].text, items[i].value)); } 
使用DOM Elements Creator插件 (我最喜欢的):
 $.create('option', {'value': 'val'}, 'myText').appendTo('#mySelect'); 
 使用Option构造函数(不确定浏览器支持): 
 $(new Option('myText', 'val')).appendTo('#mySelect'); 
 使用document.createElement (避免额外的工作用$("<option></option>")parsingHTML $("<option></option>") ): 
 $('#mySelect').append($(document.createElement("option")). attr("value","val").text("myText")); 
这看起来更好,提供可读性,但比其他方法更慢。
 $.each(selectData, function(i, option) { $("<option/>").val(option.id).text(option.title).appendTo("#selectBox"); }); 
如果你想要的速度,最快(testing!)的方式是这样的,使用数组,而不是string连接,并只使用一个附加调用。
 auxArr = []; $.each(selectData, function(i, option) { auxArr[i] = "<option value='" + option.id + "'>" + option.title + "</option>"; }); $('#selectBox').append(auxArr.join('')); 
所有这些答案似乎都不必要的复杂。 所有你需要的是:
 var options = $('#mySelect').get(0).options; $.each(selectValues, function(key, value) { options[options.length] = new Option(value, key); }); 
这是完全跨浏览器兼容。
@joshperry
似乎平原.append也按预期工作,
 $("mySelect").append( $.map(selectValues, function(v,k){ return $("<option>").val(k).text(v); }) ); 
  var output = []; var length = data.length; for(var i = 0; i < length; i++) { output[i++] = '<option value="' + data[i].start + '">' + data[i].start + '</option>'; } $('#choose_schedule').get(0).innerHTML = output.join(''); 
我做了一些testing,我相信,这个工作是最快的。 :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 += '<option value="' + object.id + '">' + object.stop + '</option>'; }); $('#selectMenu').html(options); 
有一种使用微软模板方法的方法 ,目前正在提议将其纳入jQuery核心。 使用模板有更多的权力,所以对于最简单的情况,它可能不是最好的select。 有关更多详情,请参阅Scott Gu的文章概述function。
首先包括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"); 
我已经更详细地讨论了这种方法。
前两个答案之间的妥协,在一个“class轮”:
 $.fn.append.apply($('mySelect'), $.map(selectValues, function(val, idx) { return $("<option/>") .val(val.key) .text(val.value); }) ); 
 使用map构build一个Option元素数组,然后使用apply将它们全部添加到Select中,通过apply将每个Option作为append函数的单独参数发送。 
我做了这样的事情, 通过Ajax加载下拉项目 。 上面的响应也是可以接受的,但是为了获得更好的性能,尽可能less的DOM修改总是很好的。
因此,不要在循环中添加每个项目,最好在循环中收集项目,并在完成后追加项目。
 $(data).each(function(){ ... Collect items }) 
追加它,
 $('#select_id').append(items); 
甚至更好
 $('#select_id').html(items); 
简单的方法是:
 $('#SelectId').html("<option value='0'>select</option><option value='1'>Laguna</option>"); 
 function populateDropdown(select, data) { select.html(''); $.each(data, function(id, option) { select.append($('<option></option>').val(option.value).html(option.name)); }); } 
它适用于jQuery 1.4.1。
有关在ASP.NET MVC&jQuery中使用dynamic列表的完整文章,请访问: http : //www.codecapers.com/post/Dynamic-Select-Lists-with-MVC-and-jQuery.aspx
Chrome浏览器(jQuery 1.7.1)中的解决scheme有一个sorting问题(Chrome通过名称/编号对对象属性进行sorting?)为了保持顺序(是的,它的对象滥用),我改变了这个:
 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($('<option>', { value : key }).text(value)); }); 
虽然以上所有都是有效的答案 – 最好将所有这些附加到文件Fragmnet,然后将该文件片段附加为一个元素后…
见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($("<option/>", { value: key, text: value })); }); $('#mySelect').append(options); 
 if (data.length != 0) { var opts = ""; for (i in data) opts += "<option value='"+data[i][value]+"'>"+data[i][text]+"</option>"; $("#myselect").empty().append(opts); } 
这首先build立一个巨大的string后操纵DOM一次。
我不build议在任何地方重复使用相同的代码,而是build议编写自己的JQuery函数,比如:
 jQuery.fn.addOption = function (key, value) { $(this).append($('<option>', { value: key }).text(value)); }; 
然后添加一个选项只需执行以下操作:
 $('select').addOption('0', 'None'); 
你可以用下面的代码迭代你的json数组
 $('<option/>').attr("value","someValue").text("Option1").appendTo("#my-select-id"); 
一个jQuery插件可以在这里find: http : //remysharp.com/2007/01/20/auto-populating-select-boxes-using-jquery-ajax/ 。
 这就是我所做的二维数组:第一列是我添加到<option> innerHTML的项目,第二列是record_id我添加到<option>的value : 
- 
PHP $items = $dal->get_new_items(); //gets data from the db $items_arr = array(); $i = 0; foreach ($items as $item) { $first_name = $item->first_name; $last_name = $item->last_name; $date = $item->date; $show = $first_name . " " . $last_name . ", " . $date; $request_id = $request->request_id; $items_arr[0][$i] = $show; $items_arr[1][$i] = $request_id; $i++; } echo json_encode($items_arr);
- 
JS / AJAX function ddl_items(){ if (window.XMLHttpRequest){ // code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest(); } else{ // code for IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange=function(){ if (xmlhttp.readyState==4 && xmlhttp.status==200){ var arr = JSON.parse(xmlhttp.responseText); var lstbx = document.getElementById('my_listbox'); for (var i=0; i<arr.length; i++) { var option = new Option(arr[0][i], arr[1][i]); lstbx.options.add(option); } } }; xmlhttp.open("GET","Code/get_items.php?dummy_time="+new Date().getTime()+"",true); xmlhttp.send(); } }
我发现这很简单,效果很好。
 for (var i = 0; i < array.length; i++) { $('#clientsList').append($("<option></option>").text(array[i].ClientName).val(array[i].ID)); }; 
-   $.each比循环慢
-  每次domselect都不是循环$("#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 } 
我把两个最好的答案结合成一个很好的答案。
 var outputConcatenation = []; $.each(selectValues, function(i, item) { outputConcatenation.push($("<option></option>").attr("value", item.key).attr("data-customdata", item.customdata).text(item.text).prop("outerHTML")); }); $("#myselect").html(outputConcatenation.join('')); 
使用$ .map()函数,你可以用更优雅的方式来做到这一点:
 $('#mySelect').html( $.map(selectValues, function(val, key){ return '<option value="' + val + '">'+ key + '</option>'; }).join('') ); 
 $.each(selectValues, function(key, value) { $('#mySelect').append($("<option/>", { value: key, text: value })); });