I have an old old JavaScript code that should allow a user to select a country first to then activate the counties list for that country option. On load the option of the country says ANY and the option to the counties label should say select Choose a country first but it doesn’t. Only if a user selects a country first and then going back to select ANY, the select a county first condition appears.
I am not good at all with JavaScript, not mention jQuery. How to correct the existing js or even achieve what I want with much better lean code?
Thank you for your help in advance.
<div>
<label id="country">Country of birth:</label>
<select name="country" tabindex="7" onchange="populateCountiesDropdown(this[this.selectedIndex].value);">
<option value="">Any</option>
<option value="ENGLAND">England</option>
<option value="IRELAND">Ireland</option>
<option value="SCOTLAND">Scotland</option>
<option value="WALES">Wales</option>
</select>
<script type="text/javascript">
setSelect(document.main.country, '');
</script>
</div>
<div>
<label id="county">County of birth:</label>
<select name="county" tabindex="8">
</select>
<script type="text/javascript">
populateCountiesDropdown(document.main.country.value);
setSelect(document.main.county, "");
</script>
</div>
<script type="text/javascript">
var counties_dropdown = new Array();
counties_dropdown["ENG"] = new Array(" |All counties in country" ,"BDF|Bedfordshire","BRK|Berkshire","BKM|Buckinghamshire","CAM|Cambridgeshire","CHI|Channel Islands","CHS|Cheshire","CON|Cornwall","CUL|Cumberland","DBY|Derbyshire","DEV|Devon","DOR|Dorset","DUR|Durham","ESS|Essex","GLS|Gloucestershire","HAM|Hampshire","HEF|Herefordshire","HRT|Hertfordshire","HUN|Huntingdonshire","IOM|Isle of Man","KEN|Kent","LAN|Lancashire","LEI|Leicestershire","LIN|Lincolnshire","LND|London","MDX|Middlesex","NFK|Norfolk","NTH|Northamptonshire","NBL|Northumberland","NTT|Nottinghamshire","OXF|Oxfordshire","RUT|Rutlandshire","SAL|Shropshire","SOM|Somerset","STS|Staffordshire","SFK|Suffolk","SRY|Surrey","SSX|Sussex","WAR|Warwickshire","WES|Westmorland","WIL|Wiltshire","WOR|Worcestershire","YKS|Yorkshire" );
counties_dropdown["IRL"] = new Array(" |All counties in country" ,"ANT|Antrim","ARM|Armagh","CAR|Carlow","CAV|Cavan","CLA|Clare","COR|Cork","LDY|Derry (Londonderry)","DON|Donegal","DOW|Down","DUB|Dublin","FER|Fermanagh","GAL|Galway","KER|Kerry","KID|Kildare","KIK|Kilkenny","OFF|Kings (Offaly)","LET|Leitrim","LIM|Limerick","LOG|Longford","LOU|Louth","MAY|Mayo","MEA|Meath","MOG|Monaghan","NAI|Nairnshire","LEX|Queens (Laois)","ROS|Roscommon","SLI|Sligo","TIP|Tipperary","TYR|Tyrone","WAT|Waterford","WEM|Westmeath","WEX|Wexford","WIC|Wicklow" );
counties_dropdown["SCT"] = new Array(" |All counties in country" ,"ABD|Aberdeenshire","ARL|Argyllshire","AYR|Ayrshire","BAN|Banffshire","BEW|Berwickshire","BUT|Buteshire","CAI|Caithness","CLK|Clackmannanshire","DFS|Dumfriesshire","DNB|Dunbartonshire","FIF|Fife","ANS|Forfarshire (Angus)","ELN|Haddingtonshire (East Lothian)","INV|Invernessshire","KCD|Kincardineshire","KRS|Kinrossshire","KKD|Kirkcudbrightshire","LKS|Lanarkshire","WLN|Linlithgowshire (West Lothian)","MLN|Midlothian","MOR|Morayshire","PEE|Peeblesshire","PER|Perthshire","RFW|Renfrewshire","ROC|Ross and Cromarty","ROX|Roxburghshire","SEL|Selkirkshire","SHI|Shetland Islands","STI|Stirlingshire","SUT|Sutherland","WIG|Wigtownshire" );
counties_dropdown["WLS"] = new Array(" |All counties in country" ,"AGY|Anglesey","BRE|Brecknockshire","CAE|Caernarvonshire","CGN|Cardiganshire","CMN|Carmarthenshire","DEN|Denbighshire","FLN|Flintshire","GLA|Glamorganshire","MER|Merionethshire","MON|Monmouthshire","MGY|Montgomeryshire","PEM|Pembrokeshire","RAD|Radnorshire" );
function populateCountiesDropdown(formObj, country) {
formObj.county.options.length = 0;
if(country == "") {
formObj.county.options[0] = new Option('Choose a country first', '');
return;
}
for(i = 0; i < counties_dropdown[country].length; i++) {
var option = new Option(counties_dropdown[country][i].substr(counties_dropdown[country][i].indexOf('|')+1),
counties_dropdown[country][i].substr(0,counties_dropdown[country][i].indexOf('|')));
formObj.county.options[i] = option;
}
formObj.county.options[0].value = '';
}
</script>
Using jQuery, as you suggest in your comment, would certainly make this code easier to read. However, the best optimisation you can make, in my opinion, is in your county data structure: make this a map, rather than an array where items are delimited by pipe characters, that you then have to split. That is:
You can now use the key from the country select’s value to drive this and populate the county dropdown. To watch for changes on the country, you can use jQuery’s
.change()function.I would recommend reading the jQuery API documentation and experimenting. You won’t progress very far by letting SO users answer your questions! However, that said, here is my working solution: http://jsfiddle.net/pfYEb/