jQuery: Лучшая практика для заполнения раскрывающегося списка?

Пример, который я постоянно вижу, кажется неоптимальным, потому что он включает конкатенацию строк, что не похоже на jQuery. Обычно это выглядит так:

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

Есть ли способ лучше?


person Jeff Putz    schedule 02.05.2009    source источник


Ответы (14)


Андреас Греч был довольно близок ... на самом деле это this (обратите внимание на ссылку на this вместо элемента в цикле):

var $dropdown = $("#dropdown");
$.each(result, function() {
    $dropdown.append($("<option />").val(this.ImageFolderID).text(this.Name));
});
person Jeff Putz    schedule 04.05.2009
comment
Я знаю древнюю историю, но для гуглеров вроде меня, которые только что наткнулись на это, не было бы еще быстрее, если бы вы клонировали элемент <option/> вместо того, чтобы создавать каждый? - person tedders; 11.01.2013
comment
Я так не думаю ... в любом случае он создаст экземпляр нового элемента. - person quillbreaker; 31.01.2014
comment
Хороший! Хотя я думаю, что пример мог бы быть более ясным, если бы элемент был назван #dropdown или около того, поскольку он лучше отражает фактический родительский элемент параметров. - person Anders; 30.03.2015
comment
Я думаю, что сначала создание всех параметров в памяти (со строковой переменной), а затем добавление этой строки в родительский элемент управления выбором должно быть более эффективным, потому что это вызовет только один раз макет страницы - person Wint; 02.07.2015
comment
правда скорость больше :) - person Osama khodrog; 28.02.2016
comment
Это самый быстрый метод и, следовательно, лучший для меня! Спасибо. - person David O'Regan; 08.03.2016
comment
Извините, если получаю уведомления и ничего не вижу. Я удалил свои предыдущие комментарии. Потому что я понял ответ больше после прочтения собственных комментариев :) - person ivange; 21.08.2016

$.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));
    });
});

То, что я делаю выше, - это создание нового элемента <option> и добавление его в список options (при условии, что options - это идентификатор выпадающего элемента.

PS Мой javascript немного устарел, поэтому синтаксис может быть несовершенным

person Andreas Grech    schedule 02.05.2009
comment
Это довольно близко и направило меня в правильном направлении. Смотрите мой ответ ниже. - person Jeff Putz; 04.05.2009
comment
Сладкий! действительно полезно, я уже давно заполняю свои выпадающие списки, и это всегда выглядело непрофессионально - person Kyle; 30.09.2015

Конечно - сделайте 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(''));
});

да. Я все время работаю со струнами. Вы не поверите, но это самый быстрый способ создать фрагмент DOM ... Теперь, если у вас всего несколько вариантов, это не имеет особого значения - используйте технику Дреас демонстрирует, если вам нравится стиль. Но имейте в виду, что вы вызываете внутренний HTML-анализатор браузера i*2 раз, а не один раз, и изменяете DOM каждый раз в цикле ... с достаточным количеством опций. вы в конечном итоге заплатите за это, особенно в старых браузерах.

Примечание. Как указывает Джастис, все развалится, если ImageFolderID и Name не будут закодирован правильно ...

person Shog9    schedule 02.05.2009
comment
Вы должны кодировать result[i].ImageFolderID и result[i].Name как значение атрибута html и текст html соответственно. Я бы не стал предполагать, что они исходят с предварительно закодированного сервера, поскольку я предполагаю, что сервер возвращает json, а не поддельный json. - person yfeldblum; 02.05.2009
comment
@Justice: вы правы, но поскольку в примере Джеффа это пропущено, я тоже. Однако добавлю примечание, спасибо. - person Shog9; 02.05.2009
comment
Я проголосовал за ответ @Ricibald, потому что, как ни странно, на основании этого теста я столкнулся, оказалось, что конкатенация быстрее, чем join практически в каждом браузере. - person weir; 20.07.2012

Или, может быть:

var options = $("#options");
$.each(data, function() {
    options.append(new Option(this.text, this.value));
});
person xinthink    schedule 19.04.2013
comment
var myOptions = {значение1: 'текст1', значение2: 'текст2'}; $ .each (myOptions, function (val, text) {$ ('# mySelect'). append (new Option (text, val));}); - person The Demz; 23.07.2013

