Skip to main content
Code Review

Return to Question

Notice removed Draw attention by Tzar
Bounty Ended with Sᴀᴍ Onᴇᴌᴀ's answer chosen by Tzar
Notice added Draw attention by Tzar
Bounty Started worth 100 reputation by Tzar
Rollback to Revision 15
Source Link
// Cake-ordering calculator
const calculator = document.forms[0]
const total = calculator.elements.total
const occasionOptions = {
 party: 20,
 birthday: 25,
 anniversary: 50,
 wedding: 100
}
const sizeOptions = {
 six: 1,
 eight: 1.5,
 ten: 2,
 twelve: 2.5
}
const extrasOptions = {
 inscription: 10,
 decoration: 25,
 special: 50
}
calculator.addEventListener("click", calculateTotal)
function cake() {
 const cakes = Array.from(calculator.elements["cake"]).slice(0, 3)
 const raphael = calculator.elements.raphael
 function isChecked(checkbox) {
 return checkbox.checked
 }
 let count = cakes.filter(isChecked).length
 if (count) {
 count = count * 0.5 + 0.5
 }
 if (raphael.checked) {
 count += 1
 }
 return count
}
function occasion() {
 let occasionCost = 0
 const occasion = calculator.elements.occasion
 for (let i = 0; i < occasion.length; i++) {
 if (occasion[i].checked) {
 occasionCost = occasionOptions[occasion[i].id]
 break
 }
 }
 return occasionCost
}
function size() {
 let sizeIndex = 1
 const size = calculator.elements.size
 for (let i = 0; i < size.length; i++) {
 if (size[i].checked) {
 sizeIndex = sizeOptions[size[i].id]
 break
 }
 }
 return sizeIndex
}
function extras() {
 let extrasCost = 0
 const extras = calculator.elements.extras
 for (let i = 0; i < extras.length; i++) {
 if (extras[i].checked) {
 extrasCost = extrasCost + extrasOptions[extras[i].id]
 }
 }
 return extrasCost
}
function calculateTotal() {
 let totalCost = cake() * occasion() * size() + extras()
 total.value = "$" + totalCost.toLocaleString("en")
}
// Display "extras" fieldset when "wedding" occasion is selected
const occasions = Array.from(calculator.elements.occasion)
const fieldset = Array.from(document.getElementsByTagName("fieldset"))
fieldset[3].style.display = "none"
occasions.forEach(occasion => {
 occasion.addEventListener("click", () => {
 if (occasion.id == "wedding") {
 fieldset[3].style.setProperty("display", "inherit")
 } else {
 fieldset[3].style.setProperty("display", "none")
 }
 })
})
// Display cost after size has been selected
const sizes = calculator.elements.size
total.style.display = "none"
for (let i = 0; i < sizes.length; i++) {
 sizes[i].onclick = function() {
 if (this.checked) {
 total.style.setProperty("display", "inherit")
 } else {
 total.style.setProperty("display", "none")
 }
 }
}
// Disable all fieldsets except the first one
const disabledFieldsets = document.querySelectorAll(
 "fieldset:not(:first-of-type)"
)
for (let i = 0; i < disabledFieldsets.length; i++) {
 disabledFieldsets[i].disabled = true
}
// Enable fieldsets sequentially on selection
document.querySelectorAll("fieldset").forEach(fieldset => {
 fieldset.addEventListener("change", function() {
 let nextFieldset = this.nextElementSibling
 while (nextFieldset && !nextFieldset.disabled) {
 nextFieldset = nextFieldset.nextElementSibling
 }
 if (nextFieldset) {
 nextFieldset.disabled = false
 }
 })
})
// Reset form after all inputs in the first fieldset are deselected
const cakeOptions = document.querySelectorAll(
 "fieldset:first-of-type input[type=checkbox]"
)
let isChecked = false
cakeOptions.forEach(function(resetWhenAllUnchecked) {
 resetWhenAllUnchecked.addEventListener("click", function(e) {
 if (this.checked) {
 isChecked = true
 } else {
 if (
 isChecked &&
 !document.querySelectorAll(
 "fieldset:first-of-type input[type=checkbox]:checked"
 ).length
 ) {
 calculator.reset()
 fieldset[3].style.setProperty("display", "none")
 total.style.setProperty("display", "none")
 }
 }
 })
})
<form>
<fieldset>
<legend>Select Cakes</legend>
 <input type=checkbox name=cake id=leonardo>
<label><input type="checkbox" <labelname="cake" for=leonardo>Leonardo<id="leonardo">Leonardo</label>
 <input type=checkbox name=cake id=donatello>
<label><input type="checkbox" <labelname="cake" for=donatello>Donatello<id="donatello">Donatello</label>
 <input type=checkbox name=cake id=michelangelo>
<label><input type="checkbox" <labelname="cake" for=michelangelo>Michelangelo<id="michelangelo">Michelangelo</label>
 <input type=checkbox name=cake id=raphael>
