Avatar billede mickiii Nybegynder
18. august 2005 - 18:42 Der er 11 kommentarer og
1 løsning

keyevents ved liste

Hej,

Jeg har forsøgt mig med en dynamisk 'suggest' funktion, som også fungere fint. Men nu kunne jeg godt tænke mig at man kunne benytte relevante keyboardtaster for at navigere i de returnede resultater. Jeg har selv prøvet lidt, men må indrømme at jeg ikke lige kan få det til at spille. Håber nogen herinde måske er i stand til at hjælpe.

Derudover, er det så muligt at en kunne give et eksempel på hvorledes man pauser søgningen på servern, således at den først starter efter man ikke har rørt tastaturet i et sekund eller lign. Ellers så køre query'et jo konstant, hvilket vel kan blive lidt voldsomt for serveren.

<script type="text/javascript" language="JavaScript">
<!--
var xmlhttp = false;//XMLhttp variabel som holder XMLHttpRequest objektet

if (window.XMLHttpRequest) {//Hvis Mozilla,Firefox,Safari etc.
  xmlhttp = new XMLHttpRequest();
  xmlhttp.overrideMimeType('text/xml');
} else if (window.ActiveXObject) {//Hvis IE
  xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}

function suggest(input, result) {//'input' = formfelt, 'result' = div hvor resultater er vist
  result = document.getElementById(result);
 
  if(input.value !== "") { //Hvis input er udfyldt, spørg script, behandl resultater
    result.innerHTML = "Søger...";
    var url = 'ajax.php?q=' + input.value;//url til script + input værdi
   
    xmlhttp.open('GET', url, true);//'true' = Åbner asynkront, 'GET' = metode, 'url'=script
   
    xmlhttp.onreadystatechange = function() {//Tjek at resultatet er færdigsendt
      if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
        sortResults (xmlhttp.responseText, input, result)//Fyld resultat-div
      } else {
        result.innerHTML = 'Fejl!';//Hvis fejl eller manglende svar
      }
    };
  xmlhttp.send(null);
  }
}

function sortResults (string, input, result) {
  // splitter streng til key->value par
  var matches = string.length > 0 ? string.split('||') : [];
  for (i in matches) {
    matches[i] = matches[i].length > 0 ? matches[i].split('|') : [];
  }
  while (result.hasChildNodes()) { result.removeChild(result.childNodes[0]);}//Hvis der allerede er childs, så fjerne vi dem
  var ul = document.createElement('ul');
      ul.setAttribute('id','list');
  if (matches.length > 0) {
    for (i in matches) {
      li = document.createElement('li');
      div = document.createElement('div');
      div.innerHTML = matches[i][1];
      li.appendChild(div);
      li.autocompleteValue = matches[i][0];
      li.onmousedown = function() { select(this, input, result); };
      li.onmouseover = function() { highlight(this); };
      li.onmouseout  = function() { unhighlight(this); };
      ul.appendChild(li);
    }
    result.style.display = 'block';//Vis resultat div
    result.appendChild(ul);//Fyld resultater
  }
}

function select(node, input, result) {
  input.value = node.autocompleteValue;//Flyt værdi til tekstboks
  result.style.display = 'none';//Skjul resultat boks
}

function highlight(node) {
  node.className = 'selected';//Sæt class selected
}

function unhighlight(node) {
  node.className = '';//Fjern class selected
}

</script>

<form action="/test/index.php" method="post">
<label for="query"><strong>Search:</strong>&nbsp;<input type="text" name="query" id="query" onKeyUp="suggest(this, 'result')" /></label>&nbsp;
<input type="submit" name="done" value="Search Now">
</form>
<div id="result"></div


På forhånd mange tak
Avatar billede olebole Juniormester
18. august 2005 - 18:49 #1
<ole>

- og hvad er det mere præcist, du ønsker at lave?

/mvh
</bole>
Avatar billede mickiii Nybegynder
18. august 2005 - 18:55 #2
Det er en funktion, hvor man skriver noget i et inputfelt, alt imens den laver et query til databasen, og returnere forslag.

