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.
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.
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.
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.
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.
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.
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.
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.