Vanilla JS Master Detail Select
by Jimmy Chandra
HTML
<label for="make">Make:</label> <select id="make"></select>
<label for="model">Model:</label> <select id="model">
</select>
<div>
Selected Car: <span id="selectedMake"></span> <span id="selectedModel"></span>
</div>
CSS
#make, #model { width: 100px; margin-bottom:5px }
JavaScript
(function() {
'use strict';
var obj = {
Ford: {
1: "Focus",
2: "Fiesta"
},
Toyota: {
1: "Prius",
2: "Avensis"
}
};
var manufacturers = Object.keys(obj);
var selectedManufacturer = manufacturers[0];
var models = hashTokeyValuePairArray(obj[selectedManufacturer]);
var selectedModel = models[0];
var selectedCar = { make: selectedManufacturer, model: selectedModel.value };
bindManufacturer();
bindModel();
bindSelectedCar();
function hashTokeyValuePairArray(o) {
var k = Object.keys(o);
return k.map(function(k) { return { key: k, value: o[k] }; });
}
function bindSelectedMake() {
var el = document.getElementById("selectedMake");
el.innerText = selectedManufacturer;
}
function bindSelectedModel() {
var el = document.getElementById("selectedModel");
el.innerText = selectedModel.value;
}
function bindSelectedCar() {
bindSelectedMake();
bindSelectedModel();
selectedCar = { make: selectedManufacturer, model: selectedModel.value };
console.log(selectedCar);
}
function bindManufacturer() {
var el = document.getElementById("make");
var opts = manufacturers.map(function(m) { return "<option>" + m + "</option>"; });
el.innerHTML = opts.join('');
el.options.selectedIndex = 0;
el.addEventListener('change', function() {
selectedManufacturer = manufacturers[this.options.selectedIndex];
models = hashTokeyValuePairArray(obj[selectedManufacturer]);
selectedModel = models[0];
bindModel(true);
bindSelectedCar();
});
}
function bindModel(skipEventBinding) {
var el = document.getElementById("model");
var...