Самый быстрый способ такой:

 $.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);
    });

Согласно эта ссылка является самый быстрый способ, потому что вы оборачиваете все в один элемент при любой вставке DOM.

person Ricibald    schedule 01.07.2009
comment
однако с помощью replaceWith вы заменяете выбор в dom и теряете события, уже прикрепленные к выбранному, я думаю, что было бы лучше с options.html (optionsValue), если вы хотите сохранить события - person Geomorillo; 15.11.2014

Я обнаружил, что это работает с сайта jquery

$.getJSON( "/Admin/GetFolderList/", function( data ) {
  var options = $("#dropdownID");
  $.each( data, function(key, val) {
    options.append(new Option(key, val));
  });
});
person binshi    schedule 16.03.2016

Я читал, что использование фрагментов документа является эффективным, потому что он избегает перекомпоновки страницы при каждой вставке элемента DOM, а также хорошо поддерживается всеми браузерами (даже IE 6).

var fragment = document.createDocumentFragment();

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

$("#options").append(fragment);

Я впервые прочитал об этом в курсе CodeSchool по передовым методам работы с JavaScript.

Вот сравнение различных подходов, спасибо автору.

person Dapeng Li    schedule 04.03.2016
comment
Это определенно самый быстрый путь. Еще лучше - пропустите jQuery со всем этим: result.forEach(function(el){var option=document.createElement('option').option.textContent=el.name;option.value=el.ImageFolderID);fragment.appendChild(el); - person dgo; 15.01.2019

Другой подход с 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));
    });
  })
person Israel Perales    schedule 06.05.2016

Я использую плагин jquery selectboxes. Это превращает ваш пример в:

$('#idofselect').ajaxAddOption('/Admin/GetFolderList/', {}, false);
person Brian Yarger    schedule 02.05.2009

Я надеюсь, что это помогает. Я обычно использую функции вместо того, чтобы каждый раз писать весь код.

    $("#action_selector").change(function () {

        ajaxObj = $.ajax({
            url: 'YourURL',
            type: 'POST', // You can use GET
            data: 'parameter1=value1',
            dataType: "json",
            context: this,                
            success: function (data) {
                json: data              
            },
            error: function (request) {
                $(".return-json").html("Some error!");
            }
        });

        json_obj = $.parseJSON(ajaxObj.responseText);            

        var options = $("#selector");
        options.empty();
        options.append(new Option("-- Select --", 0));
        $.each(ajx_obj, function () {
            options.append(new Option(this.text, this.value));
        });
    });
});
person Pablo Rocha Villagra    schedule 04.02.2016

вот пример, который я сделал при изменении, я получаю дочерние элементы первого выбора во втором выборе

jQuery(document).ready(function($) {
$('.your_select').change(function() {
    $.ajaxSetup({
        headers:{'X-CSRF-TOKEN': $("meta[name='csrf-token']").attr('content')}
    });

    $.ajax({
        type:'POST',
        url: 'Link',
        data:{
          'id': $(this).val()
        },
        success:function(r){
          $.each(r, function(res) {
                console.log(r[res].Nom);
                 $('.select_to_populate').append($("<option />").val(r[res].id).text(r[res].Nom));
            });
        },error:function(r) {
          alert('Error');
        }
    });
});

});enter code here

person Abdelghafour Ennahid    schedule 11.12.2017

Для такого новичка, как я, в JavaScript, не говоря уже о JQuery, лучший способ сделать это с помощью JavaScript:

result.forEach(d=>$("#dropdown").append(new Option(d,d)))
person tash    schedule 15.11.2020

Я использую jQuery и вызываю функцию для заполнения раскрывающихся списков.

function loadDropDowns(name,value)
{
   var ddl = "#Categories";
   $(ddl).append('<option value="' + value + '">' + name + "</option>'");
}
person Patrick    schedule 05.09.2016

Ниже приведен способ заполнения раскрывающегося списка с помощью JQuery с идентификатором "FolderListDropDown".

$.getJSON("/Admin/GetFolderList/", function(result) {
    for (var i = 0; i < result.length; i++) {
        var elem = $("<option></option>");
        elem.attr("value", result[i].ImageFolderID);
        elem.text(result[i].Name);
        elem.appendTo($("select#FolderListDropDown"));
     }
});
person Hang Yu    schedule 06.05.2020