29.06.2022, 09:45
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,117
|
|
зависимые селекторы
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.
|
|
29.06.2022, 18:02
|
Новичок на форуме
|
|
Регистрация: 28.06.2022
Сообщений: 8
|
|
Похоже на то, что я хотел, но вот нюанс. Изменил название ссылки AUDI 100, а переход осуществляется на AUDI 80
"AUDI": {
"80": {
url: "p1.html"
},
"100": {
url: "audi100.html"
}
},
|
|
29.06.2022, 18:10
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,117
|
|
VampireFang,
исправил, но если выбрано только AUDI -- будет первая ссылка.
|
|
29.06.2022, 18:15
|
Новичок на форуме
|
|
Регистрация: 28.06.2022
Сообщений: 8
|
|
Спасибо вам огромное!!!) А есть ли возможность сделать для AUDI отдельную ссылку или проще будет первую ссылку подписать "Все модели" и переход будет осуществляться туда сразу при выборе AUDI?
|
|
29.06.2022, 18:41
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,117
|
|
Сообщение от VampireFang
|
А есть ли возможность сделать для AUDI отдельную ссылку
|
да )))
|
|
29.06.2022, 19:03
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,117
|
|
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>
|
|
29.06.2022, 19:47
|
Новичок на форуме
|
|
Регистрация: 28.06.2022
Сообщений: 8
|
|
Все работает! Благодарствую! Ооочень помогли) Хорошего вам дня!
|
|
|
|