<label><input type="checkbox" <labelname="cake" for=raphael>Raphael<id="raphael">Raphael</label>
<p>If you select more than one cake, the other cakes are discounted 50%.</p>
<p><small>Does not apply to Raphael.</small>small></p>
</fieldset> 
<fieldset>
<legend>Choose Occasion</legend>
 <input type=radio name=occasion id=party<label><input required>
type="radio" name="occasion" <labelid="party" for=party>Party<required>Party</label>
 <input type=radio name=occasion id=birthday>
<label><input type="radio" <labelname="occasion" for=birthday>Birthday<id="birthday">Birthday</label>
 <input type=radio name=occasion id=anniversary>
<label><input type="radio" <labelname="occasion" for=anniversary>Anniversary<id="anniversary">Anniversary</label>
 <input type=radio name=occasion id=wedding>
<label><input type="radio" <labelname="occasion" for=wedding>Wedding<id="wedding">Wedding</label>
</fieldset>
<fieldset>
 <legend>Choose Size</legend>
 <input type=radio name=size id=six<label><input required>
type="radio" name="size" <labelid="six" for=six>6required>6-inch</label>
 <input type=radio name=size id=eight>
<label><input type="radio" <labelname="size" for=eight>8id="eight">8-inch</label>
 <input type=radio name=size id=ten>
<label><input type="radio" <labelname="size" for=ten>10id="ten">10-inch</label>
 <input type=radio name=size id=twelve>
<label><input type="radio" <labelname="size" for=twelve>12id="twelve">12-inch</label>
</fieldset>
<fieldset>
 <legend>Select Extras</legend>
 <input type=checkbox name=extras id=inscription>
<label><input type="checkbox" <labelname="extras" for=inscription>Inscription<id="inscription">Inscription</label>
 <input type=checkbox name=extras id=decoration>
<label><input type="checkbox" <labelname="extras" for=decoration>Decoration<id="decoration">Decoration</label>
 <input type=checkbox name=extras id=special>
<label><input type="checkbox" <labelname="extras" for=special>Specialid="special">Special Frosting & Icing</label>
</fieldset>
<input type=texttype="text" name=totalname="total" readonly>
<input type=submittype="submit" value=Submit>value="Submit">
</form>
// Cake-ordering calculator
const calculator = document.forms[0]
const total = calculator.elements.total
const occasionOptions = {
 party: 20,
 birthday: 25,
 anniversary: 50,
 wedding: 100
}
const sizeOptions = {
 six: 1,
 eight: 1.5,
 ten: 2,
 twelve: 2.5
}
const extrasOptions = {
 inscription: 10,
 decoration: 25,
 special: 50
}
calculator.addEventListener("click", calculateTotal)
function cake() {
 const cakes = Array.from(calculator.elements["cake"]).slice(0, 3)
 const raphael = calculator.elements.raphael
 function isChecked(checkbox) {
 return checkbox.checked
 }
 let count = cakes.filter(isChecked).length
 if (count) {
 count = count * 0.5 + 0.5
 }
 if (raphael.checked) {
 count += 1
 }
 return count
}
function occasion() {
 let occasionCost = 0
 const occasion = calculator.elements.occasion
 for (let i = 0; i < occasion.length; i++) {
 if (occasion[i].checked) {
 occasionCost = occasionOptions[occasion[i].id]
 break
 }
 }
 return occasionCost
}
function size() {
 let sizeIndex = 1
 const size = calculator.elements.size
 for (let i = 0; i < size.length; i++) {
 if (size[i].checked) {
 sizeIndex = sizeOptions[size[i].id]
 break
 }
 }
 return sizeIndex
}
function extras() {
 let extrasCost = 0
 const extras = calculator.elements.extras
 for (let i = 0; i < extras.length; i++) {
 if (extras[i].checked) {
 extrasCost = extrasCost + extrasOptions[extras[i].id]
 }
 }
 return extrasCost
}
function calculateTotal() {
 let totalCost = cake() * occasion() * size() + extras()
 total.value = "$" + totalCost.toLocaleString("en")
}
// Display "extras" fieldset when "wedding" occasion is selected
const occasions = Array.from(calculator.elements.occasion)
const fieldset = Array.from(document.getElementsByTagName("fieldset"))
fieldset[3].style.display = "none"
occasions.forEach(occasion => {
 occasion.addEventListener("click", () => {
 if (occasion.id == "wedding") {
 fieldset[3].style.setProperty("display", "inherit")
 } else {
 fieldset[3].style.setProperty("display", "none")
 }
 })
})
// Display cost after size has been selected
const sizes = calculator.elements.size
total.style.display = "none"
for (let i = 0; i < sizes.length; i++) {
 sizes[i].onclick = function() {
 if (this.checked) {
 total.style.setProperty("display", "inherit")
 } else {
 total.style.setProperty("display", "none")
 }
 }
}
// Disable all fieldsets except the first one
const disabledFieldsets = document.querySelectorAll(
 "fieldset:not(:first-of-type)"
)
for (let i = 0; i < disabledFieldsets.length; i++) {
 disabledFieldsets[i].disabled = true
}
// Enable fieldsets sequentially on selection
document.querySelectorAll("fieldset").forEach(fieldset => {
 fieldset.addEventListener("change", function() {
 let nextFieldset = this.nextElementSibling
 while (nextFieldset && !nextFieldset.disabled) {
 nextFieldset = nextFieldset.nextElementSibling
 }
 if (nextFieldset) {
 nextFieldset.disabled = false
 }
 })
})
// Reset form after all inputs in the first fieldset are deselected
const cakeOptions = document.querySelectorAll(
 "fieldset:first-of-type input[type=checkbox]"
)
let isChecked = false
cakeOptions.forEach(function(resetWhenAllUnchecked) {
 resetWhenAllUnchecked.addEventListener("click", function(e) {
 if (this.checked) {
 isChecked = true
 } else {
 if (
 isChecked &&
 !document.querySelectorAll(
 "fieldset:first-of-type input[type=checkbox]:checked"
 ).length
 ) {
 calculator.reset()
 fieldset[3].style.setProperty("display", "none")
 total.style.setProperty("display", "none")
 }
 }
 })
})
<form>
<fieldset>
<legend>Select Cakes</legend>
 <input type=checkbox name=cake id=leonardo>
 <label for=leonardo>Leonardo</label>
 <input type=checkbox name=cake id=donatello>
 <label for=donatello>Donatello</label>
 <input type=checkbox name=cake id=michelangelo>
 <label for=michelangelo>Michelangelo</label>
 <input type=checkbox name=cake id=raphael>
 <label for=raphael>Raphael</label>
