Avatar billede klaus_a Nybegynder
24. august 2012 - 10:36 Der er 15 kommentarer

ASP minichat skal reloade uden "klik" og læses oppe fra og ned

Hej,

Jeg har en lille minichat lavet i .asp - jeg vil bruge til en funktion på mit site, men den er gammel og står og reloader indholdssiden hele tiden, hvilket giver et lille "klik" hver gang.

Hvordan kan man lave et eller andet med AJAX eller JS der henter indholdsiden ind uden at den klikker hele tiden?

Og dernæst er den af den gamle slags hvor nyeste indlæg kommer nederst, er der nogen der ved hvordan man får nyeste indlæg til at ligge øverst?

Jeg kan desværre ikke arbejde i andet end .asp, så andre sprog er pt ikke en mulighed.

Mvh

Klaus
Avatar billede maddog_em Nybegynder
24. august 2012 - 11:35 #1
Hej

bliver chat indlæg gemt i en db, for så kan du bare indsætte ORDER BY kolonne_navn DESC
Avatar billede maddog_em Nybegynder
24. august 2012 - 11:37 #2
hvis det er en db løsning så prøv dette

strSQL = "select * FROM db_navn ORDER BY Id DESC "
Avatar billede klaus_a Nybegynder
24. august 2012 - 13:11 #3
Hmmm.... det gjorde den egentligt ikke, men det var en god idé, den vil jeg prøve, tak :-)

Nogen forslag til en måde at loade indholdsvinduet så det ikke klikker?

Med venlig hilsen

Klaus
Avatar billede softspot Forsker
24. august 2012 - 14:34 #4
Brug AJAX.
Avatar billede softspot Forsker
24. august 2012 - 14:49 #5
Du skal nok indstille dig på også at skulle arbejde med JavaScript, hvis du skal lave en løsning som undgår opdatering via frames...

Du kunne hente chatdata og opdatere chatbeskedvinduet med et kald á la (ved brug af jQuery):

// lastId skal være global, dvs. tilgængelig på tværs
// af opdateringskald til serveren
var lastId = 0;


function opdaterChat() {
  $.ajax({
    url:'/chat/opdater.asp',
    type:'POST',
    data:{lastId:lastId},
    success: function(data) {
      // opdater chatvinduet...
      $.each(data.beskeder, function(i,v) {
        $("#chatbeskeder").prepend("<div class='besked'>" + v.Tekst + "</div>");
        lastId = v.Id;
      });
    },
    completed: function() {
      // opdater chatten igen om 5 sekunder...
      setTimeout(opdaterCat, 5000);
    }
  });
}

$(function() {
  // sæt chatten til at opdatere første gang om 5 sekunder
  setTimeout(opdaterCat, 5000);
});


Det er helt skudt fra hoften og komplet utestet, men idéen er der.

Du skal så sørge for at du (fra /chat/opdater.asp) kun returnerer de beskeder som er nye siden lastId.

opdater.asp skal returnere JSON i formatet:

{ beskeder: [{Id:1, Tekst:'tekst'},{Id:2, Tekst:'tekst'}] }
Avatar billede klaus_a Nybegynder
24. august 2012 - 16:09 #6
Hmmm... jeg kan bruge lidt js, og gør det af og til, men jeg må nok tilstå at jeg skal have det serveret mere mundret før jeg kan få det til at virke, samt en forklaring på hvad det gør.

Det du har lavet dér, skal det hente noget fra en db, eller opdatere det slet og ret en side i en frame/iframe eller opdatere det indhold på en side?

men tak alligevel

Med venlig hilsen

Klaus
Avatar billede softspot Forsker
24. august 2012 - 17:26 #7
Hvordan du gemmer/behandler chatbeskederne på serveren er op til dig, men det kunne hentes fra en database (vælg alle chatbeskeder med id større end lastId og hvor Id er et autonumber i databasen). Jeg vil dog anbefale dig at du cacher chatbeskederne i et tidsrum, for at undgå for megen databaseaktivitet...

Jeg ville lave et div med id = chatbeskeder på siden, som så kunne opdateres med data fra serveren.
Avatar billede olebole Juniormester
24. august 2012 - 18:06 #8
<ole>

Husk at indsætte et timestamp sammen med alle beskeder. Så kan du styre, hvilke beskeder brugeren har set og kun sende ham de beskeder, han endnu ikke har set.

Og gør som softspot viser: Lad være med at HTML-formatere beskederne på serveren. Send rå data tilbage og formater dem på klienten.

I udgangspunktet er scriptsprog ikke egnet til chat applikationer. En chat, skrevet i VBS eller PHP, er altid en applikation med overordentlig ringe effektivitet, hvorfor det gælder om at optimere på alle hylder  =)

/mvh
</bole>
Avatar billede softspot Forsker
24. august 2012 - 19:32 #9
ole >> tanken var at styre hvilke beskeder brugeren har set, med lastId og et autonumber id i databasen.
Avatar billede olebole Juniormester
24. august 2012 - 21:11 #10
#9: En absolut ligeså god fremgangsmåde som mit forslag! Ved millionader af beskeder kan man selvfølgelig med tiden løbe tør for plads i ID-feltet, men det bliver næppe tilfældet  *o)
Avatar billede olebole Juniormester
24. august 2012 - 21:13 #11
PS: I 2038 løber vi i øvrigt også tør for plads i et UNIX-timestamp, så deeeeeeeeet ...  =)
Avatar billede softspot Forsker
24. august 2012 - 22:31 #12
LOL!
Avatar billede olebole Juniormester
24. august 2012 - 23:34 #13
At fremtiden synes lys for pessimisterne er skam ikke noget at grine af!  *D

@klaus_a: For at komme tilbage til chatten, så skriv endelig en efter softspots ekesmpel i #5. Du lærer en masse, og hvis den ikke skal bære mange samtidige brugere, kan du sagtens skrive den i VBS/ASP.

Det vigtigste er, at du hele tiden tænker effektivitet. Dvs kun at hente de nødvendige beskeder - og gøre det med rimelige intervaller (5 sekunder er et udmærket bud. Nok ikke mindre). Desuden bør du indeksere din tabel og holde forespørgslerne til den så simple som muligt.

Og så lad brugerens browser udføre så meget af arbejdet som muligt. Den står og strutter af ubrugte RAM- og CPU-vitaminer, mens den slags ofte er i underskud på serveren  =)
Avatar billede softspot Forsker
24. august 2012 - 23:45 #14
I 2038 er det sgu nok nogle andre end os der sidder og tager stilling til hvad de skal gøre med de der UNIX-timestamps :-)

Mht. håndteringen af chatbeskederne i databasen, vil jeg umiddelbart undgå at hente dem i databasen hver gang opdater.asp kaldes. Benyt databasen som en log over de beskeder der sendes (dvs. kun til historik) og gem beskederne i en cache (f.eks. et MSXML2.FreeThreadedDomDocument), hvorfra du hurtigt kan finde dem frem. Du kan f.eks. bruge en XSLTProcessor (som er cached) til at generere JSON-outputtet... Den cache kan du så rydde op i med passende intervaller, så den ikke sluger hele serverens hukommelse med tiden.
Avatar billede softspot Forsker
28. august 2012 - 10:57 #15
Er du kommet videre, klaus?
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

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



IT-JOB

Cognizant Technology Solutions Denmark ApS

Senior Test Engineer

Udviklings- og Forenklingsstyrelsen

UI-designer med flair for apps

Cognizant Technology Solutions Denmark ApS

Graduate - Software Automation Program