Reputation: 59
I want to show result by highlight table row when I click calculate button. If it calculates all input, it highlights only table row of bmi itself.
Example if bmi as 17.51, it highlights only the third row in the table (Mild Thinness, 17 - 18.5).
Below is my snippet.
window.addEventListener("load", () => {
document.getElementById("calculate").addEventListener("click", toBmi);
});
var toBmi = () => {
var weight = document.getElementById("weight").value;
var height = document.getElementById("height").value;
var bmi;
if(weight > 0 && height > 0) {
bmi = weight / Math.pow((height/100), 2);
}
document.getElementById("bmi").innerHTML = bmi == undefined ? " " : "BMI = " + bmi.toFixed(2);
}
var clearForm = () => {
document.getElementById("doForm").reset();
document.getElementById("bmi").innerHTML = " ";
}
table {border-collapse: collapse;}
th, td {
padding: 15px;
text-align: left;
border-bottom: 1px solid rgb(0, 0, 0);
}
<form id="doForm">
<div class="rowTab-1">
<div class="label-left">
<label id="weight-label" for="weight">Weight:</label>
<input type="text" name="weight" class="form-input" id="weight" size="10" maxlength="6" onkeypress="if(this.value.length > 5) return false;">
<label id="unit-label" for="weightUnit">Kg</label>
</div>
</div>
<div class="rowTab-2">
<div class="label-left">
<label id="height-label" for="height">Height:</label>
<input type="text" name="height" class="form-input" id="height" size="10" maxlength="4" onkeypress="if(this.value.length > 3) return false;">
<label id="unit-label" for="heightUnit">Cm</label>
</div>
</div>
<div class="buttons">
<button type="button" id="calculate">calculate</button>
<button type="button" id="clear" onclick="clearForm()">clear</button><br>
</div>
<div class="showResult">
<span id="bmi"></span><br>
</div>
</form>
<table id="resultBmiTable">
<thead>
<tr>
<th>Category</th>
<th>BMI range</th>
</tr>
</thead>
<tbody>
<tr id="bmi-1">
<td>Severe Thinness</td>
<td>< 16</td>
</tr>
<tr id="bmi-2">
<td>Moderate Thinness</td>
<td>16 - 17</td>
</tr>
<tr id="bmi-3">
<td>Mild Thinness</td>
<td>17 - 18.5</td>
</tr>
<tr id="bmi-4">
<td>Normal</td>
<td>18.5 - 25</td>
</tr>
<tr id="bmi-5">
<td>Overweight</td>
<td>25 - 30</td>
</tr>
<tr id="bmi-6">
<td>Obese Class I</td>
<td>30 - 35</td>
</tr>
<tr id="bmi-7">
<td>Obese Class II</td>
<td>35 - 40</td>
</tr>
<tr id="bmi-8">
<td>Obese Class III</td>
<td>> 40</td>
</tr>
</tbody>
</table>
How can I implement this? I don't know how to make my code work done.
Thanks.
Upvotes: 3
Views: 410
Reputation: 419
Taking reference from @montrealist answer's
table {
border-collapse: collapse;
}
th,
td {
padding: 15px;
text-align: left;
border-bottom: 1px solid rgb(0, 0, 0);
}
.highlight {
background-color: cyan;
}
<form id="doForm">
<div class="rowTab-1">
<div class="label-left">
<label id="weight-label" for="weight">Weight:</label>
<input type="text" name="weight" class="form-input" id="weight" size="10" maxlength="6"
onkeypress="if(this.value.length > 5) return false;">
<label id="unit-label" for="weightUnit">Kg</label>
</div>
</div>
<div class="rowTab-2">
<div class="label-left">
<label id="height-label" for="height">Height:</label>
<input type="text" name="height" class="form-input" id="height" size="10" maxlength="4"
onkeypress="if(this.value.length > 3) return false;">
<label id="unit-label" for="heightUnit">Cm</label>
</div>
</div>
<div class="buttons">
<button type="button" id="calculate">calculate</button>
<button type="button" id="clear" onclick="clearForm()">clear</button><br>
</div>
<div class="showResult">
<span id="bmi"></span><br>
</div>
</form>
<table id="resultBmiTable">
<thead>
<tr>
<th>Category</th>
<th>BMI range</th>
</tr>
</thead>
<tbody>
<tr id="bmi-1" data-range-min="0" data-range-max="16">
<td>Severe Thinness</td>
<td>< 16</td>
</tr>
<tr id="bmi-2" data-range-min="16" data-range-max="17">
<td>Moderate Thinness</td>
<td>16 - 17</td>
</tr>
<tr id="bmi-3" data-range-min="17" data-range-max="18.5">
<td>Mild Thinness</td>
<td>17 - 18.5</td>
</tr>
<tr id="bmi-4" data-range-min="18.5" data-range-max="25">
<td>Normal</td>
<td>18.5 - 25</td>
</tr>
<tr id="bmi-5" data-range-min="25" data-range-max="30">
<td>Overweight</td>
<td>25 - 30</td>
</tr>
<tr id="bmi-6" data-range-min="30" data-range-max="35">
<td>Obese Class I</td>
<td>30 - 35</td>
</tr>
<tr id="bmi-7" data-range-min="35" data-range-max="40">
<td>Obese Class II</td>
<td>35 - 40</td>
</tr>
<tr id="bmi-8" data-range-min="40" data-range-max="100">
<td>Obese Class III</td>
<td>> 40</td>
</tr>
</tbody>
</table>
window.addEventListener("load", () => {
document.getElementById("calculate").addEventListener("click", toBmi);
});
var toBmi = () => {
var weight = document.getElementById("weight").value;
var height = document.getElementById("height").value;
var bmi;
if (weight > 0 && height > 0) {
bmi = weight / Math.pow((height / 100), 2);
}
document.getElementById("bmi").innerHTML = bmi == undefined ? " " : "BMI = " + bmi.toFixed(2);
// code for highlight the background
document.querySelectorAll('[data-range-min]').forEach(v => {
let isHighlight = (bmi >= +v.dataset.rangeMin && bmi < +v.dataset.rangeMax)
v.classList.toggle("highlight", isHighlight);
})
}
var clearForm = () => {
document.getElementById("doForm").reset();
document.getElementById("bmi").innerHTML = " ";
}
Upvotes: 1
Reputation: 147146
One way to do this is to have an array of bmi
values which map to each row in the table, then iterate through this array until you find the smallest value which is greater than the actual bmi and add a highlight class to it:
const bmiclass = [0, 16, 17, 18.5, 25, 30, 35, 40, 999]
window.addEventListener("load", () => {
document.getElementById("calculate").addEventListener("click", toBmi);
});
var toBmi = () => {
var weight = document.getElementById("weight").value;
var height = document.getElementById("height").value;
var bmi;
if (weight > 0 && height > 0) {
bmi = weight / Math.pow((height / 100), 2);
}
document.getElementById("bmi").innerHTML = bmi == undefined ? " " : "BMI = " + bmi.toFixed(2);
// remove any existing highlighting
document.querySelectorAll('[id^="bmi-"]').forEach(e =>
e.classList.remove('highlight'));
// highlight the selected range
for (let i = 0; i < bmiclass.length; i++) {
if (bmi <= bmiclass[i]) {
document.getElementById('bmi-' + i).classList.add('highlight');
break;
}
}
}
var clearForm = () => {
document.getElementById("doForm").reset();
document.getElementById("bmi").innerHTML = " ";
}
table {
border-collapse: collapse;
}
th,
td {
padding: 15px;
text-align: left;
border-bottom: 1px solid rgb(0, 0, 0);
}
.highlight {
background-color: cyan;
}
<form id="doForm">
<div class="rowTab-1">
<div class="label-left">
<label id="weight-label" for="weight">Weight:</label>
<input type="text" name="weight" class="form-input" id="weight" size="10" maxlength="6" onkeypress="if(this.value.length > 5) return false;">
<label id="unit-label" for="weightUnit">Kg</label>
</div>
</div>
<div class="rowTab-2">
<div class="label-left">
<label id="height-label" for="height">Height:</label>
<input type="text" name="height" class="form-input" id="height" size="10" maxlength="4" onkeypress="if(this.value.length > 3) return false;">
<label id="unit-label" for="heightUnit">Cm</label>
</div>
</div>
<div class="buttons">
<button type="button" id="calculate">calculate</button>
<button type="button" id="clear" onclick="clearForm()">clear</button><br>
</div>
<div class="showResult">
<span id="bmi"></span><br>
</div>
</form>
<table id="resultBmiTable">
<thead>
<tr>
<th>Category</th>
<th>BMI range</th>
</tr>
</thead>
<tbody>
<tr id="bmi-1">
<td>Severe Thinness</td>
<td>< 16</td>
</tr>
<tr id="bmi-2">
<td>Moderate Thinness</td>
<td>16 - 17</td>
</tr>
<tr id="bmi-3">
<td>Mild Thinness</td>
<td>17 - 18.5</td>
</tr>
<tr id="bmi-4">
<td>Normal</td>
<td>18.5 - 25</td>
</tr>
<tr id="bmi-5">
<td>Overweight</td>
<td>25 - 30</td>
</tr>
<tr id="bmi-6">
<td>Obese Class I</td>
<td>30 - 35</td>
</tr>
<tr id="bmi-7">
<td>Obese Class II</td>
<td>35 - 40</td>
</tr>
<tr id="bmi-8">
<td>Obese Class III</td>
<td>> 40</td>
</tr>
</tbody>
</table>
Upvotes: 2
Reputation: 9273
Iterate through a list of ranges and highlight the row that corresponds to that range:
var toBmi = () => {
var weight = document.getElementById("weight").value;
var height = document.getElementById("height").value;
var bmi;
if (weight > 0 && height > 0) {
bmi = weight / Math.pow((height / 100), 2);
console.log("bmi=" + bmi);
[
[0, 16],
[16, 17],
[18, 18.5],
[18.5, 25],
[25, 30],
[30, 35],
[35, 40],
[40, 999],
].forEach(function (range, i) {
console.log('got ' + i);
var elmt = document.getElementById('bmi-' + (i + 1))
if (bmi >= range[0] && bmi < range[1]) {
console.log("Highlighting " + i);
if (elmt) {
elmt.style.backgroundColor = 'red';
}
} else {
if (elmt) {
elmt.style.backgroundColor = 'white';
}
}
});
document.getElementById("bmi").innerHTML = bmi == undefined ? " " : "BMI = " + bmi.toFixed(2);
}
}
Upvotes: 1
Reputation: 5693
Here are the steps as I see them.
<tr id="bmi-2" data-range-min="16" data-range-max="17">
(read more about data attributes here)document.querySelectorAll('[data-range-min]');
)elem.classList.add("highlight");
)P.S.: If bmi
is calculated multiple times you want to clear the highlight
class from all the rows first - after step 2 would be a good time to do it. Read more about classList here.
Upvotes: 1