<p>If you select more than one cake, the other cakes are discounted 50%.</p>
<p><small>Does not apply to Raphael.</small>
</fieldset> 
<fieldset>
<legend>Choose Occasion</legend>
 <input type=radio name=occasion id=party required>
 <label for=party>Party</label>
 <input type=radio name=occasion id=birthday>
 <label for=birthday>Birthday</label>
 <input type=radio name=occasion id=anniversary>
 <label for=anniversary>Anniversary</label>
 <input type=radio name=occasion id=wedding>
 <label for=wedding>Wedding</label>
</fieldset>
<fieldset>
 <legend>Choose Size</legend>
 <input type=radio name=size id=six required>
 <label for=six>6-inch</label>
 <input type=radio name=size id=eight>
 <label for=eight>8-inch</label>
 <input type=radio name=size id=ten>
 <label for=ten>10-inch</label>
 <input type=radio name=size id=twelve>
 <label for=twelve>12-inch</label>
</fieldset>
<fieldset>
 <legend>Select Extras</legend>
 <input type=checkbox name=extras id=inscription>
 <label for=inscription>Inscription</label>
 <input type=checkbox name=extras id=decoration>
 <label for=decoration>Decoration</label>
 <input type=checkbox name=extras id=special>
 <label for=special>Special Frosting & Icing</label>
</fieldset>
<input type=text name=total readonly>
<input type=submit value=Submit>
</form>
// Cake-ordering calculator
const calculator = document.forms[0]
const total = calculator.elements.total
const occasionOptions = {
 party: 20,
 birthday: 25,
 anniversary: 50,
 wedding: 100
}
const sizeOptions = {
 six: 1,
 eight: 1.5,
 ten: 2,
 twelve: 2.5
}
const extrasOptions = {
 inscription: 10,
 decoration: 25,
 special: 50
}
calculator.addEventListener("click", calculateTotal)
function cake() {
 const cakes = Array.from(calculator.elements["cake"]).slice(0, 3)
 const raphael = calculator.elements.raphael
 function isChecked(checkbox) {
 return checkbox.checked
 }
 let count = cakes.filter(isChecked).length
 if (count) {
 count = count * 0.5 + 0.5
 }
 if (raphael.checked) {
 count += 1
 }
 return count
}
function occasion() {
 let occasionCost = 0
 const occasion = calculator.elements.occasion
 for (let i = 0; i < occasion.length; i++) {
 if (occasion[i].checked) {
 occasionCost = occasionOptions[occasion[i].id]
 break
 }
 }
 return occasionCost
}
function size() {
 let sizeIndex = 1
 const size = calculator.elements.size
 for (let i = 0; i < size.length; i++) {
 if (size[i].checked) {
 sizeIndex = sizeOptions[size[i].id]
 break
 }
 }
 return sizeIndex
}
function extras() {
 let extrasCost = 0
 const extras = calculator.elements.extras
 for (let i = 0; i < extras.length; i++) {
 if (extras[i].checked) {
 extrasCost = extrasCost + extrasOptions[extras[i].id]
 }
 }
 return extrasCost
}
function calculateTotal() {
 let totalCost = cake() * occasion() * size() + extras()
 total.value = "$" + totalCost.toLocaleString("en")
}
// Display "extras" fieldset when "wedding" occasion is selected
const occasions = Array.from(calculator.elements.occasion)
const fieldset = Array.from(document.getElementsByTagName("fieldset"))
fieldset[3].style.display = "none"
occasions.forEach(occasion => {
 occasion.addEventListener("click", () => {
 if (occasion.id == "wedding") {
 fieldset[3].style.setProperty("display", "inherit")
 } else {
 fieldset[3].style.setProperty("display", "none")
 }
 })
})
// Display cost after size has been selected
const sizes = calculator.elements.size
total.style.display = "none"
for (let i = 0; i < sizes.length; i++) {
 sizes[i].onclick = function() {
 if (this.checked) {
 total.style.setProperty("display", "inherit")
 } else {
 total.style.setProperty("display", "none")
 }
 }
}
// Disable all fieldsets except the first one
const disabledFieldsets = document.querySelectorAll(
 "fieldset:not(:first-of-type)"
)
for (let i = 0; i < disabledFieldsets.length; i++) {
 disabledFieldsets[i].disabled = true
}
// Enable fieldsets sequentially on selection
document.querySelectorAll("fieldset").forEach(fieldset => {
 fieldset.addEventListener("change", function() {
 let nextFieldset = this.nextElementSibling
 while (nextFieldset && !nextFieldset.disabled) {
 nextFieldset = nextFieldset.nextElementSibling
 }
 if (nextFieldset) {
 nextFieldset.disabled = false
 }
 })
})
// Reset form after all inputs in the first fieldset are deselected
const cakeOptions = document.querySelectorAll(
 "fieldset:first-of-type input[type=checkbox]"
)
let isChecked = false
cakeOptions.forEach(function(resetWhenAllUnchecked) {
 resetWhenAllUnchecked.addEventListener("click", function(e) {
 if (this.checked) {
 isChecked = true
 } else {
 if (
 isChecked &&
 !document.querySelectorAll(
 "fieldset:first-of-type input[type=checkbox]:checked"
 ).length
 ) {
 calculator.reset()
 fieldset[3].style.setProperty("display", "none")
 total.style.setProperty("display", "none")
 }
 }
 })
})
<form>
<fieldset>
<legend>Select Cakes</legend>
 <label><input type="checkbox" name="cake" id="leonardo">Leonardo</label>
 <label><input type="checkbox" name="cake" id="donatello">Donatello</label>
 <label><input type="checkbox" name="cake" id="michelangelo">Michelangelo</label>
 <label><input type="checkbox" name="cake" id="raphael">Raphael</label>
<p>If you select more than one cake, the other cakes are discounted 50%.</p>
<p><small>Does not apply to Raphael.</small></p>
</fieldset> 
<fieldset>
<legend>Choose Occasion</legend>
 <label><input type="radio" name="occasion" id="party" required>Party</label>
 <label><input type="radio" name="occasion" id="birthday">Birthday</label>
 <label><input type="radio" name="occasion" id="anniversary">Anniversary</label>
 <label><input type="radio" name="occasion" id="wedding">Wedding</label>
</fieldset>
<fieldset>
 <legend>Choose Size</legend>
 <label><input type="radio" name="size" id="six" required>6-inch</label>
 <label><input type="radio" name="size" id="eight">8-inch</label>
 <label><input type="radio" name="size" id="ten">10-inch</label>
 <label><input type="radio" name="size" id="twelve">12-inch</label>
</fieldset>
<fieldset>
 <legend>Select Extras</legend>
 <label><input type="checkbox" name="extras" id="inscription">Inscription</label>
 <label><input type="checkbox" name="extras" id="decoration">Decoration</label>
 <label><input type="checkbox" name="extras" id="special">Special Frosting & Icing</label>
</fieldset>
<input type="text" name="total" readonly>
<input type="submit" value="Submit">
</form>
added 197 characters in body
Source Link
Tzar
  • 94
  • 13
