выпадающий список jquery заполнить данными json

#jquery #json

#jquery #json

Вопрос:

У меня есть следующий код jQuery. Я могу получить следующие данные с сервера [{"value":"1","label":"xyz"}, {"value":"2","label":"abc"}] . Как мне повторить это и заполнить поле выбора с id=combobox

 $.ajax({
    type: 'POST',
    url: "<s:url value="/ajaxMethod.action"/>",
    data:$("#locid").serialize(),
    success: function(data) {
        alert(data.msg);

                //NEED TO ITERATE data.msg AND FILL A DROP DOWN
    },
    error: function(XMLHttpRequest, textStatus, errorThrown) {
        alert(textStatus);
    },
    dataType: "json"
});
  

Также в чем разница между использованием .ajax и $.getJSON .

Комментарии:

1. Какую версию jQuery вы использовали, пользователь373201?

Ответ №1:

Это должно сработать:

 $($.parseJSON(data.msg)).map(function () {
    return $('<option>').val(this.value).text(this.label);
}).appendTo('#combobox');
  

Вот различие между ajax и getJSON (из документации jQuery):

[getJSON] — это сокращенная Ajax-функция, которая эквивалентна:

 $.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});
  

РЕДАКТИРОВАТЬ: чтобы было понятно, часть проблемы заключалась в том, что ответ сервера возвращал объект json, который выглядел следующим образом:

 {
    "msg": '[{"value":"1","label":"xyz"}, {"value":"2","label":"abc"}]'
}
  

…Таким образом, это msg свойство необходимо было проанализировать вручную с помощью $.parseJSON() .

Комментарии:

1. Я получаю следующую ошибку, неперехваченное исключение: Синтаксическая ошибка, нераспознанное выражение: [{«значение»: «1», «метка»:»xyz — abc»}] в этой строке $(data.msg).map(функция () {

2. Ах, конечно. data.msg это просто строка, поэтому ее необходимо преобразовать в объект JS. Для этого я обновил приведенный выше фрагмент кода, но вам, вероятно, следует исправить ответ вашего сервера, чтобы он фактически возвращал объект ‘msg’ напрямую, а не сначала кодировал его как строку.

3. @namuol Я знаю, что это старый вопрос-ответ, и, по-видимому, вы получили много положительных отзывов, но у меня была такая же ошибка, когда я создавал объект JSON, анализировал и помещал данные в новый массив. Это выглядело похоже на то, что вы добавили в своей правке, за исключением того, что я использовал имена людей в label , так что это было похоже Doe, John Q . Это выдало мне ошибку в строке массива 1, поле 2, я думаю, что это описано как. Если бы я просто сделал $.each(dataArray, function () { $("#combobox").append($("<option></option>").val(this['value']).html(this['label'])); }); , это работает отлично. Итак, мне интересно, почему parseJSON не сработало бы. Может быть, имя?

Ответ №2:

Если ваши данные уже находятся в форме массива, это действительно просто с помощью jQuery:

  $(data.msg).each(function()
 {
     alert(this.value);
     alert(this.label);

     //this refers to the current item being iterated over

     var option = $('<option />');
     option.attr('value', this.value).text(this.label);

     $('#myDropDown').append(option);
 });
  

.ajax() является более гибким, чем .getJSON() — во-первых, getJSON предназначен специально как GET-запрос для извлечения json; ajax () может запрашивать любой глагол для возврата любого типа контента (хотя иногда это бесполезно). getJSON внутренне вызывает .ajax().

Комментарии:

1. Просто рекомендация. Создайте весь HTML-код и сохраните его в переменной. По завершении добавьте весь html сразу, используя вместо этого .html() . Это ускорит процесс, если у вас будет много вариантов.

2. Спасибо за воспроизведение и комментарий. Я получаю следующую ошибку, неперехваченное исключение: Синтаксическая ошибка, нераспознанное выражение: [{«значение»: «1», «метка»:»xyz — abc»}] в этой строке $(data.msg).each(функция(){

3. Я предполагаю, что ваши данные поступают в поле data.msg. Если это все возвращаемые данные, вы просто делаете $(data).each .

4. Я вижу, что сервер заключает строку json в двойные кавычки в начале и конце. на самом деле возвращается «[{«значение»: «1», «метка»:»xyz — abc»}]». существует ли метод js / jquery для преобразования в json или я должен использовать string replace для удаления начальных и конечных кавычек

Ответ №3:

Вот пример кода, который пытается извлечь данные AJAX из /Ajax/_AjaxGetItemListHelp/ URL. При успешном выполнении он удаляет все элементы из выпадающего списка с помощью id = OfferTransModel_ItemID , а затем заполняет его новыми элементами на основе результата вызова AJAX:

 if (productgrpid != 0) {    
    $.ajax({
        type: "POST",
        url: "/Ajax/_AjaxGetItemListHelp/",
        data:{text:"sam",OfferTransModel_ItemGrpid:productgrpid},
        contentType: "application/json",              
        dataType: "json",
        success: function (data) {
            $("#OfferTransModel_ItemID").empty();

            $.each(data, function () {
                $("#OfferTransModel_ItemID").append($("<option>                                                      
                </option>").val(this['ITEMID']).html(this['ITEMDESC']));
            });
        }
    });
}
  

Ожидается, что возвращаемый результат AJAX вернет данные, закодированные в виде массива AJAX, где каждый элемент содержит элементы ITEMID и ITEMDESC . Например:

 {
    {
        "ITEMID":"13",
        "ITEMDESC":"About"
    },
    {
        "ITEMID":"21",
        "ITEMDESC":"Contact"
    }
}
  

OfferTransModel_ItemID Поле списка заполняется указанными выше данными, и его код должен выглядеть следующим образом:

 <select id="OfferTransModel_ItemID" name="OfferTransModel[ItemID]">
    <option value="13">About</option>
    <option value="21">Contact</option>
</select>
  

Когда пользователь выбирает About , форма отправляет 13 значение для этого поля и 21 когда пользователь выбирает Contact и так далее.

Вы можете изменить приведенный выше код, если ваш сервер возвращает URL в другом формате.

Комментарии:

1. Не могли бы вы, пожалуйста, описать свой ответ, а также код публикации? В нынешнем виде это не особенно полезно.

2. внешние скобки должны быть квадратными [, ], поскольку это массив

Ответ №4:

В большинстве компаний требовалась общая функциональность для нескольких выпадающих списков для всех страниц. Просто вызовите функции или передайте свои (DropDownID, jsonData, KeyValue, textValue)

     <script>

        $(document).ready(function(){

            GetData('DLState',data,'stateid','statename');
        });

        var data = [{"stateid" : "1","statename" : "Mumbai"},
                    {"stateid" : "2","statename" : "Panjab"},
                    {"stateid" : "3","statename" : "Pune"},
                     {"stateid" : "4","statename" : "Nagpur"},
                     {"stateid" : "5","statename" : "kanpur"}];

        var Did=document.getElementById("DLState");

        function GetData(Did,data,valkey,textkey){
          var str= "";
          for (var i = 0; i <data.length ; i  ){

            console.log(data);


            str = "<option value='"   data[i][valkey]   "'>"   data[i][textkey]   "</option>";

          }
          $("#" Did).append(str);
        };    </script>

</head>
<body>
  <select id="DLState">
  </select>
</body>
</html>