23. september 2007 - 18:32Der er
56 kommentarer og 1 løsning
Den bedste løsning for en liste der opdateres
Hej alle sammen.
Jeg er ved at lave en liste over nogle server som skal sættes ind og fjernes efter som status er ledig eller ikke ledig.
Men jeg ville høre hvilken måde, med javascript er smartest at opdatere en liste. Altså den eneste løsning jeg kan se for mig, er en div som indeholder en liste over serverne, og så hver gang der sker en ændring ( en ajax-del som jeg har lavet ) går den ind og opdatere hele listen. Men findes der ikke måde så jeg bare kan sætte en ny server ind på listen, og fjerne en server fra listen ? For der er altså omkring 5000 server ;) så det er noget trafik ;) Og hvis den skal opdatere listen hvert tiende sekundt, så går det ikke lige hvis der sidder 500 forskellige mennesker og kigger på listen. Så tror jeg altså ikke min forbindelse kan følge med længere.
Men ville være dejligt hvis jeg kunne få nogle forskellige muligheder, så jeg sætter 200 point på højkant til den smarteste løsning (y)
Du har ikke skrevet hvordan outputtet fra AJAX delen ser ud..
Hvis du har et bestemt antal servere, kunne du f.eks oprette samme antal divs, og tilgå de relevante divs direkte via document.getElementById("server1234"). Så sætter du dens værdi til f.eks. "Offline" eller "Online".
Der skal overføres meget hver gang siden indlæses, men du skulle kunne spare noget hvis man ikke reloader siden, da du jo bruger AJAX.
Alternativ kan man have en select, som du tilføjer/fjerner options til/fra. Det vil nok kræve noget processorkraft på klient, hvis serverene skal sorteres alfabetisk, og man f.eks. indsætter en server der starter med "a", da man så skal flytte omkring 4999 servere længere ned..
Læg serverne i en DB-tabel med et felt til et timestamp. Hvergang en servers status opdateres sættes timestamp'et samtidig.
Når brugeren requester siden første gang, downloades data om serverne sammen med et timestamp. Derefter kan han f.eks. spørge serveren, om der er nyt, hvert halve minut. Det gøres ved at sende tiden for seneste request med den nye request - og på serveren hente data fra tabellen, der er opdateret senere end dette stamp.
men jeg ville gerne vide hvordan jeg opdatere min liste, hvordan kan jeg fjerne Server 5 ud fra denne liste
Server 1 Server 2 Server 3 Server 4 Server 5 > Er opdaget, skal fjernes Server 6 Server 7 osv.
Hvordan laver jeg den liste ? Og jeg så kan fjerne server 5 fra den > Det er selve javascripten jeg spørger om. Ikke ajax delen. Håber i forstår lidt bedre nu.
Som jeg kun kan se det er det at opdater hele den div jeg listen stående i. Men hvis der er 5000 server, så bliver der dælme brugt trafik hvis jeg skal sende hele listen fra min php dokument med ajax og opdatere listen.
peterpedersen> Hvordan vil du vise listen? Skal det bare kører ned ad, så det bliver en lang side? Er der nogen form for opdeling? Er der nogen form for sortering, eller er det lige meget?
den skal liste lodret, og jeg skal kun have et navn, og ingen sotering. Altså jeg ikke helt dum til det med javascript, så tror bare det er det. Og så må jeg jo prøve mig frem hvis jeg får lyst til at lave det på en anden måde
Hmmm.. Hvis du nu genererer det sådan her: ------------------------------------------ <span id="server1">Server1 (1/3) <b>Join</b> - Add to favorit - Report</span> <span id="server2">Server2 (2/6) <b>Join</b> - Add to favorit - Report</span> <span id="server3">Server3 (6/7) <b>Join</b> - Add to favorit - Report</span> <span id="server4">Server4 (2/3) <b>Join</b> - Add to favorit - Report</span> <span id="server5">Server5 (4/5) <b>Join</b> - Add to favorit - Report</span> <span id="server6">Server6 (1/10) <b>Join</b> - Add to favorit - Report</span> ------------------------------------------ Så kan du jo fjerne en af serverne med en removeChild.
Joe, det ser jo rigtig nok ud. Men er ikke helt sikker på hvordan det gøres. Så kunne du ikke prøve og lave en addServer() og removeServer() functions, og så et html dokument ?
addServer kan jeg selv rette til ;) hvis jeg ikke helt tilfreds, men er sku ikke helt sikker på det der removeChild ;)
Jeg går ud fra, at "Server#" i f.eks. "Server1 (...)", "Server2 (...)" skal erstattes med navnet på servere? Dvs, der skal egentligt ikke stå et tal, efter ordet "server"?
Dette skulle gerne kunne fjerne en af serverne. Den skal så kaldes med f.eks. removeServer("server2") --------------------------------- <script type="text/JavaScript"> function removeServer(id){ document.getElementById("servers").removeChild(document.getElementById(id)); } </script>
<div id="servers"> <span id="server1">Server1 (1/3) <b>Join</b> - Add to favorit - Report</span> <span id="server2">Server2 (2/6) <b>Join</b> - Add to favorit - Report</span> <span id="server3">Server3 (6/7) <b>Join</b> - Add to favorit - Report</span> <span id="server4">Server4 (2/3) <b>Join</b> - Add to favorit - Report</span> <span id="server5">Server5 (4/5) <b>Join</b> - Add to favorit - Report</span> <span id="server6">Server6 (1/10) <b>Join</b> - Add to favorit - Report</span> </div> --------------------------------- Mht. at add'e servere, kommer det lidt an på, hvordan du vil fortælle den, hvor serveren skal placeres på listen. Som thesurfer spørger, hedder serverne så Server# eller kan de hedde hvadsomhelst? Dvs. skal de sorteres efter tal eller alfabetisk?
Jeg tror umiddelbart, at add-funktionen kunne være lidt à la følgende: ------------------------------------------------ function addServer(id){ var newElement=document.createElement("span"); newElement.setAttribute("id",id); newElement.appendChild(document.createTextNode("TEKST HER")); document.getElementById("servers").appendChild(newElement); } ------------------------------------------------ Det er dog ligeså utestet som removeServer, og jeg er lidt i tvivl med det der CreateTextNode.
addServer indsætter i øvrigt bare som det nederste element på listen.
Jeg bliver nødt til at smutte.. jeg er sikker på at w13 har styr på det.. Ellers må en af de andre hjælpe til.. jeg ved godt at de lurer i mørket.. :-)
Jeg har et div-element med id="test". Nu vil jeg så tilføje et billede til div'en:
newElement=document.createElement("img") //laver et img-tag i variablen newElement, det er altså ikke blevet indsat endnu newElement.setAttribute("src","http://www.gul.dk/båd.gif"); //sætter attributten src til en billedadresse document.getElementById("test").appendChild(newElement); //indsætter newElement (altså billedet) som de sidste tag i div'en "test"
Nå ja, jeg har måske fundet fejlen. Du kan ikke kalde addServer("1") før div'en eksisterer. Når addServer køres i head, er div'en ikke blevet lavet endnu. Fjern addServer('1'); og skriv den i stedet ind i en onload i body:
Nå ja. Jamen så skal du bare ha' linjen: document.getELementById("Servers").appendChild(createElement("br")); med, sådan her: --------------------------------------------------- function addServer(id){ var newElement=document.createElement("span"); newElement.setAttribute("id",id); newElement.appendChild(document.createTextNode("SERVERNAVN HER")); newElementLink=document.createElement("a"); newElementLink.appendChild(document.createTextNode("Join")); newElement.appendChild(newElementLink); newElement.appendChild(document.createTextNode(" - ")); newElementLink=document.createElement("a"); newElementLink.appendChild(document.createTextNode("Add to favorit")); newElement.appendChild(newElementLink); newElement.appendChild(document.createTextNode(" - ")); newElementLink=document.createElement("a"); newElementLink.appendChild(document.createTextNode("Report")); newElement.appendChild(newElementLink); document.getElementById('Servers').appendChild(newElement); document.getELementById("Servers").appendChild(createElement("br")); }
og kunne du måske have en ide om hvordan jeg skal add mine output fra ajax
jeg kan ændre det som jeg har lyst, men hvordan skal jeg add mine server ? lige nu giver mit php dokument et output på alle de server der er blevet ændret på, og skal enden fjernes eller tilføjes.
Hmmm. Hvis du genererer listen med php: server1,server2,server3 så kan det vel smides i et array, som adskilles ved komma, og så kan du løbe det igennem og køre funktionen for hvert element i array'et.
Ja, det var også sådan jeg ville gøre. Jeg kan sagtens gøre det i php, men ikke i javascript. Så kunne du lave noget ? Det er vel noget explode() det er det ihvertfald i php :b
Muligvis kan det gøres kortere: -------------------------------- liste="server1,server2,server3".split("."); for(i=0;i<liste.length;i++){addServer(liste[i])}
SERVER undefined - Join - Add to favorit - Report SERVER undefined - Join - Add to favorit - Report SERVER undefined - Join - Add to favorit - Report SERVER undefined - Join - Add to favorit - Report
og til dem der kigger i tråden for at få hjælp og heller ikke syntes det smart at lave link med det id men inputer i addServer(); (lavet for jeg selv tit mangler sådan noget hjælp her)
som du kan se i kildkoden så køre jeg min RollSplit, med variablen liste sat til ="add*server1*1,add*server2*2,remove*server2*3,add*server4*4,add*server5*5"
når jeg remover kommer der en mellemrum som helst ikke sku ha været der. Kan du hjælpe ?
Nå, det fandt jeg også ud af. Det var jo logisk, for den <br> der indsættes bagefter span bliver jo ikke fjernet, så vi må indsætte den i span'en ;) og så ryger den væk ;)
Er det ikke meget lettere at lave en færdig element-template og fjerne den fra dokumentet på window.onload? Så kan man efterfølgende klone den - fylde data i - og indsætte klonen i dokumentet, hvergang der skal bruges et nyt span :)
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.