| Autor | Zpráva | ||
|---|---|---|---|
| Shadowek Profil |
#1 · Zasláno: 26. 10. 2010, 21:04:19
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 |
#2 · Zasláno: 26. 10. 2010, 21:17:08 · Upravil/a: Witiko
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 |
#3 · Zasláno: 26. 10. 2010, 22:03:50
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 |
#4 · Zasláno: 26. 10. 2010, 22:26:17
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 |
#5 · Zasláno: 26. 10. 2010, 22:35:20
Jo no to je rozumné, nechceš mi to napsat ;)
|
||
| Witiko Profil |
#6 · Zasláno: 26. 10. 2010, 22:38:22 · Upravil/a: Witiko
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 |
#7 · Zasláno: 26. 10. 2010, 22:43:38
No ano, ale jsem na javascript mírně slabší ...
|
||
| Witiko Profil |
#8 · Zasláno: 26. 10. 2010, 23:04:28 · Upravil/a: Witiko
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 |
#9 · Zasláno: 26. 10. 2010, 23:39:37
No jo no ... tak mě to dnes už nemyslí ... jsem celé odpoledne psal RS ...
|
||
| Witiko Profil |
#10 · Zasláno: 26. 10. 2010, 23:58:10 · Upravil/a: Witiko
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) . |
||
|
Časová prodleva: 15 let
|
|||
0