HTML gevorderde |
|
Dan gaan we nog wat verder in JS best practices.
Eerst wat HTML regels:
- language attribuut heeft nooit bestaan, gebruik het type attribuut. Deze default naar text/javascript bij script tags, dus we laten hem nu gewoon weg
- select elementen komen alleen voor in een form element
- sinds html5 hebben we een output element die geschikt is voor het tonen van het resultaat van een berekening van user input.
Dan wat JavaScript dingen:
- geen inline JS
- alleen het variabele gedeelte in het output element, niet de hele zin
- script element onder de HTML code, vlak voor </body>
- innerText ipv innerHTML.
De prijs is <output id="prijs" for="#userPrice">10</output>.
<form>
<select id="userPrice" name="prijs">
<option value="10">1</option>
<option value="20">2</option>
<option value="30">3</option>
<option value="40">4</option>
</select>
</form>
<script>
var userPrice = document.getElementById('userPrice');
userPrice.onchange = function (e) {
document.getElementById('prijs').innerText = this.value;
};
</script>
De prijs is <output id="prijs" for="#userPrice">10</output>. <select id="userPrice" name="prijs"> var userPrice = document.getElementById('userPrice'); userPrice.onchange = function (e) { document.getElementById('prijs').innerText = this.value; };
Nu laten we telkens als we het aantal veranderen JavaScript de hele DOM doorzoeken naar #prijs. Het hoeft maar 1 keer, daarna kunnen we het opslaan in een variabele en die dan de hele tijd gebruiken:
var userPrice = document.getElementById('userPrice');
var prijs = /* DOMNode */ null;
userPrice.onchange = function (e) {
if (null === prijs) {
prijs = document.getElementById('prijs');
}
prijs.innerText = this.value;
};
</script>
var userPrice = document.getElementById('userPrice'); var prijs = /* DOMNode */ null; userPrice.onchange = function (e) { if (null === prijs) { prijs = document.getElementById('prijs'); } prijs.innerText = this.value; }; </script>
En dan gaan we nog wat verder. Het is handig om het aantal op te slaan in de db en daarvanuit de prijs te berekenen, daarom doen we dat ook in ons form en verplaatsen we het berekenen naar de event handler:
De prijs is <output id="prijs" for="#amount">10</output>.
<form>
<select id="amount" name="aantal">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>
</form>
<script>
var amount = document.getElementById('amount');
var prijs = /* DOMNode */ null;
amount.onchange = function (e) {
if (null === prijs) {
prijs = document.getElementById('prijs');
}
prijs.innerText = this.value * 10; // 10 per stuk
};
</script>
De prijs is <output id="prijs" for="#amount">10</output>. <select id="amount" name="aantal"> var amount = document.getElementById('amount'); var prijs = /* DOMNode */ null; amount.onchange = function (e) { if (null === prijs) { prijs = document.getElementById('prijs'); } prijs.innerText = this.value * 10; // 10 per stuk };
En dan als laatst nog wat overnemen van de functionele talen. Onze event handler (de functie) doet nu 2 dingen. Het communiceert met de buitenwereld (een zogenaamde IO functie, Input Output) en het berekend de prijs. Het berekenen gebeurd door het krijgen van 2 waardes en 1 waarde terug te geven. Deze waarde zal altijd hetzelfde zijn bij dezelfde input. Dat noemen we pure functies.
Deze samen in 1 functie doen zorgt voor slechtere debugging, testing en meer bugs. Daarom verplaatsen we die naar een functie die we ook nog eens kunnen hergebruiken!
var amount = document.getElementById('amount');
var prijs = /* DOMNode */ null;
amount.onchange = function (e) {
if (null === prijs) {
prijs = document.getElementById('prijs');
}
prijs.innerText = calculatePrice(this.value, 10); // 10 per stuk
};
function calculatePrice(q, vk, ck) {
vk || (vk = 0);
ck || (ck = 0); // default values
return q * vk + ck;
}
</script>
var amount = document.getElementById('amount'); var prijs = /* DOMNode */ null; amount.onchange = function (e) { if (null === prijs) { prijs = document.getElementById('prijs'); } prijs.innerText = calculatePrice(this.value, 10); // 10 per stuk }; function calculatePrice(q, vk, ck) { vk || (vk = 0); ck || (ck = 0); // default values return q * vk + ck; } </script>
|