JavaScript je vcelku silný pomocník pro lidi píšící webové aplikace a lze pomocí něj uživateli zpříjemnit práci a ne jenom nechat vyskakovat mraky nových okének. Jedna taková užitečná věcička, kterou lze v JavaScriptu vytvořit, je hledání v roletovém menu.

Pokud píšete větší aplikace s využitím internetových technologií, už jste určitě narazili na problém jak zobrazit dlouhý číselník. Lze ho zobrazit ve formě odkazů, pomocí rozbaleného <SELECTu>, či nezobrazit vůbec a použít vyhledávání. Osobně preferuji <SELECT> pokud položky nejdou do tisíců. Pak je to o dělení do skupin a až pak "můj oblíbený" <SELECT>. Orientaci v dlouhém seznamu nám <SELECT> usnadní tím, že umí hledat podle prvního znaku. Ale ne vždy to musí postačovat. Hodilo by se vyhledávání podle více znaků. Napsal jsem si proto jednoduchý script, který to umožňuje.

Jedná se vlastně o cyklické prohledávání seznamu podle vstupu uživatele. V <SELECTu> jsou jednotlivé položky tvořeny pomocí <option value=hodnota>TEXT</option>. Pro náš skript je důležité vědět co je obsahem jednotlivých položek. Ten lze přečíst pomocí JavaScriptu takto – document.jmeno_formulare.jmeno_selectu.options[i].text. 

Pro demonstraci si vytvoříme jednoduchý formulář, který bude obsahovat pole pro zadávání textu, který se má hledat a samotný <SELECT>.

<form name="myform">
Vyhledávání<br>
<input type="text" name="qsearch" size="25"><br>
<select size="5" name="mselect">
<option value=1>1</option>
<option value=2>12</option>
<option value=3>123</option>
<option value=4>1234</option>
<option value=5>12345</option>
<option value=6>123456</option>
<option value=7>1234678</option>
<option value=8>A</option>
<option value=9>AB</option>
<option value=10>ABC</option>
<option value=11>ABCD</option>
<option value=12>ABCDE</option>
<option value=13>ABCDEF</option>
</select>
</form>

Ke sledování textu, který uživatel napíše do textového boxu, si napíšeme jednoduchou funkci, která v časové smyčce 100 ms porovnává hodnotu proměnné lastValue s obsahem textboxu. Pokud se hodnoty liší, uloží se obsah textboxu do proměnné lastValue a zavolá se funkce QuickSearch.

lastValue="";//naposledy napsaný text
function ChangeChecker(){
//document.myform.qsearch.blur();// doplnek pro netscape, odebráni focusu
if (document.myform.qsearch.value.toLowerCase()!=lastValue){//pokud se naposledy zapsaný text liší
lastValue=document.myform.qsearch.value.toLowerCase();//ulož si ho do proměnné
QuickSearch();//a proveď funkci QuickSearch()
}
//document.myform.qsearch.focus(); // doplnek pro netscape, vrácení focusu
timerID=setTimeout("ChangeChecker()",100);
}

Funkce QuickSearch projde položky options v <SELECTu> a porovná jejich textový obsah s obsahem textboxu. Pokud obsah některé položky začíná na text v textboxu, provede se výběr dané položky a funkce je ukončena. Pokud žádná položka nevyhovuje, funkce zjistí, zda je některá položka vybrána. Pokud ano, provede se její odznačení. Zda je některá položka v <SELECTu> vybrána, zjistíme pomocí vlastnosti selectedIndex, kterou <SELECT> poskytuje. Pokud je tato hodnota -1, žádná položka není vybrána. <SELECT> je indexován od 0.

function QuickSearch(){
for (i=0;i<document.myform.mselect.length;i++){
if ( (document.myform.mselect.options[i].text.toLowerCase().indexOf(document.myform.qsearch.value.toLowerCase())==0)
&& (document.myform.qsearch.value!=““) ){//pokud je napsáno něco, co je obsaženo v OPTION
  document.myform.mselect.options[i].selected=true;//vyber danou položku
  return;
}
}
//a sem se dostanete pokud daný text není nalezen
if (document.myform.mselect.selectedIndex>-1)
document.myform.mselect.selectedIndex=-1;//odznačíme právě vybranou položku
}

No a teď už nám zbývá jenom spustit časovač. To je v našem případě nejlepší udělat ihned po načtení stránky, takže využijeme události onLoad, kterou vložíme do sekce BODY.

<body onLoad="ChangeChecker();">

Pokud si zkusíte tento script v Netscape, zjistíte, že funguje až od okamžiku kdy kurzor opustí textbox. Pokud se vám to zdá divné, vězte, že mě také. Podařilo se mi přijít na malou obezličku, která spočívá v tom, že se na začátku funkce ChangeChecker() textboxu odebere focus, provede se tělo funkce a pak se textboxu focus vrátí. Budete muset odblokovat 2 vykomentované řádky v této funkci pro plné zprovoznění scriptu i pro Netscape.

Vypadá to, že u Netscape se provádí aktualizace vlastnosti value pomocí události onChange, která se dle specifikace volá až po ztrátě zaměření prvku. Což mi přijde poněkud nesmyslné. Tato vlastnost má přeci odrážet aktuální stav, ale u Netscape nefunguje více věcí.

ukázka zde

Script je odzkoušen v MS IE 5 a NC 4.75 a měl by chodit i v trojkových verzích prohlížečů – ale ruku do ohně za to nedám :).

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

Odpovědět