jQuery:填充下拉列表的最佳做法?

Jef*_*utz 264 jquery select

我看到的所有时间的例子似乎都不是最理想的,因为它涉及连接字符串,这似乎不是jQuery.它通常看起来像这样:

$.getJSON("/Admin/GetFolderList/", function(result) {
    for (var i = 0; i < result.length; i++) {
        options += '<option value="' + result[i].ImageFolderID + '">' + result[i].Name + '</option>';
    }
});
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

Jef*_*utz 439

Andreas Grech非常接近......实际上this(请注意this循环中的项目而不是项目的引用):

var $dropdown = $("#dropdown");
$.each(result, function() {
    $dropdown.append($("<option />").val(this.ImageFolderID).text(this.Name));
});
Run Code Online (Sandbox Code Playgroud)

  • 太好了!虽然我认为如果元素名称为"#dropdown"左右,示例可能更清晰,因为它更好地反映了选项的实际父元素. (9认同)
  • 我知道这里的古代历史,但对于像我这样偶然发现这一点的谷歌,如果克隆一个`<option />`元素而不是创建每一个元素,那么会不会更快? (5认同)
  • 我认为首先在内存中构造所有选项(使用字符串变量),然后将此字符串附加到父选择控件应该更有效,因为这将只导致一次页面布局 (4认同)
  • 我不这么认为......无论哪种方式,它都会实例化一个新项目. (2认同)

And*_*ech 70

$.getJSON("/Admin/GetFolderList/", function(result) {
    var options = $("#options");
    //don't forget error handling!
    $.each(result, function(item) {
        options.append($("<option />").val(item.ImageFolderID).text(item.Name));
    });
});
Run Code Online (Sandbox Code Playgroud)

我上面做的是创建一个新<option>元素并将其添加到options列表中(假设options是下拉元素的ID).

PS我的javascript有点生疏,所以语法可能不完美


Sho*_*og9 41

当然 - 制作options一个字符串数组并使用.join('')而不是+=每次都通过循环.处理大量选项时性能略有下降......

var options = [];
$.getJSON("/Admin/GetFolderList/", function(result) {
    for (var i = 0; i < result.length; i++) {
        options.push('<option value="',
          result[i].ImageFolderID, '">',
          result[i].Name, '</option>');
    }
    $("#theSelect").html(options.join(''));
});
Run Code Online (Sandbox Code Playgroud)

是.我一直在使用字符串.信不信由你,这是构建DOM片段的最快方式......现在,如果你只有几个选项,那就不重要了 - 如果你喜欢这种风格,请使用Dreas演示的技术.但请记住,您正在调用浏览器的内部HTML解析器i*2时间,而不是仅仅调用一次,并且每次通过循环修改DOM ...具有足够数量的选项.你最终会为此付费,特别是在旧浏览器上.

注:正如法官指出,这也就土崩瓦解了,如果ImageFolderIDName正确编码 ...


xin*_*ink 23

或者可能:

var options = $("#options");
$.each(data, function() {
    options.append(new Option(this.text, this.value));
});
Run Code Online (Sandbox Code Playgroud)

  • var myOptions = { val1 : 'text1', val2 : 'text2' }; $.each(myOptions, function(val, text) { $('#mySelect').append( new Option(text,val) ); }); (5认同)

Ric*_*ald 17

最快的方法是:

 $.getJSON("/Admin/GetFolderList/", function(result) {
        var optionsValues = '<select>';
        $.each(result, function(item) {
            optionsValues += '<option value="' + item.ImageFolderID + '">' + item.Name + '</option>';
        });
        optionsValues += '</select>';
        var options = $('#options');
        options.replaceWith(optionsValues);
    });
Run Code Online (Sandbox Code Playgroud)

根据此链接是最快的方式,因为在进行任何类型的DOM插入时,您将所有内容都包装在单个元素中.


bin*_*shi 11

我发现这是从jquery网站工作

$.getJSON( "/Admin/GetFolderList/", function( data ) {
  var options = $("#dropdownID");
  $.each( data, function(key, val) {
    options.append(new Option(key, val));
  });
});
Run Code Online (Sandbox Code Playgroud)


Dap*_* Li 5

我读过使用文档片段是高效的,因为它避免了每次插入 DOM 元素时的页面重排,所有浏览器(甚至 IE 6)也很好地支持它。

var fragment = document.createDocumentFragment();

$.each(result, function() {
  fragment.appendChild($("<option />").val(this.ImageFolderID).text(this.Name)[0]);
});

$("#options").append(fragment);
Run Code Online (Sandbox Code Playgroud)

我第一次在CodeSchool 的 JavaScript 最佳实践课程中读到了这个。

是不同方法比较,感谢作者。


Isr*_*les 5

ES6的其他方法

fetch('https://restcountries.eu/rest/v1/all')
  .then((response) => {
    return response.json()
  })
  .then((countries) => {
    var options = document.getElementById('someSelect');
    countries.forEach((country) => {
      options.appendChild(new Option(country.name, country.name));
    });
  })
Run Code Online (Sandbox Code Playgroud)