Ben zojuist bezig geweest om jquery beter onder de knie te krijgen.
Nu heb ik een error functie gemaakt maar vroeg me af of ik dit misschien in een korte code kon maken
Laat ik eerst beginnen met 2 algemene JavaScript best-practices:
Probeer zo min mogelijk styling te doen, laat dat over aan CSS. Gebruik bijv. classes
Probeer zo min mogelijk de hele DOM tree door te zoeken
Wanneer we de eerste best-practice toepassen maken we bijvoorbeeld 2 CSS classes aan:
[code lang=css].field--error { border-bottom-color:#ff0000; }
.field--default { border-bottom-color:#cccccc; }[/code]
Nu kunnen we deze toevoegen met jQuery:
[code lang=js]
if (!$('#dataeen').val()) {
$('#dataeen').removeClass('field-default').addClass('field-error');
} else {
$('#dataeen').removeClass('field-error').addClass('field-default');
}[/code]
Dit kunnen we versimpelen door jQuery's toggleClass() functie te gebruiken:
[code lang=js]// class wordt toegevoegd wanneer het 2e argument true is en wordt verwijderd wanneer dit false is
// dit betekend dat border-bottom-color:#cccccc; de default border-bottom kleur van de veldjes moet worden
$('#dataeen').toggleClass('field-error', !$('#dataeen').val());[/code]
Nu zie je dat we 2 keer $('#dataeen') hebben. Dit betekend dat JavaScript 2 maal alle elementen van de pagina (DOM tree) moet doorzoeken om een element te vinden. Je kan begrijpen dat dit met een grote pagina best wat tijd kan kosten. Het is dus beter om dit element op te slaan in een variabele en deze dan te gebruiken:
[code lang=js]
var dataeenElem = $('#dataeen');
Nu kunnen we dit nog beter maken, omdat de functie nu alsnog elke keer dat het wordt aangeroepen opzoek moet gaan naar de elementen. Dus kun je beter deze variabele globaal opslaan: (globaal is eigenlijk niet goed, maar dit lokaal maken gaat nu nog een beetje te ver)
[code lang=js]
var dataeenElem = $('#dataeen');
var datatweeElem = $('#datatwee');
Nu zie je dat je alsnog 2 regels hebt die nagenoeg hetzelfde zijn. Dit zou je ook weer kunnen abstraheren in een nieuwe functie, maar dat lijkt me een tikkeltje overkill.
Kijk trouwens eens naar het onsubmit event (.submit()). Dat is iets beter dan het click event op een submit button.
Het lijkt me gemakkelijker om alle elementen die je wilt controleren dezelfde class te geven.
Daarmee bereik je dat je niet elke id apart hoeft te vermelden:
je maakt een lus die door alle elementen met class="nietleeg" loopt en als zo'n element dan leeg is, geef je daar de opmaak class field-error aan. (oj juist niet aks gevuld)
Aan het einde van de functie kijk ik of er uiteindelijk elementen aanwezig zijn met de class "error".
Als dat het geval is, zijn er dus elementen die leeg zijn en dus mogen we niet door met het submitten.
vergelijkbaar met preventDefault(). Maar jouw preventDefault gaat volgens mij altijd af.