Avatar billede gekko Nybegynder
17. august 2004 - 12:15 Der 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! :-)

Mvh.
Gekko
Avatar billede mat Nybegynder
17. august 2004 - 12:52 #1
opslag = ["kjeld", "hasse", "hassan", "bjarne", "børge"];

function getLike(arr, str) {
    for (i = 0; i < arr.length; i++) {
        if (str == arr[i].substring(0, str.length)) {
            output += arr[i] + "\n";
        }
    }
    return output;
}

trace(getLike(opslag, "b"));

noget i den stil?

mvh mat
Avatar billede gekko Nybegynder
17. august 2004 - 13:08 #2
Æh - jeps! Sikkert! Jeg har dog nok brug for en lidt mere udførlig walk-through...? :-)
Avatar billede gekko Nybegynder
17. august 2004 - 13:12 #3
...altså sådan lidt en A-Z. Skal jeg bruge "TextInput" componenten? Eller hvor skal jeg skrive din stump kode?
Avatar billede mat Nybegynder
17. august 2004 - 13:20 #4
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).

mvh mat
Avatar billede gekko Nybegynder
17. august 2004 - 13:43 #5
ok...

- 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)

Hwa nu? :-)
Avatar billede mat Nybegynder
17. august 2004 - 14:00 #6
forfra, lav en ny fil.

Lav et tekstfelt af typen "input" - giv det instancenavn "inp" (uden gåseøjne).

Lav et tekstfelt mere, denne gang af typen "dynamic" - giv det instancenavn "out" (uden gåseøjne).

Lav en knap (det er din search-knap).

Læg følgende action på din knap:

on (release) {
    out.text = getLike(opslag, inp.text);   
}

Og så smider du funktionen som frame script (jeg har lige lavet en lille korrektion):

function getLike(arr, str) {
    var output = "";
    for (var i = 0; i < arr.length; i++) {
        if (str == arr[i].substring(0, str.length)) {
            output += arr[i] + "\n";
        }
    }
    return output;
}


mvh mat
Avatar billede gekko Nybegynder
17. august 2004 - 14:18 #7
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.

Håber du (eller en anden) kan hjælpe...
Avatar billede mat Nybegynder
17. august 2004 - 14:34 #8
Har du husket arrayet?

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.

mvh mat
Avatar billede gekko Nybegynder
17. august 2004 - 14:36 #9
jeps - jeg har husket arrayet. Her er, hvad der står:

opslag = ["kjeld", "hasse", "hassan", "bjarne", "børge"];
function getLike(arr, str) {
    var output = "";
    for (var i = 0; i < arr.length; i++) {
        if (str == arr[i].substring(0, str.length)) {
            output += arr[i] + "\n";
        }
    }
    return output;
}
Avatar billede gekko Nybegynder
17. august 2004 - 14:38 #10
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?

Eller er jeg gal på den? :-)
Avatar billede mat Nybegynder
17. august 2004 - 14:45 #11
Ja lidt galt på den er du ;)

Du efterlyser en metode til at lede et givent antal opslag igennem med, den har du fået.

Det du mangler nu er at implementere den på en eller anden fancy måde - som du heller ikke ved hvordan man gør - og det er helt fint :)

Men så må du strukturere din opgave og få den splittet op i delopgaver som du kan løse hen af vejen, og til sidst stå med det ønskede resultat.

trin 1: En funktion der kan finde strenge udfra delstrenge i et array - done!

trin 2: Finde ud af at fange brugerinput ved tastaturtryk (nærmere betegnet "enter"). Og iøvrigt få dette koblet på trin 1.

trin 3: Finde en fancy måde at præsentere søgeresultaterne på...

(tilføj evt selv flere trin).

Jvf.: Trin 1. Har du husket instancenavne (det er ikke det samme som var-navne), er din knap i virkeligheden et movieclip?

mvh mat
Avatar billede gekko Nybegynder
17. august 2004 - 14:53 #12
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! :-)
Avatar billede mat Nybegynder
17. august 2004 - 14:57 #13
"- 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 :)

..og selv tak ;)

mvh mat
Avatar billede gekko Nybegynder
17. august 2004 - 15:20 #14
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?
Avatar billede gekko Nybegynder
17. august 2004 - 15:23 #15
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.
Avatar billede gekko Nybegynder
17. august 2004 - 15:35 #16
Den fixede jeg ved at ændre scriptet i movie clippet til:

if (this._parent.inp.text == "") {
} else {
    this._parent.out.text = this._parent.getLike(this._parent.search, this._parent.inp.text);
}

Nu tilbage til punkt 2:
Var det muligt at "vælge" den første af de foreslag den har i "out" ved at trykke enter?

Plz? Pretty plz? With sugar on top? :)
Avatar billede mat Nybegynder
17. august 2004 - 16:32 #17
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:

streng = "birte\ndorte";
ny_streng = streng.substring(0, streng.indexOf("\n"));
trace(ny_streng);

..så er der lidt at arbejde med ;)

mvh mat
Avatar billede gekko Nybegynder
17. august 2004 - 16:52 #18
Super! Du er min helt! ;)
Jeg prøver det i morgen!

Geks
Avatar billede gekko Nybegynder
18. august 2004 - 11:04 #19
Godmorgen! Så er jeg på den igen! :-)

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:

// autocompletion sniffer
function sniff() {
    if (inp.text == "") {
        out.text = "";
    } else {
        out.text = getLike(search, inp.text);
    }
}
inp.TextField.onChanged = sniff();
Avatar billede gekko Nybegynder
18. august 2004 - 11:18 #20
her tænker jeg noget i retning af (i det loopende movie clip):

if (Key.isDown(Key.ENTER)) {
    this._parent.gotoAndStop(this._parent.out.text);
}

Men det virker ikke... Er der en anden måde, man kan gøre det på?
Avatar billede gekko Nybegynder
18. august 2004 - 12:06 #21
Jeg bliver så klog! ;-)

I første frame skrev jeg:
search = ["hasse", ”hassan”, ”børge”];
function getLike(arr, str) {
    var output = "";
    for (var i = 0; i<arr.length; i++) {
        if (str == arr[i].substring(0, str.length)) {
            output = output + arr[i] + "\n";
        }
    }
    return output;
}

function get1st(arr, str) {
    var output = "";
    for (var i = 0; i<arr.length; i++) {
        if (str == arr[i].substring(0, str.length)) {
            return arr[i];
        }
    }
    return "";
}


Og i den loopende movie skrev jeg:

// 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.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”?
Avatar billede gekko Nybegynder
18. august 2004 - 12:06 #22
En løsning på det, og pointene er dine, mat! :-)
Avatar billede mat Nybegynder
18. august 2004 - 12:11 #23
1)

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 :)
Avatar billede mat Nybegynder
18. august 2004 - 12:13 #24
Du tager bare brugeres input og gør det hele til samme case i koden:

myString.toLowerCase();
Avatar billede mat Nybegynder
18. august 2004 - 12:14 #25
Og ja, du virker ret klog nu ;)
Avatar billede gekko Nybegynder
18. august 2004 - 12:18 #26
Tak tak! Too kind! ;-p

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? :)
Avatar billede mat Nybegynder
18. august 2004 - 12:22 #27
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 :)
Avatar billede gekko Nybegynder
18. august 2004 - 12:23 #28
cool - den fixer jeg! Tak for hjælpen! :-)
Avatar billede mat Nybegynder
18. august 2004 - 12:24 #29
np :)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester