Autor Zpráva
Shadowek
Profil
Dobrý den, potřeboval bych obsah jednoho selectu filtrovat pomocí textu v inputu. Mám tento kód:
<input id="input">
<select id="select">
  <option value="1">Ahoj</option>
  <option value="2">Zdar</option>
  <option value="3">Nazdar</option>
</select>

A potřeboval bych aby po napsání do inputu například písmena "a" vyfiltrovaly všechny optiony (tady všechny obsahují "a" takže by prošly a zůstaly všechny), ale kdyby se napsalo "zdar", tak by tam zůstaly jen Zdar a Nazdar, protože ty jedinné obsahují zadaný řetězec. Zkoušel jsem to napsat, ale nefungovalo mi to ... Používám jQuery, tak by se mi hodilo kdyby jste mi poradili v něm :) Děkuji.
Witiko
Profil
1) Do nějaké proměnné si uložíš referenci na pole všech options pod selectem, nějak takto: var options = document.getElementById("select").options; (v jQuery to bude asi $("#select") a z hlediska způsobu, jakým se argument předá, nebude ani třeba ukládat referenci do proměnné). Poté pole (pomocí jQueryovského each, jinak klasickým for cyklem) projdeš a buď pomocí regulárního výrazu /text/i.test(text) či new RegExp("text","i").test(text) pro dynamické generování nebo pomocí text.indexOf(text) (ale na základě toho cos říkal usuzuju, že chceš case-insensitive search, v tom případě se regulární výraz hodí víc) otestuješ u každého jednotlivého optionu jeho innerHTML. Pokud jQuery implementuje nějakou funkci na filtrování celého Arraye na základě regulárního výrazu, tím lépe pro tebe.

2) Nehodící se skryješ pomocí .style.display = "none"; či .style.visibility = "hidden";, u hodících se zkontroluješ viditelnost a kdyžtak je odkryješ, pokud by byly skryté z nějakého předchozího filtrování: .style.display = "ok"; či .style.visibility = "visible";

Směle do toho!
Shadowek
Profil
No ano to je sice hezké, ale to neřeší můj problém, protože na optiony nějaké ty visibility: hidden; nefungují ...
Witiko
Profil
Pokud to skutečně není možné, pak si buď:

1) V cyklu zazálohuješ do pole objektů stav veškerých momentálních options z pole v proměnné options viz.: [#2] načež bys jednotlivé options natvrdo smazal pomocí $("#select").removeChild(options[index]). To mi přijde velmi brutální a neefektivní, protože bys musel po každém filtru znovu vytvořit veškeré smazané options.

2) Vytvoříš duplicitní select, původní skryješ, duplikát dosadíš na jeho místo. V duplikátu pak provedeš co popisuji v postu [#2], jen nebudeš měnit viditelnost, ale rovnou jednotlivé položky $("#select").removeChild(options[index])neš. Při dalším hledání opakuješ - tzn.: Vytvoříš nový duplikát z původního a nyní skrytého selectu a nahradíš jím duplikát předešlý. V případě vypnutí filtru odstraníš duplikát a zobrazíš neporušený originál. Před odesláním formuláře vytáhneš scriptem value ze správného z nich (originálu / duplikátu) a přiřadíš jí do value nějakého hidden inputu.

Směle do toho!
Shadowek
Profil
Jo no to je rozumné, nechceš mi to napsat ;)
Witiko
Profil
Taky se trochu snaž, napsal jsem ti sem způsob, jakým to udělat, funkce, které při tom využít. Pokud narazíš na problém, tak ti určitě já nebo někdo jiný poradíme.
Shadowek
Profil
No ano, ale jsem na javascript mírně slabší ...
Witiko
Profil
V příspěvcích [#2] a [#4] ti prakticky popisuju všechno, co v tom scriptu bude. Jediné, co je snad třeba doplnit, je ten each cyklus. Pokud chceš ode mě napsat řešení, tak bych ti ho:

1) Nenapsal v jQuery, jednoduše protože jQuery nepoužívám, napsal bych ho v čirém javascriptu.
2) Nenapsal bych ti ho na míru, jelikož nevím, kde přesně ho budeš používat, bude-li se odesílat formulářem atd.
3) Tobě by to nic nedalo.
4) Jak už jsem říkal, máš v daných příspěvcích prakticky krok za krokem postup rovnou i se zápisem v jQuery. Cokoliv nechápeš, zeptej se.
Shadowek
Profil
No jo no ... tak mě to dnes už nemyslí ... jsem celé odpoledne psal RS ...
Witiko
Profil
A já tu už přes půl dne sepisuju texty o historickém vývoji germánských jazyků. :)

Pokud najdu čas, nějaké všeobecné řešení ti zítra třeba i napíšu (v obecném javascriptu) nebo případně někdo jiný. Jen to samozřejmě není účelem tohohle fóra a bylo by mnohem lepší - jak pro tebe, tak pro kohokoliv, kdo bude zpětně tenhle topic pročítat při hledání rady - kdybys to začal psát sám. Nejde o nic velkého, jde prakticky o napsání jedné zcela lineární funkce (nemyšleno matematicky) .

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0