18. august 2005 - 18:42Der 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
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 }
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(
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]
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.
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
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)
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.
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.