17. august 2004 - 12:15Der er
28 kommentarer og 1 løsning
Simpel søgefunktion (<100 søgemuligheder) i flash
Hejsa!
Jeg har lavet et lille flash dokument, med ca. 100 opslag. Nu vil jeg gerne lave et index - der også indeholder en søgefunktion: En search box, (der indholder navnene på de 100 opslag), og som automatisk færdigskriver indtastningerne - dvs. hvis to af opslagene var "bent" og "børge", ville searchboxen foreslå dem begge, når brugeren skrev "b", men kun "børge", når brugeren havde skrevet "bø". (håber det eksempel er til at forstå... ;)
Jeg er ikke nogen haj til programering - men er meget interesseret i at høre, om det ville kunne lade sig gi sig! :-)
funktionen skal placeres i en frame og du kalder den hver gang du vil sammenligne din tekststreng med de forskellige strenge i arrayet.
Funktionen tager to parametre: et array (som er din liste med "opslag"), og en streng (som er det input der står i f.eks et input felt).
Det er ikke nødvendigt med noget component (faktisk har jeg aldrig hørt om "TextInput"). Du skal bare bruge et tekstfelt af typen "input". (dvs din streng til funktionen vil være: instancenavn_paa_inputfelt.text).
- Jeg laver en movie (seach_sniffer) med din kode i frame 1 og en gotoandplay 1 i frame 2 - jeg lægger seach_sniffer i min første frame - i denne frame laver jeg også en textbox, som jeg vælger skal være "input" - jeg døber denne textstring "search.text" (under properties)
hm... har gjort, som du sagde, men den skriver bare "undefined" uanset, hvad jeg skriver i boksen. Jeg kan sende dig filen, hvis du vil se det? Har du messenger?
Desuden vil jeg egentlig gerne have, at den skal fungere som en søgebox - dvs. at man bliver sendt hen til "benny"-opslaget, når man trykker enter (eller på knappen).
Jeg prøver lige at sammenfatte:
1) En bruger ønsker at slå op under "hasse" 2) han sætter cursoren i søgeboksen og skriver "h" 3) da der både eksisterer en "hasse" og en "henrik" færdiggører søgeboksen ikke det han skriver endnu. 4) Da brugeren skriver "ha" færdiggører søgeboksen det han skriver: "hasse" 5) Brugeren trykker nu på enter (eller søgeknappen) og hasse-opslaget kommer frem.
Det er det, jeg gerne vil have den til at gøre. Alternativt ville det være cool, hvis den under punkt 3 gav brugeren mulighederne ("henrik" og "hasse") som valg i en rullegardinsmenu (ala autofuldførelse i explorer), men det er ikke det vigtigtste.
Jeg vil gerne hjælpe, men jeg gider ikke lave det for dig.
Det fint at du har en præcis definition af hvad du mangler, og du kan evt prøve at poste den ovre i opgaver. Nu har du ihvertfald en simpel funktion der kan lede igennem et array.
Jeg prøver ikke at få dig til at lave det for mig - kun hjælpe mig. Derfor forklarer jeg dig, hvad det er, jeg har brug for at lave - for så vidt jeg kan se, er det ikke det, som det du har suppleret mig med gør?
Yup - I agree! Så længe det ikke er spildt arbejde (dvs. at vi bevæger os i den rigtige retning), så lad os endlig holde os til trin ét, som vist ikke helt er done (eftersom det ikke virker)! ;-)
> Jvf.: Trin 1. Har du husket instancenavne (det er ikke det samme som var-navne), > er din knap i virkeligheden et movieclip?
- Jeg har givet følgende instancenavne: "inp" (uden gåseøjne) til den ene textbox & "out" (uden gåseøjne) til den anden.
- Knappen hedder ikke noget - og den er en "button" ikke et movie clip.
- når du skriver "frame script", så mener du bare, det som jeg kalder: "en movie (seach_sniffer) med din kode i frame 1 og en gotoandplay 1 i frame 2", right?
...og så lige tak for din hjælp indtil videre! :-)
"- når du skriver "frame script", så mener du bare, det som jeg kalder: "en movie (seach_sniffer) med din kode i frame 1 og en gotoandplay 1 i frame 2", right?"
Nej, der er kun een frame i _root (hovedtidslinien), der er ingen movieclips eller andet godt. Kun en knap og to tekstfelter (et af typen "input" og et af typen "dynamic").
Der er ikke andre actions end arrayet, funktionen og så dem på knappen...altså ingen gotoAndPlay()'s
Når du tester skriver du et eller andet i inputfeltet og trykker på knappen :)
Ok! Nu spiller det! Kewl! :-) Et stort check mark ud for trin 1! ;-)
Og så til trin 2:
Jeg vil gerne have den hele tiden at tjekke det, der bliver skrevet ind. Det gør jeg vel ved at lægge min commando fra knappen over i et movie clip med:
"this._parent.out.text = getLike(this._parent.search, this._parent.inp.text);" i frame 1 og gotoandplay 1 i frame 2
Passer det ikke? Så burde den hele tiden tjekke, hvad der bliver skrevet ind i "inp" boxen?
ok: "this._parent.out.text = this._parent.getLike(this._parent.search, this._parent.inp.text);" Det virker - så skal den bare have at vide, at den ikke skal skrive noget, når det er tomt.
At fange tastetryk fra brugeren: help > actionscript dictionary > k > Key, så finder man noget man kan stykke sammen til:
someListener = new Object(); someListener.onKeyDown = function () { if (Key.isDown(Key.ENTER)) { // test den her i browseren out.text = "hello world"; } }; Key.addListener(someListener);
Med hensyn til din if condition ville jeg nok istedet skrive:
if (this._parent.inp.text != "") { this._parent.out.text = this._parent.getLike(this._parent.search, this._parent.inp.text); }
Og jeg ville overveje at tjekke funktionen i TextField.onChanged istedet for et kontinuerligt loop i et movieclip. Men det kan du altid gemme til evt optimering :)
Og hvis du vil finde det første "entry" i den streng man har fået retur fra funktionen getLike(), så skilles hvert entry med en "\n" dvs man kan finde det første navn ved:
Jeg har ændret mit lopp’ende movie clip til følgende:
// autocompletion sniffer if (this._parent.inp.text == "") { this._parent.out.text = ""; } else { this._parent.out.text = this._parent.getLike(this._parent.search, this._parent.inp.text); } // Enter sniffer if (Key.isDown(Key.ENTER)) { this._parent.out.text = "test :)"; }
Det virker perfekt! :-)
Nu er jeg bare interesseret i, at jeg kan pille /n-værdien ud af min out-box – og lave en funktion, der på en eller anden måde får den til at gotoAndPlay’e værdien i out-boxen (hvis jeg nu navngav en frame ”hasse”). Kan man det? Eller er jeg nødt til at have en masse if’er?
PS: Det med TextField.onChanged lyder rigtigt spændende – og jeg kan se, at der er en masse andre TextField-funktioner, som ville være brugbare for mig. Men hvor skriver jeg en sådan fuktion henne? Bare i den første frame? Og hvordan henviser jeg til mit inp-felt? Jeg forsøgte med dette, men det virkede ikke:
// Enter sniffer if (Key.isDown(Key.ENTER)) { this._parent.gotoAndStop(this._parent.get1st(this._parent.search, this._parent.inp.text)); }
Det virker perfekt! :-)
Nu har jeg bare et sidste spørgsmål: Kan jeg få min ”inp”-box til at ignorere hvorvidt brugeren skriver med store eller små bogstaver? Således at ”hassan” kommer frem uanset om brugeren skriver ”hassan” eller ”Hassan”?
function sniff() { trace("hest"); } inp.onChanged = sniff;
2)
Du kan sagtens gå til et frame label ved at referere til strengen i et tekstfelt - men det er muligt at din streng ser således ud: "hasse\n" og ikke "hasse"...det skal jo så skæres til :)
Mht. myString.toLowerCase();, så stillede jeg vist spørgsmålet dumt. out-boxen skal selvfølglig skrive "Hassan" uanset om brugeren skriver "hassan", "HASSAN" eller "Hassan". Kan jeg så stadig bruge myString.toLowerCase();? Eller hur? :)
nah så er du nødt til at lege lidt med det, du skal jo først have lave det første bogstav (String.substring(0, 1)) til uppercase (det hedder toUpperCase() hvis du ikke havde gættet det ,) - dernæst skal resten (String.substring(1, String.length)) laves til lowercase, og til sidst skal de sættes sammen, og så har du dit output :)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.