Avatar billede eksperten1 Nybegynder
12. marts 2001 - 15:01 Der er 24 kommentarer og
3 løsninger

Valider formfelt ud fra Ayyar

Jeg har en ASP løsning kørende, hvor brugerne kan oprette nye varer, men jeg ville gerne kunne validere hvorvidt en vare allerede er oprettet under det netop indtastede varenr.
Min tanke var så at jeg kunne lave et JS array via ASP og så validere op mod dette når brugeren \"tab\"ede ud af feltet.

Min form hedder \"opret_produkt\" og feltet jeg gerne vil validere hedder \"varenr\". Kan I henvise til nogle eksempler eller vise noget kode. ?

Med venlig hilsen
Mark
Avatar billede eksperten1 Nybegynder
12. marts 2001 - 15:12 #1
Jeg mener ARRAY
(mine lammelser bør snart fortage sig :)
Avatar billede kasseper Nybegynder
12. marts 2001 - 15:30 #2
hvad er det du gerne vi ha ?
Er det metoden til at generere Array\'et eller opslags metoden i dette array du gerne vil se ?
Avatar billede eksperten1 Nybegynder
12. marts 2001 - 15:40 #3
Jeg er ude efter at bygge et array i ASP (let nok) og når brugeren indtaster et varenr i \"varenr\" (onChange ?) bliver dette valideret op imod det array der er bygget. HVIS varenr allerede eksisterer i array, vises en advarsel om dette, så brugeren ikke opretter et varenr flere gange.

Kan du fremtrylle noget lign. ?

/Mark
Avatar billede jakoba Nybegynder
12. marts 2001 - 15:40 #4
jeg får ud fra du har en form med 2 inputfelter:

<form  action=\"java script:insertMaybee(this);\">
<input name=\'varenr\' type=\'text\' sixe=10>
<input name=\'varebsk\' type=\'text\' size=30>
</form>

og et array med varenumre og beskrivelser (sikkert flere til pris osv osv)
var sortiment = new array();

function makeElem ( vare, beskr )
  this.varenr = vare;
  this.varebsk = beskr;
  return this;
}; //end makeElem ( string, string ) -> vare objekt

function insertMaybee( frm ) { // indsætter nyt varenummer
                                    // (hvis det ER nyt )
  for ( var i=0; i<sortiment.length; i++ ) {
    if ( frm.varenr == sortiment[i].varenr ) {
      alert( \"der er allerede en vare med det varenummer\" );
      return;
    };
  };
  sortiment[sortiment.length] = makeElem( frm.varenr, frm.varebsk );
}; //end insertMaybee( form objekt )

sådan noget lignende.

mvh JakobA
Avatar billede eksperten1 Nybegynder
12. marts 2001 - 15:43 #5
Hej JakobA
Mit array bliver bygget ud fra en db i ASP, det er når brugeren vil oprette en ny vare til denne db, at jeg vil kontrollere om den allerede er oprettet i db\'en.

Så jeg er ikke ude efter at oprette det array igennm js. (hvis jeg forstod din kode korrekt?)
/Mark
Avatar billede kasseper Nybegynder
12. marts 2001 - 16:02 #6
Jamen så se JakobA\'s kommentar :
function insertMaybee( frm ) { // indsætter nyt varenummer
                                    // (hvis det ER nyt )
 

Så den skulle da være god nok...!
Avatar billede jakoba Nybegynder
12. marts 2001 - 16:09 #7
Et array du opretter på serveren med ASP (serverside) kan ikke ses eller bruges af javascript (clientside). så jeg gik ud fra du genererede kode til at bygge arrayet i javascript.

For at checke det indtastede op imod serverside data er det nok nemmere at submitte formen og lade ASP udføre testen. ASP kan så svare tilbage og fortælle om det gik godt eller skidt.

mvh JakobA
Avatar billede eksperten1 Nybegynder
12. marts 2001 - 16:13 #8
Nu har du fat i den rigtige ende, men det var for at udngå at brugeren skal indtaste hele molevitten for så at få at vide at denne vare allerede var oprettet.
Min tanke var så at jeg kunne lave dette array i min side, ikke i et VB array, og checke at det nyindtastede varenr er NYT.

Kan I hjælpe med den alligevel ?

/Mark
Avatar billede erikjacobsen Ekspert
12. marts 2001 - 16:18 #9
Du kan jo altid kopiere din tabel ud som java script:

response.write \"tabel[\" & rs(\"varenr\") & \"]=1;\" & vbcrlf

(i en passende while løkke), og så spørge i JS på

  nr=parseInt(document.form.indtastningsfelt.value);
  if (tabel[nr]) {  ok } else { fejl }

Noget i den retning i hvert fald. Tabellen bliver jo nok lidt stor :)
Avatar billede eksperten1 Nybegynder
12. marts 2001 - 16:21 #10
OK, der stod jeg lidt af. Jeg skulle måske nævne at mine JS evner ikke rækker synderligt langt (læs ZERO)

Er den tabel et array eller ?
Jeg troede det var noget ala
varenr[1] = \"D604\"
varenr[2] = \"123456\"
o.s.v.

/Mark
Avatar billede jakoba Nybegynder
12. marts 2001 - 16:21 #11
du ku fx oprette arrayet i javascript vha en loop der løber din database igennem og for hvert varenr genererer en

sortiment[sortiment.length] = makeElem( varenr, varebsk );

linie i scriptet lige efter funktionen makeElem() er defineret.
Avatar billede eksperten1 Nybegynder
12. marts 2001 - 16:23 #12
stop stop. Jeg er ret sikker på at jeg kan lave det array via VBScript, så det eksisterer når siden bliver loadet i browseren. Men hvordan validerer jeg 1 felt op imod dette array ?

Lad os holde det så simpelt som muligt.

/Mark
Avatar billede kasseper Nybegynder
12. marts 2001 - 16:27 #13
Jeg tror jeg gir min version af forståelsen af spg.
Du vil gerne ha at din ASP side generere et Javascript array, som du run-time, altså på klienten kan tjecke det indtastede opimod ik?
Det kan sagtens lade sig gøre....
Avatar billede jakoba Nybegynder
12. marts 2001 - 16:27 #14
sortiment er et array der indeholder hele rækker.
Det var nok fjollet for der er ingen grund til at have andet en selve varenummeret i det så der kan testes.

du kan evt omskrive funktionen makeElem() til

function makeElem ( vare )
  sortiment[sortiment.length] = vare;
}; //end makeElem ( string )

