E10 – The Choice Dagens agenda • Formulär - Skicka - Komma åt formulärkontroller • Reguljära uttryck • Validering av formulär Validering Postnummer: 391 62 E-postadress: ellen@nu Personnummer: 841211-1389 Skicka Formulär, skicka Metoder submit() Skickar formuläret. reset() Motsvarar om användaren klickar på en reset-knapp i formuläret. Event onsubmit Inträffar precis innan formuläret skickas. Returneras false skickas inte formuläret. (Utmärkt vid validering) onreset Inträffar precis innan formuläret återställs. var form = document.getElementById("myForm"); form.onsubmit = function(e){ // Gör validering av datat som ska skickas. if(!ok){ return false; } } Komma åt formulärkontroller För att komma åt formulärkontrollerna inom vårt formulär kan vi använda egenskapen elements: var form = document.getElementById("myForm"); // Ger oss den första formulärkontrollen var k1 = form.elements[0]; //Hämta kontrollen med name="firstName" var fn = form.elements["firstName"]; // Antalet kontroller i formuläret: var fn = form.elements.length; Elements returnerar en lista med noder i de fall då flera kontroller delar samma namn som ofta är fallet med radioknappar. Formulärelement Metoder och egenskaper som samtliga formulärkontroller delar: Metod/Egenskap form Ger oss det formulär i vilket kontrollen ligger. (Read only) name Elementets namn type Elementets typ (checkbox, text....) disabled Elementet är avaktiverat. Syns men kan inte användas. (true/false) value Det värde som kommer att skickas från kontrollen. readOnly Enbart läsbart? (true/false) tabIndex Tabbordningen för detta element focus() Ger kontrollen fokus blur() Fråntar kontrollen fokus Formulärkontroller, händelser Formulärkontroller har ett antal händelser som kan inträffa: Händelse blur Inträffar då kontrollen tappar fokus. focus Inträffar då kontrollen får fokus change Inträffar då textfält tappar fokus och värdet har ändrats eller när select-kontroller får ändrat värde. (behöver inte tappa fokus) form.elements["firstName"].onfocus = function(){ this.select(); } Textfält Textfält, textareor, password och hidden <input type="text" /> <textarea></textarea> <input type="hidden" /> <input type="password" /> Metod/Egenskap value Värdet på kontrollen defaultValue Det värde (value) kontrollen hade när denna först laddades. select() Markerar texten i textfältet myTextField.select(); // Markerar texten Kryssrutor och radioknappar <input type="checkbox" name="drug" /> <input type="checkbox" name="drug" /> <input type="checkbox" name="drug" /> <input type="radio" name="drug" /> <input type="radio" name="drug" /> <input type="radio" name="drug" /> Metod/Egenskap checked True/false om kryssrutan är ikryssad defaultChecked True/false om kryssrutan var ikryssad som default value Ger värdet av checkboxen/radioknappen myCheckbox.checked = true; // Kryssar i checkboxen Select-rutor <select> <option>1</option> <option>2</option> <option>3</option> </select> Metod/Egenskaper selectedIndex Den option som är vald value Det värde som den valda option-taggen har options[] De options som finns att välja på. onchange Event som utlöser när en ny option väljs // Skapa en ny Option extraOption = new Option(text, value, defaultSelected, selected); // Lägg till den sist selectBox.options[selectBox.length] = extraOption; Option Metod/Egenskaper defaultSelected True/False. Förvalt alternativ? (selected="selected") selected True/false. Vald? text Dess text value Värdet Knappar <input type="send" /> <input type="reset" /> <input type="button" /> Metod/Egenskap value Värdet av knappen tillika texten som står på knappen Smidigt kan vara att avaktivera knappen då formuläret skickas så att användaren inte råkar klicka flera gånger. mySendButton.disabled = true; mySendButton.value = "Skickar..."; Reguljära uttryck Reguljära uttryck används för att söka efter och ändra mönster i text. Vanliga användningsområden: • Validera data • Ändra text i en sträng Ett reguljärt uttryck är en uppsättning av tecken som vi kan testa mot en textsträng för att se om textsträngen uppfyller de krav som vårt reguljära uttryck definierar. Ett exempel på ett reguljärt uttryck: ^(19|20)[0-9][0-9]-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$ Ovanstående uttryck kan användas för att testa om en textsträng med ett datum är angiven på formen: ÅÅÅÅ-MM-DD Vi ska nu lära oss att skriva reguljära uttryck som testar strängar likt strängen ovan. Reguljära uttryck Reguljära uttryck skrivs på formen: "Siffrorna 0-9 ska matchas 3 gånger, därefter ska ett "-" förekomma minst en gång följt av exakt en punkt." Hur skrivs då detta i kod? Först av allt måste vi lära oss skapa reguljära uttryck. Ett reguljärt uttryck är precis som en Sträng, ett objekt. Dessa objekt (RegExp) kan skapas på två olika sätt: var myRegExp = /UTTRYCK HÄR/; var myRegExp = new RegExp("UTTRYCK HÄR"); Jag kommer uteslutande att använda literalen. / / Nu när vi vet hur man skapar ett reguljärt uttrycksobjekt måste vi lära oss hur vi skriver själva uttrycket. Reguljära uttryck Se till att ha lathunden framför dig när du tittar på följande: Vi vill skapa ett reguljärt uttryck som söker efter ett årtal i en text. Årtalet ska vara på formen YYYY och ligga mellan 1900 och 1999: Vi kan börja med att skapa uttrycket tankemässigt: "först ska 19 matchas en gång, efter det talen 0-9 två gånger." Vi översätter nu detta till ett reguljärt uttryck: 19[0-9]{2} Ovanstående uttryck kommer nu att leta efter år mellan 1900 och 1999. I strängen nedan är dessa markerade. "Landet blir en oberoende republik 1918, styrd av de socialdemokratiska mensjevikerna. Konflikter med Armenien, Azerbajdzjan och bolsjevikernas i Ryssland, gör regeringen allt mer nationalistisk. Relationerna till landets minoriteter försämras, med interna konflikter som följd. Bolsjevikerna kan med turkiskt bistånd ockupera landet 1921, och ..." Metoder Metoder på ett reguljärt uttryck: Metod exec(string) Matchar strängen mot pattern och returnerar en array med träffar eller null. test(string) Testar om match. Returnerar true eller false Metoder på en sträng: Metod split(pattern, gräns) Delar en sträng till substrängar som lagras i en array. match(pattern) Letar efter en viss del av en text i en sträng. Returnerar en array innehållande den hittade texten. replace(pattern, str) Byter ut en del av strängen mot något annat. search(pattern) Letar efter en viss del av en text i en sträng. Returnerar indexet till den hittade texten. -1 om miss. Reguljära uttryck Nu vet vi hur reguljära uttryck skrivs. Nu återstår att se hur vi använder dessa tillsammans med metoderna match(), split(), replace() och search() Vi börjar med att göra ett test om en inmatad sträng enbart innehåller siffror mellan 0 och 5: // Skapa det reguljära uttrycket var pattern = /^[0-5]+$/; var svar = prompt(“Skriv in siffror mellan 0 och 5:", 0); // Testa med match om strängen är OK if (svar.match(pattern)){ alert(“Strängen är OK"); } else { alert(“Strängen är inte OK"); } Reguljära uttryck Vi testar även att använda replace funktionen. Vi kan använda denna för att ersätta otillåtna ord i en sträng mot en förvald sträng: // Skapa det reguljära uttrycket var pattern = /(gris)|(katt)|(hund)|(häst)/g; var svar = prompt("Skriv in en text:", ""); svar = svar.replace(pattern, "djur"); alert(svar); Ovan används replace() för att byta ut all text som matchar mot texten djur. "Jag äger en gris" blir således "Jag äger en djur" Validera formulär Event på form-taggen onsubmit Inträffar precis innan formuläret skickas. Returneras false skickas inte formuläret. (Utmärkt vid validering) Enkelt valideringsexempel: if(!myForm.elements["test"].value.match(/^[0-9]+$/)) { alert("Enbart tal"); myForm.elements["test"].select(); return false; // Ser till att formuläret inte skickas } Klient- servervalidering SERVER KLIENT Behandla data skicka FEL! Ett klientskript validerar Här genomförs klientvalideringen. Denna validering är enbart till för att hindra "dumma" användare från att glömma fylla i uppgifter och liknande. Klientvalideringen är mycket enkel att lura och ta sig förbi. OK OK Servern validerar Här genomförs servervalideringen. Denna validering är till för att kontrollera så att all data som skickas för behandling är OK. Servervalideringen går det inte att lura och är därför bra för att förhindra hackerattacker.