Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
4 / 4 / 0
Регистрация: 04.07.2013
Сообщений: 27

Снова зависимые списки

22.01.2019, 23:21. Показов 1989. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, форумчане.
подскажите как реализовать: есть два связанных списка, накидал тут по быстрому:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<select id="selectCountry" >
        <option value="0">-- Select Country --</option>
        <option value="Finland">Finland</option>
        <option value="Ukraine">Ukraine</option>
        <option value="Russia">Russia</option>
    </select>
 
    
 
    <select id="city" style = "display:none">
        <option value="0">-- Select City --</option>
        <option value=""></option>
        <option value=""></option>
        <option value=""></option>
    </select>
страны и города, классика

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
                 let select = document.getElementById("selectCountry");
                city = [];
 
                select.addEventListener('change', function() {
            let value = select.options[select.selectedIndex].value;
                selectedCity = document.getElementById("city");
                
                function addCity (city){
                    for (let n = 0; n < city.length; n++)
                        {
                            selectedCity.setAttribute('style',"display:inline");
                            selectedCity[n] = new Option(city[n], n);
                        }
                }
                
                function clearCity() {
                    selectedCity.setAttribute('style',"display:none");
                 }
                switch (value) {
                    case "Finland":
                        city = ["Espoo", "Helsinki", "Turku", "Oulu"];
                        addCity(city);
                        break;
                    
                    case "Ukraine":
                        city = ["Odessa", "Kiev", "Dnepr"];
                        addCity(city);
                        break;
                    
                    case "Russia":
                        city = ["Moscow", "SPB", "Kirov"];
                        addCity(city);
                        break;
 
                    case "0":
                        clearCity();
                        break;
                    
                    default:
                        city = ["-- --", "-- --", "-- --"];
                        break;
                }
    
            });
в массив city сейчас передается массив городов в зависимости от страны, но если кол-во городов не равное, например в первом массиве 4 города, а в остальных по три, то если выбрать первым "Finland", последний город, четвертый, "прикрепляется" к другим массивам. Например при выборе Ukraine, получается массив ["Odessa", "Kiev", "Dnepr"] и "Oulu", хотя его там не должно быть. как пофиксить, кто знает.
Спасибо.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.01.2019, 23:21
Ответы с готовыми решениями:

Зависимые списки, снова списки и проблема
&lt;div class=&quot;t-product__option js-product-option newselect&quot;&gt; &lt;div class=&quot;t-product__option-title t-descr t-descr_xxs...

Зависимые выпадающие списки
Добрый день. прошу помочь в реализации одной задачи. Сразу прошу обратить внимания, опыта очень мало в данном вопросе. Необходимо...

Зависимые списки четырех значений
Добрый день! Как реализовать зависимые списки четырех значений на данном примере? &lt;select id=&quot;country_id&quot;...

6
108 / 76 / 27
Регистрация: 14.11.2016
Сообщений: 260
22.01.2019, 23:54
Попробуйте то же самое, но не засовывая объявления функций в обработчик и не смешивая локальные и глобальный скоупы
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
let select = document.getElementById("selectCountry");
function addCity(city) {
    for (let n = 0; n < city.length; n++)
        {
            selectedCity.setAttribute('style',"display:inline");
            selectedCity[n] = new Option(city[n], n);
        }
}
            
function clearCity() {
    selectedCity.setAttribute('style',"display:none");
}
 