og lave sidste linie i insertMaybee() om til blot
  makeElem( frm.varenr );

så slipper du for strukturen, dataene bliver jo alligevel submitted fra din form.
Avatar billede jakoba Nybegynder
12. marts 2001 - 16:29 #15
kasseper >> måske du skulle tage over. Jeg er blank i VBscript og hvor kompatibelt det er.
Avatar billede eksperten1 Nybegynder
12. marts 2001 - 16:30 #16
Hulk Snøft, men jeg forstår ikke hvad den funktion laver. Når jeg læser den er det som om at den tilføjer varenr til det array ?

Men det jeg vil have er at det array allerede eksisterer komplet når siden genereres af ASP koden. Så feltet varnr har en OnChange der tester imod det array.

Er jeg helt skævt skruet sammen eller ?
/Mark
Avatar billede kasseper Nybegynder
12. marts 2001 - 16:37 #17
Ja Array\'et skal eksistere når siden er loadet, men skal du bruge ASP koden til at generere det ?
eller hur ?
Det kan jeg sagtens lave, men jeg har ikke rigtig tid før om nogle dage, men mon ikke der er nogle af de andre der lige kan lirre det af, ja måske kunne ericjakobsen lige ryste det ud af ærmet....
Ellers skal jeg nok kigge ind om et par dage....
ericjakobsen har jo sådan set lavet recepten, han skal nok bare lige overtales til at forklare det lidt nærmere....:)
Avatar billede eksperten1 Nybegynder
12. marts 2001 - 16:41 #18
Jeg er blevet lidt overvældet af hvor komplekst der umiddelbart virker (!) Jeg tænker også på hvor meget det array fylder når nu der er oprettet 5000 varenr i dette array, det skal jo stadig downloades.

Jeg barsler med en ny idé....

Hvordan kan jeg submitte min form til validering onChange i feltet varenr.

Nå men jeg skal desværre hjemad nu, så der er et par timer til jeg er på igen. (vasketøj, madlavning, the works!)

I skal alle have spandevis af tak indtil videre.

Mark
Avatar billede jakoba Nybegynder
12. marts 2001 - 16:45 #19
<form  action=\"din_action.asp\" target=\"responsramme\"
          onsubmit=\"return insertMaybee(this, true)\">
<input name=\'varenr\' type=\'text\' sixe=10>
<input name=\'varebsk\' type=\'text\' size=30>
<input type=\"button\" value=\"findes den?\" onclick=\"insertMaybee(this.form, false);\"
<input type=\"submit\" value=\"opret ny vare\">
</form>

og et array med varenumre og beskrivelser (sikkert flere til pris osv osv)
var sortiment = new array();

function makeElem ( vare )
  sortiment[sortiment.length]=vare;
}; //end makeElem ( string )

