У меня есть раскрывающийся список выбора с одним введенным параметром. Я хочу добавить дополнительные параметры в список, используя javascript или jquery. Я пробовал несколько способов, но ничего не работает. Вот html:
<form class = "form-all">
<label for = "selectStrategy" class = "form-all" onChange = "selectStrategy(this.value);">Select Strategy:</label><br>
<select id = "selectStrategy" width = "400px" name = "selectStrategy" margin-left = "80px">
<option value = "new">New Strategy</option>
</select><br><br>
...
Вот javascript: Попытка №1
function loadStrategies(callback) {
$.getJSON("http://localhost:8080/api/v1/strategies", function(data) {
data.forEach(function (item) {
console.info(item.name);
var select = document.getElementById("selectStrategy");
var option = document.createElement('option');
option.value = item.name;
option.text= item.name;
select.append(option);
Вот попытка №2
function loadStrategies(callback) {
$.getJSON("http://localhost:8080/api/v1/strategies", function(data) {
data.forEach(function (item) {
console.info(item.name);
var select = document.getElementById("selectStrategy");
select.options[select.options.length] = new Option(item.name,item.name);
Вот попытка №3
function loadStrategies(callback) {
$.getJSON("http://localhost:8080/api/v1/strategies", function(data) {
data.forEach(function (item) {
console.info(item.name);
var select = document.getElementById("selectStrategy");
var option = document.createElement('option');
option.value = item.name;
option.innerHTML = item.name;
select.appendChild(option);
Я также пробовал option.text вместо option.innerHTML
Вот попытка №4
function loadStrategies(callback) {
$.getJSON("http://localhost:8080/api/v1/strategies", function(data) {
console.info("strategies getJSON data = ", data);
data.forEach(function (item) {
console.info(item.name);
var option = "<option value = " +item.name +">" +item.name +"</option>";
$('#selectStrategy').append(option);
Во всех случаях ничего не добавляется в список выбора и никаких ошибок в консоли. console.info(item.name) правильно показывает имя, которое я хочу указать в параметрах. Предложения?
РЕДАКТИРОВАТЬ Попытка №5
function loadStrategies() {
$.getJSON('http://localhost:8080/api/v1/strategies')
.then(data => {
const $sel = $('#selectStrategy')
data.forEach(({name})=> $sel.append(new Option(name, name)));
})
}
Попытка №6
function loadStrategies(callback) {
$.getJSON("http://localhost:8080/api/v1/strategies", function(data) {
data.forEach(function (item) {
console.info(item.name);
let option = new Option();
option.innerHTML = item.name;
option.value = item.name;
$('#selectStrategy').appendChild(option);
let row = $('<tr class = "clickable">');
row.append($('<td class = "left">').html(item.name));
row.append($('<td>').html(item.version));
row.append($('<td> class = "right"').html(item.total_return));
$('#strategy').append(row);
});
});
}
В приведенном выше примере я включаю больше элементов, находящихся в том же цикле, но добавляю строки в таблицу. Он отлично работает, так почему же не работает та часть, которая добавляет элементы в список?:
$(document).ready(function () {
loadWatchlist();
loadStrategies();
Отсутствующий < может быть единственной проблемой.
В данных json есть два элемента. console.info правильно показывает «sma-cross-and-extreme-hi-lo», а следующий элемент правильно показывает «sma-and-env_channel-crossover».
Я исправил отсутствующий <, но та же проблема
Хорошо, но если вы предоставите json, мы сможем запустить это. Нам не нужно самим создавать массив, чтобы протестировать ваш код и сделать минимально воспроизводимый пример
JSON очень длинный и не внесет ясности в проблему. Пока item.name правильное, это должно быть все, что имеет значение.
Ну, если вам слишком сложно смоделировать образец, чего вы ожидаете от нас? Пока нет ничего очевидного в том, что показано
Измените свой вопрос, чтобы отразить, о чем идет речь сейчас. И прочитайте это json.org/example.html stackoverflow.com/questions/8292050/… opensource.adobe.com/Spry/samples/data_region/…
Я попытаюсь выяснить, как это сделать. Спасибо за ссылки.
Очень простой рабочий пример jsfiddle.net/gchvp1f0/1 Чего-то не хватает в том, что вы нам показываете. Возможно, <select>
еще не существует?
Вау, я поражен тем, как быстро вы это сделали! Спасибо. Я постараюсь переработать свой код на основе вашего примера.
Я добавил ваш код в качестве попытки № 5, но это тоже не сработало. Попытка № 6 добавляет больше деталей.
Это должно работать. По крайней мере у меня так было :D
let select = document.getElementById('selectStrategy');
let option = new Option();
option.innerHTML = 'Another new strategy';
option.value = 'new-strategy';
select.appendChild(option);
Обратите внимание, что new Option()
принимает значения и текстовые аргументы, что еще больше сокращает это.
@charlietfl о, хорошо, но разве он не создаст объект option только с пустым значением и текстовыми значениями? А позже добавить эти значения? Я не силен в javascript :D
Конечно, просто проще сделать это, когда вы создаете это все, что я предлагал. Пример jsfiddle.net/gchvp1f0/1
Да, вы правы, просто в коде было бы на две строки меньше, спасибо за предложение!
Спасибо за ваш вклад. Я добавил это как попытку № 6. Я также добавил больше деталей в эту функцию, которая добавляет элементы из одной и той же структуры json в таблицу. Эта часть работает нормально.
если вы хотите добавить несколько параметров, вы должны использовать цикл
$('#selectStrategy').append('<option value = "'+item.name+'">'+item.name+'</option>');
Спасибо за ваш вклад. Это внутри цикла forEach. Но чего я не делал, так это включения двойных кавычек внутри одинарных кавычек. К сожалению, это тоже не сработало. Аргггг!
Наконец-то я нашел проблему! У меня был другой идентификатор в коде с тем же id = "selectStrategy". Я изменил это на id = "selectStrategy2" и это сработало. Я не знаю, способствовали ли двойные кавычки внутри одинарных кавычек решению, но я приму ваш ответ. Спасибо!
В № 4 отсутствует опечатка
<
в+"/option>"
. Кроме того, что кажется странным, ничего не работает. Можете ли вы предоставить минимальную выборку данных? Используете ли вы какие-либо<select>
плагины, которые изменяют элемент по умолчанию в html-реплику?