Kod
const arr = [
[0, 3, 4],
[1],
[2],
[3],
[4],
[5],
[6, 3, 4],
[7, 0, 1, 2],
[8, 0, 1, 2],
[9, 0, 1, 2, 3, 4, 5]
];
function get_el_id(id) {
return document.getElementById(id);
}
var x = [];
function loop_options(option) {
if(x.length > 1) {
x.splice(1,1);
x.push(option.slice());
} else {
x.push(option.slice());
}
x = x.reverse();
if(x.length > 1) {
for(var j=1;j<x[1].length;j++) {
get_el_id('tree_type').children[x[1][j]].disabled = false;
}
}
for(var i=1;i<option.length;i++) {
get_el_id('tree_type').children[option[i]].disabled = true;
}
}
var blank_option2 = false;
function first_non_disabled(option, incrementator, recursive) {
if(option.length-1===get_el_id('tree_type').children.length) {
blank_option2 = true;
let new_option = document.createElement('option');
new_option.selected = true;
get_el_id('tree_type').add(new_option);
get_el_id('tree_type').disabled = true;
} else {
if(blank_option2 === true) {
blank_option2 = false;
get_el_id('tree_type').children[get_el_id('tree_type').children.length-1].remove();
get_el_id('tree_type').disabled = false;
}
if(option[recursive]!==incrementator) {
get_el_id('tree_type').children[incrementator].selected = true;
} else {
recursive++;
incrementator++;
first_non_disabled(option, incrementator, recursive);
}
}
}
function disable_options() {
arr.forEach(function(option) {
if(option[0] === get_el_id('trees').selectedIndex) {
loop_options(option);
first_non_disabled(option, 0, 1);
}
});
}
disable_options();
get_el_id('trees').addEventListener('change', disable_options, false);
Masz, proszę. Tak jak chciałeś, dopisałem nowy "moduł" do kodu. Jeśli będziesz dodawać nowe opcje do
select'a, to będziesz musiał też modyfikować tablicę
arr.
Od elementu
jeden i dalej w podtablicy możesz umieszczać indeksy
option'a, który ma być zablokowany (disabled), przykład:
Kod
const arr = [
[0, 1, 3]
];
Jeśli wybierzesz opcję "oak", czyli
zero (0), to wtedy zablokowane zostaną indeksy
jeden i
trzy (1, 3), czyli "
conifer2" i "
deciduous2".
Powyższy kod dla wybranego
option'a o indeksie
zero z
select'a
pierwszego zablokuje możliwość wyboru
select'owi drugiemu indeksy
jeden i
trzy. W ten sposób właśnie umieszczaj dane w tej tablicy. Najpierw indeks
option'a w pierwszym
select i dalej indeksy, które będą blokowane w drugim
select. Jeśli nic, nie ma być zablokowane w
drugim select, to wtedy możesz umieścić sam tylko indeks, przykład:
Kod
const arr = [
[5]
];
Ten zapis w kodzie nie zablokuje żadnego
option'a w
select drugim, ponieważ jest podany tylko indeks
pierwszego option'a (5 - hazel), a opcje do zablokowania nie są podane, więc nic nie zostanie zablokowane w
drugim select.