Jeg ville så bare gerne tilføje det, at man kan bruger pil op og ned til at navigere i listen, derudover måske enter til at vælge værdien eller måske tab osv. osv. Men jeg ikke helt så skarp i det med keyboard events.. :o(
Avatar billede roenving Novice
18. august 2005 - 22:18 #3
Du kan ikke lave queries til databasen mens brugeren taster ind i et felt, for sql afvikles på serveren, mens brugeren indtaster i browseren ...

-- skal du gøre noget som direkte resultat af en bruger-indtastning uden en tur rundt om serveren, skal hele databasen (eller de relevante felter !-) downloades som javascript-variabler, og det lyder ikke som en fremgangsrig metode !o]
Avatar billede mickiii Nybegynder
19. august 2005 - 00:17 #4
roenving => Jo det kan man sagtens, spørgsmålet er bare om du eller en anden kan hjælpe mig med at bruge key-events til det?
Avatar billede olebole Juniormester
19. august 2005 - 01:25 #5
Du vil da vel ikke lave en query ved hvert tastetryk? Vær glad for, jeg ikke er din udbyder! På den anden side ... det ville ikke vare længe  ;o)
Avatar billede olebole Juniormester
19. august 2005 - 01:27 #6
- dels vil det være en sofistikeret form for overlagt serverdrab - og dels vil det ikke være hurtigt nok til, det kan blive en fordel for brugeren  :)
Avatar billede mickiii Nybegynder
19. august 2005 - 01:41 #7
olebole => Nej, det er ikke optimalt som det er nu, derfor kunne jeg godt tænke mig hvis man kunne lægge en delay funktion ind, som ventr x antal sekunder før query starter.

Dertil vil jeg så sige at XMLHttpRequest er forholdsvis mildere ved serveren en et normalt query, men det kan optimeres.
men Google er godt igang med kollektivt serverdrab så :o) - http://www.google.com/webhp?complete=1&hl=en

Og hvis ikke du/i kender teknikken så søg lidt på selvsamme google på hhv. XMLHttpRequest aka. Ajax aka. Googles new bitch :o). Jeg finder det selv utroligt interessant, da det åbner nogen muligheder, man ikke tidligere har været opmærksom på. Underligt, især fordi teknikken ikke er ny.
Avatar billede olebole Juniormester
19. august 2005 - 02:47 #8
Jo, årsagen til jeg skriver, som jeg gør, er netop, at jeg kender XMLHttpRequest yderst indgående  ;o)

Hvorfor i alverden skulle en XMLHttpRequest være 'forholdsvis mildere' ved serveren - og mildere end hvad?
Jeg har selv skrevet et JSHttpRequest objekt med tilhørende PHP-klasse, der dels fungerer en del hurtigere end XML i både IE og FF - dels udveksler langt mindre datamængde for at flytte de rå data - og dels er langt lettere at arbejde med under PHP. Ikke engang med den teknik, kunne jeg finde på at gøre det.

"men Google er godt igang med kollektivt serverdrab så :o)" ... sagde musen om elefanten.
Jamen, der er da en verden, 375 lysår og en eksorbitant serverpark/infrastruktur til forskel på dig og Google ... så, hvad så?  ;D
Avatar billede mickiii Nybegynder
19. august 2005 - 02:50 #9
Så nu orker jeg ikke mere for i dag, men jeg har selv konstrueret denne funktion, så mangler vi bare at den virker :o), og at der kan knyttes keyevents til den:

function selectDown() {
var list = document.getElementById('list');
var elm_array = list.getElementsByTagName('li');

    for (i = 0; i < elm_array.length; i++) {
      if (elm_array.item(i).getAttribute("class") == 'selected' && elm_array.item(i).nextSibling) {
        elm = elm_array.item(i).nextSibling;       
      } else {
        elm = list.firstChild;
      }
    }
    if(elm.previousSibling) {
      unhighlight(elm.previousSibling);
    }
    highlight(elm);
}

highlight og unhighlight er bare funktioner, som hhv. sætter og fjerner classname 'selected'. Hvordan kan det være at hver gang jeg kalder den, så highligth'er den det første child, men klikker jeg igen, så sker der intet?

Jeg håber det er til at forstå, ellers så spørg endelig.


olebole => Sådan ud af ren nysgerrighed, så mener jeg at have læst et indlæg fra dig, herinde, hvori du takker af for denne gang, men alligevel så deltager du til tider i debatterne herinde? Ombestemte du dig? :o)
Avatar billede roenving Novice
19. august 2005 - 02:52 #10
Årh, hvad gør det af forskel at Google har et A- (16,777 mio ip-adresser) eller B-net (65536 IP-adresser) til at serve med ...
Avatar billede mickiii Nybegynder
19. august 2005 - 02:53 #11
olebole, nu skrev du mens jeg skrev mit sidste indlæg... Fair nok, men uanset hvad så vil jeg altså gerne lave denne funktion, om ikke andet så blot for at lære noget nyt.
Avatar billede mickiii Nybegynder
20. august 2005 - 14:33 #12
Hmm, ingen respons = lukketid
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