Добавить возможность выбора элемента с помощью javascript или jquery не работает

У меня есть раскрывающийся список выбора с одним введенным параметром. Я хочу добавить дополнительные параметры в список, используя 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();

В № 4 отсутствует опечатка < в +"/option>". Кроме того, что кажется странным, ничего не работает. Можете ли вы предоставить минимальную выборку данных? Используете ли вы какие-либо <select> плагины, которые изменяют элемент по умолчанию в html-реплику?

charlietfl 12.12.2020 21:06

Отсутствующий < может быть единственной проблемой.

react_or_angluar 12.12.2020 21:15

В данных json есть два элемента. console.info правильно показывает «sma-cross-and-extreme-hi-lo», а следующий элемент правильно показывает «sma-and-env_channel-crossover».

user3217883 12.12.2020 21:16

Я исправил отсутствующий <, но та же проблема

user3217883 12.12.2020 21:17

Хорошо, но если вы предоставите json, мы сможем запустить это. Нам не нужно самим создавать массив, чтобы протестировать ваш код и сделать минимально воспроизводимый пример

charlietfl 12.12.2020 21:17

JSON очень длинный и не внесет ясности в проблему. Пока item.name правильное, это должно быть все, что имеет значение.

user3217883 12.12.2020 21:19

Ну, если вам слишком сложно смоделировать образец, чего вы ожидаете от нас? Пока нет ничего очевидного в том, что показано

charlietfl 12.12.2020 21:20

Измените свой вопрос, чтобы отразить, о чем идет речь сейчас. И прочитайте это json.org/example.html stackoverflow.com/questions/8292050/… opensource.adobe.com/Spry/samples/data_region/…

react_or_angluar 12.12.2020 21:20

Я попытаюсь выяснить, как это сделать. Спасибо за ссылки.

user3217883 12.12.2020 21:31

Очень простой рабочий пример jsfiddle.net/gchvp1f0/1 Чего-то не хватает в том, что вы нам показываете. Возможно, <select> еще не существует?

charlietfl 12.12.2020 21:31

Вау, я поражен тем, как быстро вы это сделали! Спасибо. Я постараюсь переработать свой код на основе вашего примера.

user3217883 12.12.2020 21:34

Я добавил ваш код в качестве попытки № 5, но это тоже не сработало. Попытка № 6 добавляет больше деталей.

user3217883 13.12.2020 19:01
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
12
231
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это должно работать. По крайней мере у меня так было :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 12.12.2020 21:37

@charlietfl о, хорошо, но разве он не создаст объект option только с пустым значением и текстовыми значениями? А позже добавить эти значения? Я не силен в javascript :D

Kristers Dzintars 12.12.2020 21:43

Конечно, просто проще сделать это, когда вы создаете это все, что я предлагал. Пример jsfiddle.net/gchvp1f0/1

charlietfl 12.12.2020 21:44

Да, вы правы, просто в коде было бы на две строки меньше, спасибо за предложение!

Kristers Dzintars 12.12.2020 21:48

Спасибо за ваш вклад. Я добавил это как попытку № 6. Я также добавил больше деталей в эту функцию, которая добавляет элементы из одной и той же структуры json в таблицу. Эта часть работает нормально.

user3217883 13.12.2020 19:02
Ответ принят как подходящий

если вы хотите добавить несколько параметров, вы должны использовать цикл

 $('#selectStrategy').append('<option value = "'+item.name+'">'+item.name+'</option>');

Спасибо за ваш вклад. Это внутри цикла forEach. Но чего я не делал, так это включения двойных кавычек внутри одинарных кавычек. К сожалению, это тоже не сработало. Аргггг!

user3217883 13.12.2020 23:40

Наконец-то я нашел проблему! У меня был другой идентификатор в коде с тем же id = "selectStrategy". Я изменил это на id = "selectStrategy2" и это сработало. Я не знаю, способствовали ли двойные кавычки внутри одинарных кавычек решению, но я приму ваш ответ. Спасибо!

user3217883 13.12.2020 23:48

Другие вопросы по теме