// Cake-ordering calculator
const calculator = document.forms[0]
const total = calculator.elements.total
const occasionOptions = {
 party: 20,
 birthday: 25,
 anniversary: 50,
 wedding: 100
}
const sizeOptions = {
 six: 1,
 eight: 1.5,
 ten: 2,
 twelve: 2.5
}
const extrasOptions = {
 inscription: 10,
 decoration: 25,
 special: 50
}
calculator.addEventListener("click", calculateTotal)
function cake() {
 const cakes = Array.from(calculator.elements["cake"]).slice(0, 3)
 const raphael = calculator.elements.raphael
 function isChecked(checkbox) {
 return checkbox.checked
 }
 let count = cakes.filter(isChecked).length
 if (count) {
 count = count * 0.5 + 0.5
 }
 if (raphael.checked) {
 count += 1
 }
 return count
}
function occasion() {
 let occasionCost = 0
 const occasion = calculator.elements.occasion
 for (let i = 0; i < occasion.length; i++) {
 if (occasion[i].checked) {
 occasionCost = occasionOptions[occasion[i].id]
 break
 }
 }
 return occasionCost
}
function size() {
 let sizeIndex = 1
 const size = calculator.elements.size
 for (let i = 0; i < size.length; i++) {
 if (size[i].checked) {
 sizeIndex = sizeOptions[size[i].id]
 break
 }
 }
 return sizeIndex
}
function extras() {
 let extrasCost = 0
 const extras = calculator.elements.extras
 for (let i = 0; i < extras.length; i++) {
 if (extras[i].checked) {
 extrasCost = extrasCost + extrasOptions[extras[i].id]
 }
 }
 return extrasCost
}
function calculateTotal() {
 let totalCost = cake() * occasion() * size() + extras()
 total.value = "$" + totalCost.toLocaleString("en")
}
// Display "extras" fieldset when "wedding" occasion is selected
const occasions = Array.from(calculator.elements.occasion)
const fieldset = Array.from(document.getElementsByTagName("fieldset"))
fieldset[3].style.display = "none"
occasions.forEach(occasion => {
 occasion.addEventListener("click", () => {
 if (occasion.id == "wedding") {
 fieldset[3].style.setProperty("display", "inherit")
 } else {
 fieldset[3].style.setProperty("display", "none")
 }
 })
})
// Display cost after size has been selected
const sizes = calculator.elements.size
total.style.display = "none"
for (let i = 0; i < sizes.length; i++) {
 sizes[i].onclick = function() {
 if (this.checked) {
 total.style.setProperty("display", "inherit")
 } else {
 total.style.setProperty("display", "none")
 }
 }
}
// Disable all fieldsets except the first one
const disabledFieldsets = document.querySelectorAll(
 "fieldset:not(:first-of-type)"
)
for (let i = 0; i < disabledFieldsets.length; i++) {
 disabledFieldsets[i].disabled = true
}
// Enable fieldsets sequentially on selection
document.querySelectorAll("fieldset").forEach(fieldset => {
 fieldset.addEventListener("change", function() {
 let nextFieldset = this.nextElementSibling
 while (nextFieldset && !nextFieldset.disabled) {
 nextFieldset = nextFieldset.nextElementSibling
 }
 if (nextFieldset) {
 nextFieldset.disabled = false
 }
 })
})
// Reset form after all inputs in the first fieldset are deselected
const cakeOptions = document.querySelectorAll(
 "fieldset:first-of-type input[type=checkbox]"
)
let isChecked = false
cakeOptions.forEach(function(resetWhenAllUnchecked) {
 resetWhenAllUnchecked.addEventListener("click", function(e) {
 if (this.checked) {
 isChecked = true
 } else {
 if (
 isChecked &&
 !document.querySelectorAll(
 "fieldset:first-of-type input[type=checkbox]:checked"
 ).length
 ) {
 calculator.reset()
 fieldset[3].style.setProperty("display", "none")
 total.style.setProperty("display", "none")
 }
 }
 })
})
<form>
<fieldset>
<legend>Select Cakes</legend>
 <label><input<input type="checkbox"type=checkbox name="cake"name=cake id="leonardo">Leonardo<id=leonardo>
 <label for=leonardo>Leonardo</label>
 <label><input<input type="checkbox"type=checkbox name="cake"name=cake id="donatello">Donatello<id=donatello>
 <label for=donatello>Donatello</label>
 <label><input<input type="checkbox"type=checkbox name="cake"name=cake id="michelangelo">Michelangelo<id=michelangelo>
 <label for=michelangelo>Michelangelo</label>
 <label><input<input type="checkbox"type=checkbox name="cake"name=cake id="raphael">Raphael</label>id=raphael>
 <label for=raphael>Raphael</label>
<p>If you select more than one cake, the other cakes are discounted 50%.</p>
<p><small>Does not apply to Raphael.</small></p>small>
</fieldset> 
<fieldset>
<legend>Choose Occasion</legend>
 <label><input<input type="radio"type=radio name="occasion"name=occasion id="party"id=party required>Party<required>
 <label for=party>Party</label>
 <label><input<input type="radio"type=radio name="occasion"name=occasion id="birthday">Birthday<id=birthday>
 <label for=birthday>Birthday</label>
 <label><input<input type="radio"type=radio name="occasion"name=occasion id="anniversary">Anniversary<id=anniversary>
 <label for=anniversary>Anniversary</label>
 <label><input<input type="radio"type=radio name="occasion"name=occasion id="wedding">Wedding<id=wedding>
 <label for=wedding>Wedding</label>
