Nu vil jeg gerne have lavet en validerings-system, der kan følgende:
1. Løbende validere det der tastes ind i feltet (med onchange() eller onkeyup() går jeg ud fra) og det øjeblik det valideres korrekt skal style="" ændres.
2. Validere mod flere ting på en gang.
Jeg have forestillet mig en at kalde en funktion ved onchange()/onkeyup(), der så kan tjekke 'field1' mod X antal forskellige regex's, men jeg er ikke sikker på hvordan jeg skal bygge systemet op.
Jeg ved ikke hvor svært dette spørgsmål er, men mine javascript færdigheder rækker i hvert fald ikke endnu. Jeg hæver pointene hvis løsningen viser sig at være avanceret :)
Valideringen er en mindre del af et større formular-system jeg er ved at lave, derfor 'del 1'.
Det er alle mulige typer input, emails, url, tlf#, der skal kunne tjekkes mod min/max lændgde osv.
Er det ikke smartest at lave en funktion alla:
function validate(regex, str) { //osv. }
Men jeg kan ikke hitte ud af hvordan jeg den, så den kan validere forskellige regex på en gang. Så jeg kan tjekke om det er en URL og om den er længere end 4 karakterer uden at skulle lave en ny regex.
øhm, nu er jeg ikke så god til det med regular expressions, men var det mon noget i den her stil: function valElm(elm) { var regexps = new Array(); for (i=1;i<arguments.length;i++) { regexps[regexps.length] = new RegExp(arguments[i].substring(1,arguments[i].lastIndexOf("/")-1),arguments[i].substr(lastIndexOf("/"))); } var valid = true; for (i=0;i<regexps.length;i++) { if (elm.value.match(regexps[i])); else valid = false; } if (valid) { elm.style.color = "blue";} else elm.style.color = "red"; }
når du skal kalde den skal du skrive: <input type="text" name="field1" style="color: red" onchange="valElm(this,'/^\d?\d-\d?\d-\d\d\d\d$/gi','/foo/i');">
eller hvad for en event du nu vil bruge (er ikke testet).
okay der var i hvert fald mindst én fejl: regexps[regexps.length] = new RegExp(arguments[i].substring(1,arguments[i].lastIndexOf("/")),arguments[i].substr(arguments[i].lastIndexOf("/")+1));
Jeg er kun nået til babystadiet mht. javascript, men kan jeg bare kalde funktionen med alle de argumenter (regexp) jeg har lyst til og checke med arguments.length ? (Kender PHP, der kan man jo noget lignende).
At det muligt at ændrer en hel style i stedet for kun color, eller er jeg nødt til at kalde ændrer en class hvis jeg skal ændrer mere end en ting ?
Tjah, det er jo egentlig en enormt smart metode, du efterlyser !o]
(tror der kunne tjenes mange $ på den !-)
Altså, du vil have en generel funktion, så du kan lave et simpelt kald, og så få checket, om input stemmer med reglerne undervejs, uanset hvilke regle, som gælder for det pågældende input ...
-- kunne forestille mig noget i stil med:
reg = new Array();
reg[0] = /^\d$/; reg[1] = /^\w{4}$/;
function runningCheck(n,fld){ if(!fld.value.match(reg[n])){ alert("Fejl i "+fld.name); fld.style.color="red"; }else{ fld.style.color="blue"; } }
googolplex >> Hvis du bruger den funktion jeg har lavet skal du bare tilføje noget mere elm.style.etellerandet = "etellerandet" i funktionen (ikke særlig dynamisk godt nok). fx: if (valid) { elm.style.color = "blue";elm.style.backgroundColor = "#f0f"} else {elm.style.color = "red";elm.style.backgroundColor = "#fff";}
Men vil du have det sådan at man for hver funktion selv skal bestemme hvad der skal ske med feltet???
Der er intet i vejen for at smide dem direkte i funktionskaldet (hrm, tror jeg, jeg har aldrig smidt den specielle streng-type i et funktionskald !-)
-- men jeg ville selv bruge database-ideen, for så kunne man jo bare henvise til den samlede mængde (og evt. genbruge den, når manden skulle angive både privat- og arb.-tlf.)
Roenving: Jeg bygger det hele op i en PHP-klasse, jeg tror det passer bedre hvis jeg kan smide de forskellige regex direkte i funktionskaldet. Men kan din funktion tage flere regex's på en gang ?
Det er i hvert ikke de flere regexp's, som kan give problemer !-)
-- men lav _ikke_ classes om, for det har nogle helt andre implikationer, end du åbenbart tænker ...
Når browseren opbygger siden og bagefter renderer den, opbygger den et bibliotek over de forskellige elementers renderings-style, som er eksplicit på hvert enkelt element ...
Eksempel:
<h1>Overskrift<br> Denne tekst er vigtig</h1>
Altså, den skriver i biblioteket, at det første tekst-element har style: display:block; font-size:x-large; osv. -- det gælder for "Overskrift"
Derefter skriver den et nyt entry for "Denne tekst er vigtig", som er: style: display:block; font-size:x-large;
-- da den gør det på et så basalt niveau, har den et problem, hvis du ændrer een style: Hvordan finder den ud af, om du f.eks. har nestede definitioner, som inkluderer H1 ?-)
-- Hvis den nu oprettede en crossreference-database med den slags oplysninger, kunne den selvfølgelig hurtig klare dette problem, men afhængig af din måde at opbygge nesting, kunne den ende med en database med tusindvis af tabeller, som refererede frem og tilbage, så den bruger en mere pragmatisk løsning:
-- Alt slettes, og vi starter forfra !-)
-- En billede, som svarer til det:
-- forestil dig, at fordi du afleverer een bog på biblioteket, så tager de alle bøgerne ned fra hylderne, og sætter dem tilbage efter de har lavet en sortering, som inkluderer bogen ...
-- for slet ikke at snakke om, at du afleverer flere bøger, for så skal de til at hive alle bøgerne ned flere gange !o]
Morale: Skift _aldrig_ en class, hvis der på nogen måde kan findes en anden rimelig brugbar løsning !-)
-- jeg har ikke checket, om den reagerer css-agtigt (kun overskriver nævnte parametre !-) eller reagerer javascript-agtigt (overskriver alle properties ?-)
Ha, jeg skule da lige vide det, så sådan overskriver du alle properties:
.style.cssText='text-decoration:line-through;';" (testet i WebWriter4 !-)
2: Ja !-)
function runningCheck(n1,n2,fld){ if(!fld.value.match(reg[n1])&&!fld.value.match(reg[n2])){ alert("Fejl i "+fld.name); fld.style.color="red"; }else{ fld.style.color="blue"; } }
3: Tjah ... Kigger du på den input-maske, som jeg byggede sammen med en anden bruger herinde (linket !-), fandt vi frem til at det var bruger-uvenligt, at man ændrede i noget allerede indtastet, så det var en anelse mindre uvenligt bare ikke at skrive noget, som var forkert, men situationen kan være meget anderledes i forskellige situationer !-)
-- hvis folk skal indtaste et telefonnmmer, mener jeg, at det er bedst at bruge non-accept-metoden (linket), hvis de taster andet end tal, men ellers er erikjakobsens metode jo egentlig skide-smart: henled opmærsomheden på en ændring (som jeg jo også straks genbrugte !-)
-- og lige en præcisering af, hvornår events forekommer: - onkeydown: Før tegnet når input-feltet, så det indeholdes ikke i value, en return false fjerner tegnet, og event.keyCode findes som oversat tastatur-kode (ascii-værdi e.l.) -- 'G' = 71 - onkeypress: Når tegnet er sat, value indeholder også tegnet, en return false kan fjerne tegnet (keyCode findes som tegn) -- 'G' = 'G'; - onkeyup: Efter tegnet er indsat, og keyCode findes som oversat tastatur-kode (ascii-værdi e.l.) -- 'G' = 71 - onchange: når feltet ikke mere har fokus, og der er forskel på, hvilken værdi, som var før og efter fokus, tegnet kan ikke findes, men værdien er den fulde felt-værdi ...
-- ovenstående er IE-typen, men lige der reagerer de andre browsere på samme måde !-)
Jeg har tænkt lidt frem og tilbage og kommet frem til, at det er nemmest hvis jeg bare laver en funktion der kan validere en enkelt regex, det er jo de samme man bruger hele tiden (postnummer, email osv), så det skulle ikke være noget problem at lave dem alle.
Jeg tænkte på at lave funktionen således (en blanding af dit og erik's):
function validate(field, regex, style1, style2) { if (field.value.match(regex)) { field.style.cssText="style1"; { else { field.style.cssText="style2"; } }
2. Er det korrekt at benytte 'onkeyup' ? (Det har jeg stadigvæk ikke forstået, det skal være sådan, at når brugeren skriver i feltet, så tjekker den, men fjerner intet)
googolplex>> har du haft held til at bikse noget fornuftigt sammen? - jeg har selv tænkt på at det du her er inde på er smart, men er ligesom du selv mere til PHP og knap så meget til javascript - jeg tænkte om man kunne komme til at se det du er kommet frem til? evt. på exp@avminmusearm.dk
Både ja og nej. Jeg mangler faktisk bare at sætte de sidste javascript funktioner ind i mit script, men pga. ekstremt tidspres i år, har jeg lagt projektet på is indtil juletid. Du kan godt se det jeg har, men om du kan hitte rundt i mit rod ved jeg ikke ;) Som du kan se planlægger jeg at omskrive det til PHP5, men det skulle ikke være det store problem:
class Form { var $mAction; var $mClientValidation; var $mCounter; var $mError; var $mErrors; var $mFieldNames; var $mFields; var $mForm; var $mFormAttributes; var $mFormIsSent; var $mIconPath; var $mJavaScriptFunctions; var $mMethod; var $mRules; var $mSubmitName;
/* $key contains the value of the counter, $value contains an array used in another foreach() */
foreach ($this->mFields as $key => $value) { foreach ($value as $key2 => $value2) { switch($key2) { case 'button': $this->BuildButton($key); break; case 'checkbox': $this->BuildCheckbox($key); break; case 'file': $this->BuildFile($key); break; case 'hidden': $this->BuildHidden($key); break; case 'html': $this->mForm .= $this->mFields[$key]['html']; break; case 'password': $this->BuildPassword($key); break; case 'password2': $this->BuildPassword2($key); break; case 'radio': $this->BuildRadio($key); break; case 'reset': $this->BuildReset($key); break; case 'select': $this->BuildSelect($key); break; case 'submit': $this->BuildSubmit($key); break; case 'text': $this->BuildText($key); break; case 'textarea': $this->BuildTextarea($key); break; case 'default': break; } } }
$javascript .= ' function jjrClearForm(form) { form.reset();
for(i=0;form.elements.length>i;i++) { switch(form.elements[i].type) { case 'password': form.elements[i].value = ''; form.elements[i].focus(); break; case 'text': form.elements[i].value = ''; form.elements[i].focus(); break; case 'textarea': form.elements[i].value = ''; form.elements[i].focus(); } } }';
break; case 'clearformii': break; case 'focusall': break; case 'resetform': break; case 'validate': break; case 'validateselect': break; case 'default': break; }
function jjrGiveAllFocus(form) { for(i=0;form.elements.length>i;i++) { switch(form.elements[i].type) { case 'password': form.elements[i].focus(); break; case 'select-one': form.elements[i].focus(); break; case 'select-multiple': form.elements[i].focus(); break; case 'text': form.elements[i].focus(); break; case 'textarea': form.elements[i].focus(); } } }
function jjrFocusAll(form) { for(i=0;form.elements.length>i;i++) { switch(form.elements[i].type) { case 'password': form.elements[i].focus(); break; case 'select-one': form.elements[i].focus(); break; case 'select-multiple': form.elements[i].focus(); break; case 'text': form.elements[i].focus(); break; case 'textarea': form.elements[i].focus(); } } }
hold da op sikke en smøre :-) - jeg vil kigge nærmere på det, men du må da gerne holde mig ajour hvis du putter mere (det sidste) på scriptet/klassen - især hvis du lavet et eksemple script på hvordan du har tænkt dig det skal bruges :o), men foreløbig lurer jeg selv lidt på det! tak
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.