My JavaScript switch case isn't working for some reason, and I can't figure it out.
I am trying to display a certain input only of a certain option is chosen:
function showHideSchools(obj){
var curSel = obj.options[obj.selectedIndex].value
switch(curSel)
{
case '0-2':
document.getElementById('schools').style.display="none"
break;
case '3-5':
document.getElementById('schools').style.display="block"
break;
case '6-8':
document.getElementById('schools').style.display="block"
break;
case '9-11':
document.getElementById('schools').style.display="block"
break;
case '12-14':
document.getElementById('schools').style.display="block"
break;
case '15-16':
document.getElementById('schools').style.display="block"
break;
case '17-18':
document.getElementById('schools').style.display="block"
break;
case '19 and over':
document.getElementById('schools').style.display="block"
break;
default:
document.getElementById('schools').style.display="none"
}
}
Here is the HTML:
<p>
<label for="childrenAges">Ages of children still living at home: </label>
<select name="childrenAges" id="childrenAges" onchange="showHideSchools(this);">
<option>Select one</option>
<option value="0-2">0-2</option>
<option value="3-5">3-5</option>
<option value="6-8">6-8</option>
<option value="9-11">9-11</option>
<option value="12-14">12-14</option>
<option value="15-16">15-16</option>
<option value="17-18">17-18</option>
<option value="19 and over">19 and over</option>
</select>
</p>
<div id="schools" style="display:none">
<p>
<label for="schoolName">What school/s do they attend: </label>
<input type="text" name="schoolName" />
</p>
</div>
You don't need a switch case:
if(obj.options[obj.selectedIndex].value != "Select one" && obj.options[obj.selectedIndex].value != "0-2"){
document.getElementById('schools').style.display="block";
}else{
document.getElementById('schools').style.display="none";
}
As others said, your case tests didn't match the value of the first three options.
There isn't any reason to repeat that line document.getElementById('schools').style.display="block"; over and over. Just let all the conditions that lead to that outcome fall through to a single line with that instruction.
function showHideSchools (obj) {
var curSel = obj.options[obj.selectedIndex].value;
switch (curSel) {
case '2':
case '3':
case '9-11':
case '12-14':
case '15-16':
case '17-18':
case '19 and over':
document.getElementById('schools').style.display = "block";
break;
case '1':
default:
document.getElementById('schools').style.display = "none";
}
}
The value of the options 0-2, 3-5 and 6-8 are 1, 2 and 3, respectively.
You have them as 0-2, 3-5 and 6-8 in your JavaScript code.
0-2
3-5
6-8
case '0-2':
case '3-5':
Your values and case parameters do not correspond. When you select '0-2', .value is "1".
From your code, it looks like you'd be better off switching the criteria, so that you hide when the value is "" and show the box in all other cases - that looks like what you're trying to do...?
Other than that, I'm not 100% sure what your problem is, but if the problem is that it's not working for the first three items, then the reason is that their values will be 1, 2 and 3, not 0-2 etc, that you're testing for.
The case values are wrong. They have to match the value in the <option> tags, not the displayed text.
So they would be
case '1':
document.getElementById('schools').style.display="block"
break;
case '2':
document.getElementById('schools').style.display="block"
break;
etc.
You are not specifying the option values, rather their representation in switch. For example:
case '0-2':
There is nothing like that in the select's option values.
case '1':
...
case '2':
...
case '3':
...
case '9-11':
...
case '12-14':
...
I.e., you should check the content of option's value attribute, not text inside <option></option> tags.
Related
Each time the web page is loaded the onchange method works, but it only works once per value. When summer is selected the classes are added, when i chose winter the class is added but then if i chosesummer again it will not work. Why is this?
const landingBGR = document.querySelector(".landing-wrapper");
const landingBTN = document.getElementById("l-btn");
function selectedSeason(season) {
switch(season) {
case "summer":
landingBTN.setAttribute("href","summer.html");
landingBGR.classList.add("summer-bgr");
break;
case "winter":
landingBTN.setAttribute("href","winter.html");
landingBGR.classList.add("winter-bgr");
break;
}
}
<select name="" id="landing-drop" onchange="oninput(this.value)">
<option value="">Ireland in the four Seasons</option>
<option value="summer">Summer</option>
<option value="winter">Winter</option>
</select>
try to delete the old class when you select a new option.
landingBGR.classList.remove("summer-bgr");
landingBGR.classList.remove("winter-bgr");
you will maybe need
if(landingBGR.classList.contains("classname"))
I have a select list that I would like to display a different image in the same div each time the user changes the select list. Here's what I have so far:
HTML
<div id="branches">
<h3>British Columbia Old Age Pensioners' Organization — Branches</h3>
<select id="branch-number" class="form-control">
<optgroup label="British Columbia">
<option value="1">Branch 1</option>
<option value="2">Branch 2</option>
<option value="http://placehold.it/350x350">Branch 3</option>
<option value="http://placehold.it/350x450">Branch 4</option>
</optgroup>
<optgroup label="Alberta">
<option value="5">Branch 5</option>
<option value="6">Branch 6</option>
...etc...
</select>
<div id="img-window">
<img id="branch-img" src="http://placehold.it/350x150" class="img-responsive">
</div><!-- end img-window -->
</div><!-- end branches -->
jQuery
$(document).ready(function () {
$('#branch-number').on('change', function () {
alert('something happened');
// var branchVal = $('this').val();
var branchVal = $('option:selected').val();
switch (branchVal) {
case 1:
$('#branch-img').attr('src', 'http://placehold.it/150x150');
break;
case 2:
$('#branch-img').attr('src', 'http://placehold.it/250x250');
break;
case 3:
$('#branch-img').attr('src', 'http://placehold.it/350x350');
break;
default:
$('#branch-img').attr('src', 'http://placehold.it/1450x1450');
}
});
});
Right now, nothing happens when the user changes the select list. I am trying to do this with an <img> tag instead of CSS so that for increased accessibility of the alt="" attribute.
I'm just starting to get the hang of javascript / jQuery ... any help appreciated.
Here's a fiddle:
https://jsfiddle.net/r1fcvs7s/4/
edit: syntax should be all good now.
Your case syntax is wrong. It should be:
switch(branchVal) {
case 1:
$('#branch-img').attr('src', 'http://placehold.it/150x150');
break;
case 2:
$('#branch-img').attr('src', 'http://placehold.it/450x450');
break;
}
The : comes after the value, not before. And you need break between the cases unless you want to fall through into the next case (which you obviously don't in this code).
You should have gotten a syntax error in the Javascript console. How did you miss that?
BTW, to get the value of the <select>, you can use $(this).val(). You don't need to access option:selected.
HTML
<select id="branch-number" class="form-control">
<optgroup label="British Columbia">
<option>1</option>
<option>2</option>
<option>Three</option>
<option>Four</option>
</optgroup>
</select>
jQuery
$(document).ready(function() {
$('#branch-number').on('change', function() {
// var branchVal = $('this').val();
var branchVal = $('#branch-number').find(':selected').text();
switch(branchVal) {
case "1":
$('#branch-img').attr('src', 'http://placehold.it/350x350/9d9999/000000&text=Abbotsford+Branch');
break;
case "2":
$('#branch-img').attr('src', 'http://placehold.it/250x250/9d9999/000000&text=Chilliwack+Branch');
break;
case "Three":
$('#branch-img').attr('src', 'http://placehold.it/150x150/9d9999/000000&text=Mission+Branch');
break;
case "Four":
$('#branch-img').attr('src', 'http://placehold.it/350x350/9d9999/000000&text=Vancouver+Branch');
break;
}
});
});
Had to use the .find(:selected).text(); method instead of the .val(); method. This is because the value attribute is only used for forms and other things but, not boxes.
I have a selectbox with a couple of options in it. When an option is selected, the Javascript code gets the value of the selected option and has to change the font of a text accordingly.
I figured I would use the Switch-Case statement because I have multiple options, but it doesn't seem to work, nothing changes.
Javascript
function font() {
var sf = document.getElementById('box').value;
var generate = document.getElementById('generate');
switch (sf) {
case 'TimesNewRoman':
generate.style.fontFamily('Times New Roman')
break;
case 'Georgia':
generate.style.fontFamily('Georgia')
break;
case 'PalatinoLinotype':
generate.style.fontFamily('Palatino Linotype')
break;
default:
generate.style.fontFamily('Arial')
}
}
HTML
<select id="box" onchange="font();">
<option id="TNR" value="TimesNewRoman">Times New Roman</option>
<option id="GRG" value="Georgia">Georgia</option>
<option id="PLT" value="PalatinoLinotype">Palatino Linotype</option>
</select>
<br />
<div id="generate">This is some text</div>
NOTE
I have more options in the list but I have shorten it for the sake of simplicity.
Am I wrong for using this statement, or am I missing something entirely?
You haven't made an assignment, use generate.style.fontFamily = "Arial";
So I have a div with text in it that changes when you select a different font in the select list that I made.
At the moment the list is pretty limited because I have to add fonts by myself.
Is there any way to add all the fonts installed on the users computer to the list with a code instead of having to add them all by myself?
HTML
<div id="generate">
Change the text!
</div>
<select id="box" onchange="font();">
<option id="PIC" value="Kies een font">Kies een font.</option>
<option id="TNR" value="TimesNewRoman">Times New Roman</option>
<option id="GRG" value="Georgia">Georgia</option>
<option id="PLT" value="PalatinoLinotype">Palatino Linotype</option>
<option id="ARL" value="Arial">Arial</option>
<option id="CMS" value="ComicSans">Comic Sans</option>
<option id="IMP" value="Impact">Impact</option>
<option id="TMS" value="TrebuchetMS">Trebuchet MS</option>
<option id="TSB" value="TheSansBlack">The Sans Black Plain</option>
</select><br />
Javascript
function font() {
var sf = document.getElementById('box').value;
var generate = document.getElementById('generate');
switch(sf){
case 'TimesNewRoman':
generate.style.fontFamily = ('Times New Roman')
break;
case 'Georgia':
generate.style.fontFamily = ('Georgia')
break;
case 'PalatinoLinotype':
generate.style.fontFamily = ('Palatino Linotype')
break;
case 'Arial':
generate.style.fontFamily = ('Arial')
break;
case 'ComicSans':
generate.style.fontFamily = ('Comic Sans MS')
break;
case 'Impact':
generate.style.fontFamily = ('Impact')
break;
case 'TrebuchetMS':
generate.style.fontFamily = ('Trebuchet MS')
break;
default: generate.style.fontFamily = ('')
}
}
You can check availability of particular font http://www.lalit.org/lab/javascript-css-font-detect/
One thing you can do is create own list and compare it's availability as mentioned in link above and show only fonts which are available on client system.
I have a select input:
<select size="1" name="filter" style="width:90px;" id="priority_filter" onchange="filter_user_trainings();">
<option value="all">All</option>
<option value="optional">Optional</option>
<option value="mandatory">Mandatory</option>
<option value="essential">Essential</option>
<option value="custom">Custom</option>
</select>
<div style="width: 50%; text-align: right; float: right">
<input type="checkbox" id="opt_box" onchange="somestuff()">Optional
<input type="checkbox" id="mand_box" onchange="somestuff()" checked="checked">Mandatory
<input type="checkbox" id="ess_box" onchange="somestuff()">Essential
</div>
And a jQuery code:
switch(priority_filter){
case 'all':
$("#opt_box").attr({checked: "checked"});
$("#mand_box").attr({checked: "checked"});
$("#ess_box").attr({checked: "checked"});
break;
case 'optional' :
$("#opt_box").attr({checked: "checked"});
$("#mand_box").removeAttr("checked");
$("#ess_box").removeAttr("checked");
break;
case 'essential' :
$("#ess_box").attr({checked: "checked"});
$("#mand_box").removeAttr("checked");
$("#opt_box").removeAttr("checked");
break;
case 'mandatory' :
$("#mand_box").attr({checked: "checked"});
$("#opt_box").removeAttr("checked");
$("#ess_box").removeAttr("checked");
case 'custom' :
$("#mand_box").attr({checked: "checked"});
$("#opt_box").removeAttr("checked");
$("#ess_box").removeAttr("checked");
break;
}
I want to call the function in the "onchange" attr. when the js switch the checkboxes' values but it does not works. How can I fix it?
Try this
<select size="1" name="filter" style="width:90px;" id="priority_filter" onchange="filter_user_trainings(this);">
JS
function filter_user_trainings(obj){
var priority_filter=$(obj).val();
switch(priority_filter){
case 'all':
$("#opt_box").attr({checked: "checked"});
$("#mand_box").attr({checked: "checked"});
$("#ess_box").attr({checked: "checked"});
break;
case 'optional' :
$("#opt_box").attr({checked: "checked"});
$("#mand_box").removeAttr("checked");
$("#ess_box").removeAttr("checked");
break;
case 'essential' :
$("#ess_box").attr({checked: "checked"});
$("#mand_box").removeAttr("checked");
$("#opt_box").removeAttr("checked");
break;
case 'mandatory' :
$("#mand_box").attr({checked: "checked"});
$("#opt_box").removeAttr("checked");
$("#ess_box").removeAttr("checked");
case 'custom' :
$("#mand_box").attr({checked: "checked"});
$("#opt_box").removeAttr("checked");
$("#ess_box").removeAttr("checked");
break;
}
}
I think it should be $("#opt_box").attr("checked", "checked"); and not $("#opt_box").attr({checked: "checked"});. See if that is the case. Also you need to pass the parameter to your method onchange="filter_user_trainings(<put selected option from dropdown here>);"
$("#opt_box").on('click',function(){
if($(this).is(':checked')){
// do your work here
}
});
Get a look at this fiddle.
I refactored your code a bit, but that's not the important part.
You should alter the "checked" property instead of the attribute
You must trigger the change event yourself, because that's not getting fired when setting either the property nor attribute via JS
So you must trigger the change event on target checkboxes and after that re-set the property to your desired value (like in my fiddle), because triggering the change event naturally also changes the checkbox' state.
$checkboxes.prop('checked', true).trigger('change');
Update: Ok, seems like triggering a change with JS actually doesn't change the checkbox' property, so you can trigger a change after the value has been set and get the correct value (which is the current state). Updated my fiddle.