</fieldset>
<fieldset>
 <legend>Choose Size</legend>
 <label><input<input type="radio"type=radio name="size"name=size id="six"id=six required>6required>
 <label for=six>6-inch</label>
 <label><input<input type="radio"type=radio name="size"name=size id="eight">8id=eight>
 <label for=eight>8-inch</label>
 <label><input<input type="radio"type=radio name="size"name=size id="ten">10id=ten>
 <label for=ten>10-inch</label>
 <label><input<input type="radio"type=radio name="size"name=size id="twelve">12id=twelve>
 <label for=twelve>12-inch</label>
</fieldset>
<fieldset>
 <legend>Select Extras</legend>
 <label><input<input type="checkbox"type=checkbox name="extras"name=extras id="inscription">Inscription<id=inscription>
 <label for=inscription>Inscription</label>
 <label><input<input type="checkbox"type=checkbox name="extras"name=extras id="decoration">Decoration<id=decoration>
 <label for=decoration>Decoration</label>
 <label><input<input type="checkbox"type=checkbox name="extras"name=extras id="special">Specialid=special>
 <label for=special>Special Frosting & Icing</label>
</fieldset>
<input type="text"type=text name="total"name=total readonly>
<input type="submit"type=submit value="Submit">value=Submit>
</form>
// Cake-ordering calculator
const calculator = document.forms[0]
const total = calculator.elements.total
const occasionOptions = {
 party: 20,
 birthday: 25,
 anniversary: 50,
 wedding: 100
}
const sizeOptions = {
 six: 1,
 eight: 1.5,
 ten: 2,
 twelve: 2.5
}
const extrasOptions = {
 inscription: 10,
 decoration: 25,
 special: 50
}
calculator.addEventListener("click", calculateTotal)
function cake() {
 const cakes = Array.from(calculator.elements["cake"]).slice(0, 3)
 const raphael = calculator.elements.raphael
 function isChecked(checkbox) {
 return checkbox.checked
 }
 let count = cakes.filter(isChecked).length
 if (count) {
 count = count * 0.5 + 0.5
 }
 if (raphael.checked) {
 count += 1
 }
 return count
}
function occasion() {
 let occasionCost = 0
 const occasion = calculator.elements.occasion
 for (let i = 0; i < occasion.length; i++) {
 if (occasion[i].checked) {
 occasionCost = occasionOptions[occasion[i].id]
 break
 }
 }
 return occasionCost
}
function size() {
 let sizeIndex = 1
 const size = calculator.elements.size
 for (let i = 0; i < size.length; i++) {
 if (size[i].checked) {
 sizeIndex = sizeOptions[size[i].id]
 break
 }
 }
 return sizeIndex
}
function extras() {
 let extrasCost = 0
 const extras = calculator.elements.extras
 for (let i = 0; i < extras.length; i++) {
 if (extras[i].checked) {
 extrasCost = extrasCost + extrasOptions[extras[i].id]
 }
 }
 return extrasCost
}
function calculateTotal() {
 let totalCost = cake() * occasion() * size() + extras()
 total.value = "$" + totalCost.toLocaleString("en")
}
// Display "extras" fieldset when "wedding" occasion is selected
const occasions = Array.from(calculator.elements.occasion)
const fieldset = Array.from(document.getElementsByTagName("fieldset"))
fieldset[3].style.display = "none"
occasions.forEach(occasion => {
 occasion.addEventListener("click", () => {
 if (occasion.id == "wedding") {
 fieldset[3].style.setProperty("display", "inherit")
 } else {
 fieldset[3].style.setProperty("display", "none")
 }
 })
})
// Display cost after size has been selected
const sizes = calculator.elements.size
total.style.display = "none"
for (let i = 0; i < sizes.length; i++) {
 sizes[i].onclick = function() {
 if (this.checked) {
 total.style.setProperty("display", "inherit")
 } else {
 total.style.setProperty("display", "none")
 }
 }
}
// Disable all fieldsets except the first one
const disabledFieldsets = document.querySelectorAll(
 "fieldset:not(:first-of-type)"
)
for (let i = 0; i < disabledFieldsets.length; i++) {
 disabledFieldsets[i].disabled = true
}
// Enable fieldsets sequentially on selection
document.querySelectorAll("fieldset").forEach(fieldset => {
 fieldset.addEventListener("change", function() {
 let nextFieldset = this.nextElementSibling
 while (nextFieldset && !nextFieldset.disabled) {
 nextFieldset = nextFieldset.nextElementSibling
 }
 if (nextFieldset) {
 nextFieldset.disabled = false
 }
 })
})
// Reset form after all inputs in the first fieldset are deselected
const cakeOptions = document.querySelectorAll(
 "fieldset:first-of-type input[type=checkbox]"
)
let isChecked = false
cakeOptions.forEach(function(resetWhenAllUnchecked) {
 resetWhenAllUnchecked.addEventListener("click", function(e) {
 if (this.checked) {
 isChecked = true
 } else {
 if (
 isChecked &&
 !document.querySelectorAll(
 "fieldset:first-of-type input[type=checkbox]:checked"
 ).length
 ) {
 calculator.reset()
 fieldset[3].style.setProperty("display", "none")
 total.style.setProperty("display", "none")
 }
 }
 })
})
<form>
<fieldset>
<legend>Select Cakes</legend>
 <label><input type="checkbox" name="cake" id="leonardo">Leonardo</label>
 <label><input type="checkbox" name="cake" id="donatello">Donatello</label>
 <label><input type="checkbox" name="cake" id="michelangelo">Michelangelo</label>
 <label><input type="checkbox" name="cake" id="raphael">Raphael</label>
 <p>If you select more than one cake, the other cakes are discounted 50%.</p>