<? ;her genereres arrayet fra den eksisterende DB med en masse linier a la:
  makeElem( \"123456\" );
?>

function insertMaybee( frm, insOK ) { // indsætter nyt varenummer
                                    // (hvis det ER nyt )
  for ( var i=0; i<sortiment.length; i++ ) {
    if ( frm.varenr == sortiment[i]) {
      alert( \"der er allerede en vare med det varenummer\" );
      return;
    };
  };
  if ( insOK )
    makeElem( frm.varenr )
  else
    alert( \"Det varenummer kender jeg ikke\" );
}; //end insertMaybee( form objekt, boolean )

nu har din form to knapper. en til at teste, der blot fortæller om varen findes og en til at indsætte varen ( submitter varedata og indsætter varenr i arrayet )

submitten action fil skal blot indsætte i databasen. Den behøver ikke at generere formsiden een gang til for vi husker hvilke varenumre der er blevet submittet ved at gemme dem i arrayet.

mvh JakobA
Avatar billede kasseper Nybegynder
12. marts 2001 - 16:48 #20
Jeg ville ikke umiddelbart, bruge denne metode når nu der er så mange varenumre, man skal tænke på at der altså stadig er folk med 33.6 modems....*g*
Er det ikke noget med
onChange=\"submit(this.form);\"
?????????????????????????????
Avatar billede eksperten1 Nybegynder
12. marts 2001 - 19:34 #21
Tja, som kasseper kommenterer, så har jeg overvurderet denne mulighed, jeg syntes stadig at den er fed nok, men brugerne kommer til at downloade et kæmpearray.
Måske skulle jeg gøre det at jeg checker via ASP anyhow.

Bliver det så bare noget ala...
<input type=\"text\" name=\"varenr\" onChange=\"submit(this.form);\">
Så smutter formen ud og jeg kan validere de data.

Det er for vildt med det her eksperten...

Er det OK hvis jeg fordeler mellem svarerne, jeg ville dog foretrække om kasseper også lige ville melde sig til pointuddeling !!

/Mark
Avatar billede erikjacobsen Ekspert
12. marts 2001 - 20:51 #22
Ok, med 5000 varenumre tager det lidt tid - og det er næppe ulejligheden
værd. Iøvrigt bør man vel bruge den \"associerede array\" effekt i objekter i
JS, så man ikke selv behøver at søge. Noget i retning af:

  var a = new Object();
  a.X123=1;
  a.Xd558=1;

for varenumre 123 og d558 (X-et er med fordi det skal begynde med et
bogstav). Så kan man slå op med

  if (eval(\"a.X\"+nr)) { ok } else { error }

Hvis mængden ikke er totalt uoverkommelig kan man lægge det i en ramme,
så det trods alt kun skal hentes én gang, selv om kunden afgiver flere ordrer.

Men den med kun at bruge ASP er nu også ret go\' :)
Avatar billede erikjacobsen Ekspert
12. marts 2001 - 21:00 #23
...\"associativt array\"... mente jeg jo :)
Avatar billede kasseper Nybegynder
12. marts 2001 - 22:29 #24
ok ok, men vil du ikke ha lavet noget ?
Avatar billede jakoba Nybegynder
13. marts 2001 - 07:18 #25
Den bestes \"browsersikre\" on the fly tester er  nok 
  onBlur=\"test_funktion(this)\"
den aktiveres hvergang du fjerner fokus fra feltet. som fx når du har skrevet noget i feltet og klikker i et andet for at skrive der.

her kunne test_funktion() så være noget a la:

function test_funktion( frmElem ) { // kaldes fra et text-felt hvor der skal
                                // indtastes varenr i formen 3 til 5 cifre
  if ( this.value.length == Math.max( 3, Math.min( 5, this.value.length ) ) {
    // lovligt antal bogstaver
    var OK = true
    for ( var i=0; i<this.value.length; i++ )
      OK = OK && ( \"o123456789\".indexOf( this.value.substr( i, 1 ) ) != -1    if ( OK ) {
      // det var bar cifre. feltet er helt iorden
      return true;
    } else {
      // feltet indeholder ikke kun cifre. kasseret
      alert ( \"der må kun indtastes cifrene 0..9\" );
      this.focus();
      return false;
    };
  };
  alert (\"der skal indtastes et tal mellem 100 og 99999\" );
  this.focus;
  return false;
}; //end test_funktion ( form_inputfelt objekt ) -> boolean
Avatar billede jakoba Nybegynder
13. marts 2001 - 07:23 #26
Ups:  der skal være 3 slutparenteser i  if ...  linien så det bliver:
  if ( this.value.length == Math.max( 3, Math.min( 5, this.value.length ) ) ) {

linien
      OK = OK && ( \"o123456789\".indexOf( this.value.substr( i, 1 ) ) != -1    if ( OK ) {
skal være 2 linier adskildt med ;
      OK = OK && ( \"o123456789\".indexOf( this.value.substr( i, 1 ) ) != -1 );
    if ( OK ) {
Avatar billede jakoba Nybegynder
13. marts 2001 - 07:28 #27
og det o (bogstav o) i cifferrækken skal nok hellere være et 0 (ciffer 0)
må hellere stoppe her :-))
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester