Avatar billede apromis Praktikant
05. august 2010 - 01:35 Der er 8 kommentarer og
1 løsning

delay vil ikke virker :(

Hej allesammen.

Denne her kode virker og er testet :
onkeyup="ajax_showOptions(this,'getCountriesByLetters',event)"

Men hvorfor virker nedenstående delay så ikke ?

onkeyup="setTimeout(\"ajax_showOptions(this,\'getCountriesByLetters\',event)\", 350)"
Avatar billede janmanden Nybegynder
05. august 2010 - 04:30 #1
Når du kalder funktionen på den måde med en streng, så ophører både 'this' og 'event' jo med at pege på og referere til noget, så derfor vil du være nødt til at udspecificere begge. I stedet for 'this' vil du f.eks. skulle skrive document.getElementById('myId') og i stedet for event.. tjah, hvad bruger du event til?
Avatar billede softspot Forsker
05. august 2010 - 08:43 #2
Du kan måske klare det med en closure-konstruktion (ikke smukt, men jeg tror det fungerer):

onkeyup="var thisElm = this; setTimeout(function(){ajax_showOptions(thisElm,'getCountriesByLetters',null);},350);"

Jeg kan ikke lige gennemskue hvad event-parameteren dækker over, men hvis det er et system-event, kan du i det mindste ikke bare føre den videre til funktionen, når den er "forsinket". Derfor har jeg sendt null i stedet for event-parameteren. Hvis event er et objekt eller en værdi du har et andet sted fra, kan du sikkert bare føre den med i kaldet.
Avatar billede apromis Praktikant
05. august 2010 - 10:36 #3
Hej i begge.

Sikke noget møg, det anede jeg ikke.

Jeg har ingen oplysninger om hvad event og this har af funktion da det er et downloadet eksempel af google suggust. KAn ikke gennemsku deres kode :(.

Men kan jeg på en eller anden måde lægge det delay op i ajax_showOptions funktionen ?
I så fald, hvordan ?
Avatar billede apromis Praktikant
05. august 2010 - 10:41 #4
Eneste sted denne event bruges i funktionen er til denne her :
        if(e.keyCode==13 || e.keyCode==9)return;

Siger det jer noget  ? :)
Avatar billede softspot Forsker
05. august 2010 - 10:56 #5
Ja, det betyder at når der trykkes enter eller tabulator så returneres der fra funktionen. Dvs. funktionen skal altså bruge eventet til noget, så derfor skal du også levere eventets informationer til funktionen. Dette kan som sagt ikke gøres direkte, men du kan aflæse de informationer du har behov for og lægge dem i et nyt objekt, som så sendes med. Det kan være det er nok til at tilfredsstille ajax_showOptions-funktionen. Dette kan opnås nogenlunde således:

onkeyup="var thisElm = this, thisEvt = {keyCode:(event?event.keyCode:arguments[0].keyCode)}; setTimeout(function(){ajax_showOptions(thisElm,'getCountriesByLetters',thisEvt);},350);"
Avatar billede apromis Praktikant
05. august 2010 - 11:05 #6
Det virker sådan set fint :).
Pointsne er dine.

Må jeg spørge dig om en ting mere.
Denne her forsinker mit ajax script lidt så den ikke søger ved hvert taste tryk.
Men hvis der tastes endnu en gang (eller slettes) inden for delay (har prøvet at sætte den op til 10000), så begynder den ikke forfra men delayet.
Kan man det ?
Avatar billede softspot Forsker
05. august 2010 - 11:23 #7
Måske noget i stil med dette:

onkeyup="var thisElm = this, thisEvt = {keyCode:(event?event.keyCode:arguments[0].keyCode)}; if(this.tmr) clearTimeout(this.tmr); this.tmr = setTimeout(function(){thisElm.tmr = null; ajax_showOptions(thisElm,'getCountriesByLetters',thisEvt);},350);"
Avatar billede apromis Praktikant
05. august 2010 - 11:30 #8
Virkeligt smukt. Tak :)
Avatar billede softspot Forsker
05. august 2010 - 11:44 #9
Jeg vil da gerne stille spørgsmålstegn ved æstetikken af løsningen, men hvis det fungerer for dig, så velbekomme og tak for point :-)
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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