<p><small>Does not apply to Raphael.</small></p>
</fieldset> 
<fieldset>
<legend>Choose Occasion</legend>
 <label><input type="radio" name="occasion" id="party" required>Party</label>
 <label><input type="radio" name="occasion" id="birthday">Birthday</label>
 <label><input type="radio" name="occasion" id="anniversary">Anniversary</label>
 <label><input type="radio" name="occasion" id="wedding">Wedding</label>
</fieldset>
<fieldset>
 <legend>Choose Size</legend>
 <label><input type="radio" name="size" id="six" required>6-inch</label>
 <label><input type="radio" name="size" id="eight">8-inch</label>
 <label><input type="radio" name="size" id="ten">10-inch</label>
 <label><input type="radio" name="size" id="twelve">12-inch</label>
</fieldset>
<fieldset>
 <legend>Select Extras</legend>
 <label><input type="checkbox" name="extras" id="inscription">Inscription</label>
 <label><input type="checkbox" name="extras" id="decoration">Decoration</label>
 <label><input type="checkbox" name="extras" id="special">Special Frosting & Icing</label>
</fieldset>
<input type="text" name="total" readonly>
<input type="submit" value="Submit">
</form>
// Cake-ordering calculator
const calculator = document.forms[0]
const total = calculator.elements.total
const occasionOptions = {
 party: 20,
 birthday: 25,
 anniversary: 50,
 wedding: 100
}
const sizeOptions = {
 six: 1,
 eight: 1.5,
 ten: 2,
 twelve: 2.5
}
const extrasOptions = {
 inscription: 10,
 decoration: 25,
 special: 50
}
calculator.addEventListener("click", calculateTotal)
function cake() {
 const cakes = Array.from(calculator.elements["cake"]).slice(0, 3)
 const raphael = calculator.elements.raphael
 function isChecked(checkbox) {
 return checkbox.checked
 }
 let count = cakes.filter(isChecked).length
 if (count) {
 count = count * 0.5 + 0.5
 }
 if (raphael.checked) {
 count += 1
 }
 return count
}
function occasion() {
 let occasionCost = 0
 const occasion = calculator.elements.occasion
 for (let i = 0; i < occasion.length; i++) {
 if (occasion[i].checked) {
 occasionCost = occasionOptions[occasion[i].id]
 break
 }
 }
 return occasionCost
}
function size() {
 let sizeIndex = 1
 const size = calculator.elements.size
 for (let i = 0; i < size.length; i++) {
 if (size[i].checked) {
 sizeIndex = sizeOptions[size[i].id]
 break
 }
 }
 return sizeIndex
}
function extras() {
 let extrasCost = 0
 const extras = calculator.elements.extras
 for (let i = 0; i < extras.length; i++) {
 if (extras[i].checked) {
 extrasCost = extrasCost + extrasOptions[extras[i].id]
 }
 }
 return extrasCost
}
function calculateTotal() {
 let totalCost = cake() * occasion() * size() + extras()
 total.value = "$" + totalCost.toLocaleString("en")
}
// Display "extras" fieldset when "wedding" occasion is selected
const occasions = Array.from(calculator.elements.occasion)
const fieldset = Array.from(document.getElementsByTagName("fieldset"))
fieldset[3].style.display = "none"
occasions.forEach(occasion => {
 occasion.addEventListener("click", () => {
 if (occasion.id == "wedding") {
 fieldset[3].style.setProperty("display", "inherit")
 } else {
 fieldset[3].style.setProperty("display", "none")
 }
 })
})
// Display cost after size has been selected
const sizes = calculator.elements.size
total.style.display = "none"
for (let i = 0; i < sizes.length; i++) {
 sizes[i].onclick = function() {
 if (this.checked) {
 total.style.setProperty("display", "inherit")
 } else {
 total.style.setProperty("display", "none")
 }
 }
}
// Disable all fieldsets except the first one
const disabledFieldsets = document.querySelectorAll(
 "fieldset:not(:first-of-type)"
)
for (let i = 0; i < disabledFieldsets.length; i++) {
 disabledFieldsets[i].disabled = true
}
// Enable fieldsets sequentially on selection
document.querySelectorAll("fieldset").forEach(fieldset => {
 fieldset.addEventListener("change", function() {
 let nextFieldset = this.nextElementSibling
 while (nextFieldset && !nextFieldset.disabled) {
 nextFieldset = nextFieldset.nextElementSibling
 }
 if (nextFieldset) {
 nextFieldset.disabled = false
 }
 })
})
// Reset form after all inputs in the first fieldset are deselected
const cakeOptions = document.querySelectorAll(
 "fieldset:first-of-type input[type=checkbox]"
)
let isChecked = false
cakeOptions.forEach(function(resetWhenAllUnchecked) {
 resetWhenAllUnchecked.addEventListener("click", function(e) {
 if (this.checked) {
 isChecked = true
 } else {
 if (
 isChecked &&
 !document.querySelectorAll(
 "fieldset:first-of-type input[type=checkbox]:checked"
 ).length
 ) {
 calculator.reset()
 fieldset[3].style.setProperty("display", "none")
 total.style.setProperty("display", "none")
 }
 }
 })
})
<form>
<fieldset>
<legend>Select Cakes</legend>
 <input type=checkbox name=cake id=leonardo>
 <label for=leonardo>Leonardo</label>
 <input type=checkbox name=cake id=donatello>
 <label for=donatello>Donatello</label>
 <input type=checkbox name=cake id=michelangelo>
 <label for=michelangelo>Michelangelo</label>
 <input type=checkbox name=cake id=raphael>
 <label for=raphael>Raphael</label>
<p>If you select more than one cake, the other cakes are discounted 50%.</p>
<p><small>Does not apply to Raphael.</small>
</fieldset> 
<fieldset>
<legend>Choose Occasion</legend>
 <input type=radio name=occasion id=party required>
 <label for=party>Party</label>
 <input type=radio name=occasion id=birthday>
 <label for=birthday>Birthday</label>
 <input type=radio name=occasion id=anniversary>
 <label for=anniversary>Anniversary</label>
 <input type=radio name=occasion id=wedding>
 <label for=wedding>Wedding</label>
</fieldset>
<fieldset>
 <legend>Choose Size</legend>
 <input type=radio name=size id=six required>
 <label for=six>6-inch</label>
 <input type=radio name=size id=eight>
 <label for=eight>8-inch</label>
 <input type=radio name=size id=ten>
 <label for=ten>10-inch</label>
 <input type=radio name=size id=twelve>
 <label for=twelve>12-inch</label>
</fieldset>
<fieldset>
 <legend>Select Extras</legend>
 <input type=checkbox name=extras id=inscription>
 <label for=inscription>Inscription</label>
 <input type=checkbox name=extras id=decoration>
 <label for=decoration>Decoration</label>
 <input type=checkbox name=extras id=special>
 <label for=special>Special Frosting & Icing</label>
</fieldset>
<input type=text name=total readonly>
<input type=submit value=Submit>
</form>
update wording
Source Link

I would love it if you could show me how to make the code more idiomatic. How can it be more consistent, concise and simplified? How can I align it with best practices? What’s the right way to group and order it? In what other ways can I make it better?

I would love if you could show me how to make the code more idiomatic. How can it be more consistent, concise and simplified? How can I align it with best practices? What’s the right way to group and order it? In what other ways can I make it better?

I would love it if you could show me how to make the code more idiomatic. How can it be more consistent, concise and simplified? How can I align it with best practices? What’s the right way to group and order it? In what other ways can I make it better?

added 4 characters in body
Source Link
Tzar
  • 94
  • 13
Loading
deleted 49 characters in body
Source Link
Tzar
  • 94
  • 13
Loading
added 9 characters in body; added 45 characters in body; deleted 2 characters in body
Source Link
Tzar
  • 94
  • 13
Loading
deleted 9 characters in body
Source Link
Tzar
  • 94
  • 13
Loading
deleted 53 characters in body
Source Link
Tzar
  • 94
  • 13
Loading
deleted 47 characters in body; added 4 characters in body
Source Link
Tzar
  • 94
  • 13
Loading
added 127 characters in body
Source Link
Tzar
  • 94
  • 13
Loading
edited body
Source Link
Tzar
  • 94
  • 13
Loading
deleted 15 characters in body
Source Link
Tzar
  • 94
  • 13
Loading
added 2 characters in body
Source Link
Tzar
  • 94
  • 13
Loading
Tweeted twitter.com/StackCodeReview/status/1031058647525277696
added 10 characters in body
Source Link
Tzar
  • 94
  • 13
Loading
added 21 characters in body
Source Link
Tzar
  • 94
  • 13
Loading
edited tags; edited title
Link
200_success
  • 145.5k
  • 22
  • 190
  • 479
Loading
Source Link
Tzar
  • 94
  • 13
Loading
lang-js

AltStyle によって変換されたページ (->オリジナル) /