Než uživateli komplikovaně vysvětlovat, že nemá do vstupního pole formuláře zadávat uvozovky, mezery, nebo jiné znaky, je leckdy lepší zajistit, aby prohlížeč ignoroval nepovolené znaky, takže se v poli formuláře vůbec neobjeví. V tomto článku si ukážeme možné řešení.

Základem všeho je odchytávání stisku klávesy v poli formuláře obsluhou události onkeypress. Při této události vyvoláme vlastní funkci, zjistíme stisknutou klávesu a pokud neodpovídá povolené hodnotě, vrátíme hodnotu false, čímž je stisk klávesy zneplatněn. Využijeme zkušeností se získáváním kódu stisknuté klávesy, jak bylo popsáno v článku Prechod na nové pole formulára pomocou klávesy enter.

Drobným kazem na kráse je fakt, že některé prohlížeče se staví k možnosti zjištění stisknuté klávesy velmi vlažně. Pokud například chceme odchytávat klávesy v poli formuláře u Opery, obdržíme různé nesmysly. Opera sama totiž neví, zda se má chovat jako IE nebo NN, a tak raději podporuje obě metody a obě špatně. Následující skript je připraven tak, aby byl správně funkční v IE, v NN4 a NN6+/Mozille a v ostatních prohlížečích aby alespoň nezpůsoboval chyby. Pro nasazení v intranetu je to řešení ideální, pedant by snad ještě dopsal funkci, která by zkontrolovala obsah polí formuláře a případně nepovolila odeslání formuláře, pokud se objeví nepovolené znaky.

Než budeme pokračovat v dalším výkladu, můžete si prohlédnout naši ukázku, nebo si ji stáhnout v komprimovaném archivu.

Stránka s formulářem může vypadat takto:

<html>
<head><title>Povolený formát formulářového pole</title></head>
<body>
<script language="JavaScript" type="text/javascript" src="intellifields.js"></script>
<form>
Jen alfanumerické znaky:<br />
<input type="text" onkeypress="return alfanumeric(event,1);" size="40" />
<br /><br />
Jen alfanumerické znaky bez diakritiky:<br />
<input type="text" onkeypress="return alfanumeric(event,0);" size="40" />
<br /><br />
Zákaz nebezpečných znaků:<br />
<input type="text" onkeypress="return safechars(event);" size="40" />
<br /><br />
Jen numerické znaky:<br />
<input type="text" onkeypress="return numeric(event);" size="40" />
</form>
</body>
</html>

V polích formuláře jsou volány obslužné funkce události onkeypress, které návratovou hodnotou falsezruší nepovolené znaky. Pole mohou být samozřejmě libovolného typu – text, password nebo textarea. Obslužné funkce jsou definovány v externím souboru intellifields.js:

function getkey(e)
{
  var code;
  if (!e)
    var e = window.event; // nastaveni pro IE
  if (e.keyCode)
    code = e.keyCode; // IE a Mozilla
  else
    if (e.which)
      code = e.which; // NN4
  return code;
}
function numeric(eX)
{
  test=getkey(eX);
  if (test<48 || test>57)
    return false;
}
function alfanumeric(eX,diacritic)
{
  test=getkey(eX);
  set1=(test>32 && test<48);
  set2=(test>57 && test<65);
  set3=(test>90 && test<97);
  if (diacritic == 1)
    set4=(test>122 && test<127);
  else
    set4=(test>122)
  if (set1 || set2 || set3 || set4)
    return false;
}
function safechars(eX)
{
  test=getkey(eX);
  if (test==34 || test==39)
    return false;
}

Důležitá je funkce pro zjištění stisknuté klávesy getkey, která je upravena tak, aby předala kód stisknuté klávesy nezávisle na prohlížeči. Pokud prohlížeč není schopen předat kód stisknuté klávesy, nepředává se nic. Tím se vyhneme chybám v nekompatibilních prohlížečích. (Opera sice nastaví nějaké nesmyslné hodnoty, ale současná verze 6.04 si z návratové hodnoty false nic nedělá a do formuláře je možno psát cokoli.) Následují definice funkcí pro specifickou sadu povolených znaků. Funkce alfanumeric navíc pracuje s parametrem pro diakritické znaky, které jsou povoleny pouze tehdy, pokud má hodnotu 1.

Můžeme si samozřejmě dopsat funkce pro vlastní sadu povolených znaků. Pro snadné zjištění kódu znaků můžeme třeba upravit funkci getkey tak, aby vypisovala kód právě stisknutého znaku do stavového řádku prohlížeče (window.status=window.event.keyCode;). Například nedávno publikovaný článek o registraci uživatelů pro Vlastní přesměrovací službu by bylo dobré doplnit o funkci, která znemožní do uživatelského jména zadat nealfanumerické znaky, zejména mezery, podržítka a podobně.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět