#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>