select.addEventListener('change', function() {
    let value = select.options[select.selectedIndex].value;
    selectedCity = document.getElementById("city");
 
    switch (value) {
        case "Finland":
            ["Espoo", "Helsinki", "Turku", "Oulu"];
            addCity(city);
            break;
        
        case "Ukraine":
            let city = ["Odessa", "Kiev", "Dnepr"];
            addCity(city);
            break;
        
        case "Russia":
            let city = ["Moscow", "SPB", "Kirov"];
            addCity(city);
            break;
 
        case "0":
            clearCity();
            break;
        
        default:
            city = ["-- --", "-- --", "-- --"];
            break;
    }
});
з.ы. проверьте только, правил, засыпая)))
1
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
23.01.2019, 09:33
Немножко названия переменных не отражали их смысл. Подправил.
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
</head>
<body>
    <select id="selectCountry">
        <option value="">-- Select Country --</option>
        <option value="Finland">Finland</option>
        <option value="Ukraine">Ukraine</option>
        <option value="Russia">Russia</option>
    </select>
    <select id="city" style="display:none">
        <option value="">-- Select City --</option>
    </select>
    <script>
        let countryEl = document.getElementById("selectCountry"),
            country = "",
            cityEl = document.getElementById("city"),
            cities;
        countryEl.onchange = countryHandler;
 
        function countryHandler() {
            country = countryEl.value;
            if (country) {
                cityEl.style.display = "inline";
                switch (country) {
                    case "Finland":
                        cities = ["Espoo", "Helsinki", "Turku", "Oulu"];
                        addCity(cities);
                        break;
 
                    case "Ukraine":
                        cities = ["Odessa", "Kiev", "Dnepr"];
                        addCity(cities);
                        break;
 
                    case "Russia":
                        cities = ["Moscow", "SPB", "Kirov"];
                        addCity(cities);
                        break;
                }
            }
            else {
                cityEl.style.display = "none";
                cityEl.length = 1;
            }
        }
 
        function addCity(array) {
            cityEl.length = array.length + 1;
            for (let i = 0; i < array.length; i++)
                cityEl[i + 1] = new Option(array[i], i);
        }
    </script>
</body>
</html>
Добавлено через 46 минут
Кстати, лапша из switсh и лапша из if очень плохо подходят для обработки данных.
Исходные данные и были изначально в виде базы данных и надо их использовать тоже в виде массива данных.
Здесь вменяемое решение подобной задачи:
Поведение селекта
1
4 / 4 / 0
Регистрация: 04.07.2013
Сообщений: 27
23.01.2019, 16:53  [ТС]
shsv382, Спасибо, попробовал, но Ваш вариант не сработал
amr-now, Спасибо, вариант работает, но правда мне он кажется немного запутанным чем мой, вроде все понял, но главное не смог - чем принципиально отличается мой код от Вашего, почему Ваш правильно работает а мой нет?
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
23.01.2019, 18:43
Цитата Сообщение от Qazz Посмотреть сообщение
кажется немного запутанным чем мой
Мне показалось, что для массива городов - имя "Города" более понятное, чем "Город"
Там отличия то мелкие. Глазами пройдитесь. Где глаз спотыкался, там немножко правил.
0
11 / 9 / 2
Регистрация: 23.01.2017
Сообщений: 56
23.01.2019, 22:48
Лучший ответ Сообщение было отмечено Qazz как решение

Решение

Qazz, ваша основная ошибка была в том, что в select количество строк было установлено при выборе финляндии - в 4, а у остальных оно 3. Соответственно, 4ый элемент никто не обнулял, он и висел, а остальыне три обновлялись. Было бы длинна у финляндии 5 - висело бы 2 лишних и.т.д.

В примере amr-now при заполнении массива сначала идет установка длинны селекта, равная длинне массива+1(чтобы оставался "-- Select City --") Вот и все. И заполнение со второго элемента. Хотя я бы не писал
JavaScript
1
2
            for (let i = 0; i < array.length; i++)
                cityEl[i + 1] = new Option(array[i], i);
а счетчик сразу со 2 элемента. Как по мне - читается удобнее. Но это совсем уж мелочи, кому как удобнее.
Ну остальные недоработки не по вопросу топа.
1
4 / 4 / 0
Регистрация: 04.07.2013
Сообщений: 27
27.01.2019, 14:31  [ТС]
amr-now, SkyderTM, Спасибо за советы
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.01.2019, 14:31
Помогаю со студенческими работами здесь

Зависимые списки
Добрый день! подскажите, есть такой код. Необходимо, чтобы было 4 списка по порядку зависимые от первого к последнему. И чтобы выбранные...

Зависимые списки в С++
Как можно удобно организовать зависимые списки в C++ ? Очень хороший пример таких списков - список аэропортов в какой-нибудь стране и...

зависимые списки
Добрый день. Есть две таблицы в которых занесены &quot;Области&quot; и &quot;Города&quot;, связаны между собой по коду области. Как сделать чтобы при...

Зависимые списки
Господа форумчане, прошу прощения если задвоил тему, но сил нет больше терпеть) Задача такая: Есть несколько критериев (свойств)...

зависимые списки
как сделать так, чтобы при выборе значения в одном выпадающем списке появлялась, зависимая от этого выбора, выборка значений? (т.е....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru