Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 29.06.2022, 09:45
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

зависимые селекторы
VampireFang,
<!DOCTYPE html>
<html>

<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">
    </style>
    <script>
        document.addEventListener("DOMContentLoaded", function() {
            function generateOptions() {
                return {
                    "AUDI": {
                        "80": {
                            url: "p1.html"
                        },
                        "100": {
                            url: "p1.html"
                        }
                    },
                    "BMW": {
                        "3 series": {
                            url: "p1.html"
                        },
                        "5 series": {
                            url: "p1.html"
                        }
                    }
                };
            }
            const elem = document.querySelector(".chained-selects");
            const selects = Array.from(elem.querySelectorAll("select"));
            const getOptions = (obj, path = []) => Object.keys(path.reduce((obj, key) => obj[key], obj));
            const createOptions = (target, options) => target.append(...options.map(i => new Option(i, i)));
            let options = getOptions(generateOptions());
            let target = selects[0];
            createOptions(target, options);
            const change = ({
                target
            }) => {
                let disabled = false,
                    path = [],
                    last;
                for (let select of selects) {
                    let value = select.value;
                    select.disabled = disabled;
                    if (disabled) select.options.length = 1;
                    if (target === select) {
                        last = true;
                    } else if (!disabled && last) {
                        select.options.length = 1;
                        let options = getOptions(generateOptions(), path);
                        createOptions(select, options);
                    };
                    if (select.selectedIndex === 0) disabled = true;
                    else path.push(value);
                }
            }
            elem.addEventListener("change", change);
            elem.querySelector("button").addEventListener("click", () => {
                let obj = generateOptions();
                for (let {value} of selects) {
                    if (value in obj) obj = obj[value];
                    else {
                        value = Object.keys(obj)[0];
                        obj = obj[value];
                    }
                }
                location.href = obj.url
            });
        })
    </script>
</head>

<body>
    <div class="chained-selects">
        <select class="app-select form-control">
    <option selected>Выберите марку</option>
  </select>
        <select class="app-select form-control" disabled>
    <option selected>Выберите модель</option>
  </select>
        <button>Найти</button>
    </div>
</body>

</html>

Последний раз редактировалось рони, 29.06.2022 в 18:08.
Ответить с цитированием
  #12 (permalink)  
Старый 29.06.2022, 18:02
Новичок на форуме
Отправить личное сообщение для VampireFang Посмотреть профиль Найти все сообщения от VampireFang
 
Регистрация: 28.06.2022
Сообщений: 8

Похоже на то, что я хотел, но вот нюанс. Изменил название ссылки AUDI 100, а переход осуществляется на AUDI 80
"AUDI": {
                   "80": {
                        url: "p1.html"
                        },
                   "100": {
                        url: "audi100.html"
                        }
                    },
Ответить с цитированием
  #13 (permalink)  
Старый 29.06.2022, 18:10
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

VampireFang,
исправил, но если выбрано только AUDI -- будет первая ссылка.
Ответить с цитированием
  #14 (permalink)  
Старый 29.06.2022, 18:15
Новичок на форуме
Отправить личное сообщение для VampireFang Посмотреть профиль Найти все сообщения от VampireFang
 
Регистрация: 28.06.2022
Сообщений: 8

Спасибо вам огромное!!!) А есть ли возможность сделать для AUDI отдельную ссылку или проще будет первую ссылку подписать "Все модели" и переход будет осуществляться туда сразу при выборе AUDI?
Ответить с цитированием
  #15 (permalink)  
Старый 29.06.2022, 18:41
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

Сообщение от VampireFang
А есть ли возможность сделать для AUDI отдельную ссылку
да )))
Ответить с цитированием
  #16 (permalink)  
Старый 29.06.2022, 19:03
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,109

VampireFang,
url пропишите везде, смотрите generateOptions
<!DOCTYPE html>
<html>

<head>
    <title>Untitled</title>
    <meta charset="utf-8">
    <style type="text/css">
    </style>
    <script>
        document.addEventListener("DOMContentLoaded", function() {
            function generateOptions() {
                return {
                    "AUDI": {
                        "80": {
                            url: "p80.html"
                        },
                        "100": {
                            url: "audi100.html"
                        },
                        "url": "AUDI.html"
                    },
                    "BMW": {
                        "3 series": {
                            url: "p3.html"
                        },
                        "5 series": {
                            url: "p5.html"
                        },
                        "url": "BMW.html"
                    },
                    "url": "All.html"
                };
            }
            const elem = document.querySelector(".chained-selects");
            const selects = Array.from(elem.querySelectorAll("select"));
            const getOptions = (obj, path = []) => Object.keys(path.reduce((obj, key) => obj[key], obj)).filter(key => key !== "url");
            const createOptions = (target, options) => target.append(...options.map(i => new Option(i, i)));
            let options = getOptions(generateOptions());
            let target = selects[0];
            createOptions(target, options);
            const change = ({
                target
            }) => {
                let disabled = false,
                    path = [],
                    last;
                for (let select of selects) {
                    let value = select.value;
                    select.disabled = disabled;
                    if (disabled) select.options.length = 1;
                    if (target === select) {
                        last = true;
                    } else if (!disabled && last) {
                        select.options.length = 1;
                        let options = getOptions(generateOptions(), path);
                        createOptions(select, options);
                    };
                    if (select.selectedIndex === 0) disabled = true;
                    else path.push(value);
                }
            }
            elem.addEventListener("change", change);
            elem.querySelector("button").addEventListener("click", () => {
                let obj = generateOptions();
                for (let {
                        value
                    } of selects) {
                    if (value in obj) obj = obj[value];
                    else {
                        if ("url" in obj) break;
                        value = Object.keys(obj)[0];
                        obj = obj[value];
                    }
                }
                location.href = obj.url
            });
        })
    </script>
</head>

<body>
    <div class="chained-selects">
        <select class="app-select form-control">
    <option selected>Выберите марку</option>
  </select>
        <select class="app-select form-control" disabled>
    <option selected>Выберите модель</option>
  </select>
        <button>Найти</button>
    </div>
</body>

</html>
Ответить с цитированием
  #17 (permalink)  
Старый 29.06.2022, 19:47
Новичок на форуме
Отправить личное сообщение для VampireFang Посмотреть профиль Найти все сообщения от VampireFang
 
Регистрация: 28.06.2022
Сообщений: 8

Все работает! Благодарствую! Ооочень помогли) Хорошего вам дня!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выпадающий список leha_iccup Элементы интерфейса 2 26.10.2012 12:50
Как обновить список элементов? boilroom jQuery 2 18.07.2011 20:26
Как правильно скопировать выпадающий список <select ... diiimonn Элементы интерфейса 1 13.06.2011 09:23
ВЫПАДАЮЩИЙ СПИСОК ni_09 Events/DOM/Window 5 20.10.2009 11:27
Как поменять SRC у Img в Pocket IE Maxidrom Events/DOM/Window 2 08.10.2008 15:05