webForumDet fria alternativet

Göra enter vid andra förekomsten av ett tecken?

JavaScript

9 svar · 1 028 visningar · startad av Fireh

Medlem sedan jan. 2003173 inlägg
Frågan#1

Hej.

Lite luddig rubrik kanske. Jag har en Mag-Tek MAG-21080205 kortläsare som börjar och slutar kortdatat med ;. Om den hade avslutat med ett enter/cr efter det så hade det inte varit några problem, men nu gör den inte det. Jag hittar inget sätt hur jag ska programmera om läsaren (gammal PS/2-grunka) att lägga på ett CR, så då tänkte jag så här:

Finns det något sätt att räkna antalet förekomster av tecknet ;? Det är ett vanligt textfält i ett formulär på en webbsida, så man borde väl kunna använda sig av "onChange" eller liknande och anropa ett Javascript. Javascriptet kollar om strängen innehåller 2 st ; och om så, så gör den ett submit av formuläret? På så sätt blir det ju inget submit före all kortdata är inläst.

Tack på förhand!

Mvh Peter

Medlem sedan aug. 20039 340 inlägg
#2

Just onchange triggar inte förrän textboxen förlorar fokus. Du kan använda onkeypress, men den triggar innan tecknet skrivs in. Följande kod kommer alltså skicka iväg formuläret innan det andra semikolonet har lagts till. (Detta kan möjligen variera mellan olika läsare också.)

Dock postas formuläret under rätt omständigheter, nämligen att det redan finns ett semikolon sist (this.value.slice(-1)==';') och det den aktuella knapptryckningen är ett semikolon (arguments[0].keyCode==59) alltså totalt två semikolon i rad.

<input name="code" value="" onkeypress="if(this.value.slice(-1)==';' && arguments[0].keyCode==59) this.form.submit();">

Om din serversida absolut inte klarar sig utan det sista semikolonet kan du lägga till en timeout på 50 ms innan formuläret skickas så att det kommer med.

<input name="code" value="" onkeypress="var theform = this.form; if(this.value.slice(-1)==';' && arguments[0].keyCode==59) setTimeout(function(){theform.submit();},50);">
Medlem sedan jan. 2003173 inlägg
#3

Själva serversidan struntar egentligen i det sista semikolonet om jag tycker den ska göra det, men det kommer dock inte två semikolon i rad. Datat som kommer från kortet ser ut t.ex. så här:

;1234684348651684534165312;

Det är när det sista semikolonet skrivits som jag vill att det ska skickas. Funktionen du skrev fungerar i övrigt med två på rad.

Medlem sedan aug. 20039 340 inlägg
#4

Ah. Jag missuppfattade det på något vänster som att det kunde komma flera datafält separerade med semikolon, och att hela raden avslutades med två semikolon. Då kan du byta ut kravet på att strängen ska sluta med semikolon mot ett krav på att den ska vara längre än 1 tecken långt.

<input name="code" value="" onkeypress="if(this.value.length>1 && arguments[0].keyCode==59) this.form.submit();">
Medlem sedan jan. 2003173 inlägg
#5

Ja det fungerar ju bättre! Jag tänkte mig då också få med det sista tecknet och testade lägga på timeout-grejen, men det verkar inte fungera alls däremot. Har testat både det du skrev samt ändrat på submit-kommandot eftersom det inte såg ut som de andra, men inget fungerar.

<input name="Carddata" type="text" onkeypress="if(this.value.length>1 && arguments[0].keyCode==59) setTimeout(function(){theform.submit();},50);"/>
<input name="Carddata" type="text" onkeypress="if(this.value.length>1 && arguments[0].keyCode==59) setTimeout(function(){this.form.submit();},50);"/>
Medlem sedan aug. 20039 340 inlägg
#6

Problemet är att när den inre funktionen väl körs så betyder this något annat. Därför måste du skapa en referens och skicka med. Det översta av dina försök är rätt förutom att du har glömt att skapa variabeln theform, som alltså inte existerar per automatik.

<input name="code" value="" onkeypress="var theform=this.form; if(this.value.length>1 && arguments[0].keyCode==59) setTimeout(function(){theform.submit();},50);">
Medlem sedan jan. 2003173 inlägg
#7

Toppen, funkar klockrent nu!

Medlem sedan jan. 2003173 inlägg
#8

Fast det fungerar inte i Firefox, bara i Internet Explorer och Chrome.
Har testat alla varianterna ovan, med och utan timeout.
Någon lösning på det?

Medlem sedan aug. 20039 340 inlägg
#9

Urk. Detta är den irriterande biten med Javascript. Läsarna har fortfarande sina små egenheter för sig. Det finns två attribut för att ta reda på vilken knapp som trycktes, keyCode och charCode. Ingen av de fungerar med alla läsare! Vissa Men det går att fixa med följande utttryck keycode=arguments[0].charCode||arguments[0].keyCode som ger charCode om det evalueras som true (i detta fall antingen 0 (false) eller ett nummer >0 (true)) annars arguments[0].keyCode. Så nu kanske det funkar perfekt till slut.

<input name="code" value="" onkeypress="var keycode=arguments[0].charCode||arguments[0].keyCode,theform=this.form; if(this.value.length>1 && keycode==59) setTimeout(function(){theform.submit();},50);">
Medlem sedan jan. 2003173 inlägg
#10

Nu fungerar det verkligen perfekt överallt :-)

268 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
129 ms — ändringar (db)