#jquery #asp.net #html-select
#jquery #asp.net #html-select
Вопрос:
Какой лучший способ добавить <option>...</option>
к выборке, которая была динамически добавлена в dom?
Я имею в виду общий <select>
, который был добавлен впоследствии, вызов ajax. Я хотел бы добавить параметр перед отображением элемента выбора.
Спасибо!
Редактировать
Это функция, которая у меня есть
$.ajax({
type: "get",
url: baseUrl 'MyService.asmx/NewReferent',
data: JSON.stringify({}),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
// Get the referent item from the webservice
var referent = msg.d;
// Render the template with the Referent data
var referentTemplate = $("#referentTemplate").tmpl(referent);
//add button style
$(".button", referentTemplate).button();
//Show the Dialog
$("#referent-dialog").empty().html(referentTemplate).dialog('open');
}
});
Это код, с помощью которого я должен получить параметры с сервера
$.getJson(baseUrl 'MyService.asmx/GetReferentTypes', function (data) {
$.each(data, function (key, value) {
$('#select_id').append($("<option></option>").attr("value", key).text(value));
});
});
ПРАВКА 2
К сожалению, я не могу понять, что происходит с моим кодом. С некоторыми небольшими изменениями в коде @Raynos я смог получить следующие данные JSON с сервера
{"d":
[
{"__type":"Full.Namespace.Path.ReferentType","ReferentTypeID":1,"Description":"option1"},
{"__type":"Full.Namespace.Path.ReferentType","ReferentTypeID":2,"Description":"option2"}
]
}
это неправильно проанализировано при моем $.each()
вызове функции. Теперь у меня есть два вопроса:
- Кто собирается добавить параметр _type?
- Как я могу исправить синтаксический анализ
each()
?
Ответ №1:
$("<select>").append(
$("<option>" , {
text: "foo",
value: "bar"
})
).appendTo("#container");
Хитрость заключается в добавлении параметров перед добавлением элемента выбора к чему-либо.
В качестве альтернативы вы можете скрыть select перед добавлением его в DOM.
псевдокод:
$.when(ajax).then(function(html) {
var foo = $(html);
foo.find("select.SomeClass").hide();
...
});
...
$("select.SomeClass").append($("<option>")).show()
[[Править]]
Используйте простую $.when
магию, чтобы убедиться, что они выполняются в порядке записи. Т.Е. создается шаблон select, затем добавляются опции
$.when(
$.ajax({
type: "get",
url: baseUrl 'MyService.asmx/NewReferent',
data: JSON.stringify({}),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
// Get the referent item from the webservice
var referent = msg.d;
// Render the template with the Referent data
var referentTemplate = $("#referentTemplate").tmpl(referent);
//add button style
$(".button", referentTemplate).button();
//Show the Dialog
$("#referent-dialog").empty().html(referentTemplate).dialog('open');
}
});
}).then(function() {
$.getJson(baseUrl 'MyService.asmx/GetReferentTypes', function (data) {
$.each(data, function (key, value) {
$('#select_id').append($("<option></option>").attr("value", key).text(value));
});
});
});
[[Правка 2]]
Приведите свой пример структуры JSON
$.each(data.d, function (key, value) {
$('#select_id').append(
$("<option></option>")
.attr("value", value.ReferentTypeID)
.text(value.Description)
);
});
Создало бы
<option value="0">option1</option>
<option value="1">option2</option>
Комментарии:
1. Проблема в том, что у меня есть куча разметки, которая возвращается из вызова ajax, и здесь есть мой select. Я должен показать разметку внутри диалогового окна, а перед этим я должен добавить параметры. Как я могу поступить в этом случае?
2. @Lorenzo вы хотите не показывать пустое поле выбора перед добавлением опций?
3. @Raynos показывать это нормально. Я просто запутался в том, куда вставить мой код. Пожалуйста, посмотрите на мой вопрос редактировать для деталей.
4. что
$.when().then()
сделал бы @Lorenzo, чтобы убедиться, что они выполняются в правильном порядке?5. Вау! Это именно то, что я ищу… но, к сожалению, это не работает на сайте mi. Код корректно выполняется в правильном порядке, но никакие опции не добавляются… Я собираюсь немного отладить свой код…
Ответ №2:
Этот простой ответ может помочь вам,
var selectField = $('#' id_of_field);
var empIds = [101, 102, 103];
var empNames = ['X', 'Y', 'Z'];
var options = '';
selectField.empty();
for ( var i = 0, len = empIds.length; i < len; i ) {
options = '<option value="' empIds[i] '">' empNames[i] '</option>';
}
selectField.append(options);