Самописный вариант. Значениями элементов списка станут их порядковые номера (от нуля).
<select id = "sex">
<option value="m" selected>Мужчина</option>
<option value="f">Женщина</option>
<option value="x">Зверев</option>
<option value="?">Другое</option><!-- Данных на это поле нет, соответственно, зависимый селект будет просто очищаться -->
</select>
<select id = "names"></select>
<script>
var dataObject = {
"m": "Пётр,Василий,Сергей,Октавиан",
"f": "Ирина,Светлана,Марина,Евгения",
"x": "Гламур,Звезда,Шоумен,Куафёр"
};
makeRelation = (function () {
function change(slave, data){
var x, dataArray, option;
slave.innerHTML = "";
if (!(this.value in data)){
return false;
}
dataArray = data[this.value].split(",");
for(x = 0; x < dataArray.length; x++) {
option = document.createElement("option");
option.value = String(x);
option.innerHTML = dataArray[x];
slave.appendChild(option);
}
}
return function (master, slave, data) {
master.onchange = function () {
change.call(this, slave, data);
}
master.onchange();
}
})();
makeRelation(gid("sex"), gid("names"), dataObject); // Использование
function gid(txt){
return document.getElementById(txt);
}
</script>
Playground.