习惯用jQuery将列表框中的所有选项都用逗号分隔的字符串?

Cad*_*oux 7 javascript jquery dom

其中lb是一个列表框,txtfield是一个文本框,此代码获取选项的所有值,将它们放在一个数组中并使其成为逗号分隔的列表:

var arr = [];
for (var i = 0; i < lb.length; i++) {
    arr[i] = lb.options[i].value;
}
txtfield.value = arr.join(',');
Run Code Online (Sandbox Code Playgroud)

lb.options.toString()显然不起作用,因为它是一个选项数组(值和文本).我没有找到比这更多的succint.

jQuery的方法是什么?我试着乱搞$(lb).each(),但似乎无法让它以同样的方式工作.

use*_*716 13

txtfield.value = $(lb.options).map(function() { 
                                       return this.value; 
                                   }).get().join(',');
Run Code Online (Sandbox Code Playgroud)

用于.map()通过返回value每个jQuery对象来创建jQuery对象option,然后用于.get()从对象中提取Array.


编辑:作为@Nick Craver在下面的评论指出,如果需要获得最佳性能(使用jQuery),它更有意义使用$.map()变化,因为你已经有一个集合.详情请见他的回答.


编辑:要获得更好的性能,请执行for循环,但缓存对属性的引用.它有所作为.

var arr = [], opts = lb.options, len = opts.length;
for (var i = 0; i < len; i++) {
    arr[i] = opts[i].value;
}
txtfield.value = arr.join(',');
Run Code Online (Sandbox Code Playgroud)

  • 在这些情况下,使用`jQuery.map()`要好得多浪费/更快,你可以在这里测试它:http://jsperf.com/map-vs-jquery-map (2认同)

Nic*_*ver 6

jQuery版本是.map()这样的:

var arr = $(lb).find("option").map(function() { return this.value; }).get();
txtfield.value = arr.join(',');
Run Code Online (Sandbox Code Playgroud)

或者$.map()像这样快一点:

var arr = $.map(lb.options, function(o) { return o.value; });
txtfield.value = arr.join(',');
Run Code Online (Sandbox Code Playgroud)

但是,两者都比循环效率低得多for,请使用您已有的纯JavaScript版本.


Qui*_*son 5

map()..

$('#lbID option').map(function() {
  return $(this).val();
}).get().join(',');
Run Code Online (Sandbox Code Playgroud)