Avatar billede foxwell Nybegynder
08. august 2006 - 23:29 Der er 24 kommentarer

'Dong!' funktion til website (med AJAX?)

Hej Experter,

jeg har en blog som bliver opdateret ret ofte, og tænkte derfor at det kunne være smart med en funktion der gjorde besøgende opmærksomme på at der var kommet et nyt indlæg på sitet hvis de har vinduet åbent men befinder sig andetsteds på sitet end forsiden, eller i et andet vindue. Jeg forestiller mig en 'Dong!' lyd.

Spørgsmålet er nu, hvordan ville I bære jer ad med dette?

Det virker ikke optimalt bare at bede forsiden (eller et skjult frame) at refreshe med jævne mellemrum og give lyd fra sig hvis den finder et nyt indlæg, så jeg går ud fra at det eneste alternativ er at bruge AJAX.

Er der nogen der kender en god tutorial der ville hjælpe med at opnå dette mål, eller har forslag der kan puffe mig i den rigtige retning?

På forhånd tak! =)

//foxwell
Avatar billede esbenp Nybegynder
09. august 2006 - 01:32 #1
Se min beskrivelse her: http://www.eksperten.dk/spm/723151

det skulle være samme problemstilling. Problemet kunne være hvis browseren timer ud for hurtigt.
Avatar billede foxwell Nybegynder
09. august 2006 - 02:20 #2
Reloader du ikke bare siden?
Avatar billede esbenp Nybegynder
09. august 2006 - 13:56 #3
Den bliver reloaded når det er nødvendigt og ikke før. Det er heller ikke nødvendigt at reloade hele siden hvis du bruger en iframe
Avatar billede foxwell Nybegynder
09. august 2006 - 21:08 #4
Men der burde overhovedet ikke være nogen grund til at reloade eller bruge iframes hvis du brugte AJAX...
Avatar billede esbenp Nybegynder
10. august 2006 - 12:23 #5
er det ikke bare fordi AJAX er lidt på poppet du siger det? Det er jo det samme der sker: Data bliver overført over et netværk
Avatar billede foxwell Nybegynder
10. august 2006 - 12:40 #6
Nek, grunden til at jeg gerne vil bruge AJAX er netop for at undgå sider der står og loader for evigt eller skal refreshes hele tiden. Hvis du ser på Digg Spy http://digg.com/spy kan du se hvor rart og flydende det kan blive. Ved bare ikke nok om AJAX til at vide hvor jeg skal starte.

Med din 'data bliver overført over et netværk' kunne man jo bare sætte siden til at refreshe hvert 2. sekund, men det ville nok ikke være optimalt da skærmen ville stå og blinke hele tiden. Desuden er der mulighed for at der ville være en konstant kliklyd fra IE skulle man af en eller anden mystisk årsag bruge denne browser.

Ved ikke helt om det er manglende viden om hvad AJAX kan der får dig til at mene at din løsning er lige så god, eller om du bare er ligeglad med at den er primitiv.

Vi er enige om at dit forslag på den side er nedenstående, ikke?
<html opdater-hvert-minut-som-nødløsning>
Vis alle beskeder i chatten...
while(ingen beskeder){
  wait();
}
// Nu er der en ny besked i chatten
udskriv en kommando til browseren til om at reloade siden.
//Slut
Avatar billede esbenp Nybegynder
11. august 2006 - 13:29 #7
Jo det er den løsning og nej har ikke selv brugt AJAX, men denne løsning er faktisk ret elegant.

Og nej den refresher ikke hele tiden. Den refresher når der er brug for det.

Når dit serverside program har genereret siden vil den ikke afslutte. I stedet vil den vente med at sende resten af siden. Resten af siden vil så indeholde en refresh kommando.
Avatar billede olebole Juniormester
11. august 2006 - 14:19 #8
<ole>

"Og nej den refresher ikke hele tiden. Den refresher når der er brug for det."

Det er en _rigtig_ skidt løsning, der kræver bunker af overflødige server-resourcer - hvorfor den metode aldrig bruges i seriøse applikationer. De sjældne gange, noget lignende ses anvendt, er der skrevet en speciel web-server til formålet.

Det eneste fornuftige er at bruge en Ajax-løsning. Det giver hurtig response, det tærer ekstremt lidt på serveren og det giver et ganske lavt 'trafik-forbrug'

/mvh
</bole>
Avatar billede esbenp Nybegynder
11. august 2006 - 15:41 #9
Hvorfor tærer det meget på serveren?
Avatar billede esbenp Nybegynder
11. august 2006 - 15:53 #10
Den løsning jeg beskriver blev brugt på tour de frances hjemmeside: letour.fr og de bruger apache som webserver. De bruger det til live at vise hvilke ryttere der har forspring så man kan desværre ikke se det nu.

Men altså det ville heller ikke være noget problem at implementere i en tomcat eller anden servlet container. Jeg har ikke implemeteret det selv, så jeg kan ikke sige hvordan hastigheden er, men jeg kan ikke se hvorfor det skulle være et problem
Avatar billede foxwell Nybegynder
12. august 2006 - 11:36 #11
Tour de France? Var det ikke der hvor vinderen blev taget for doping? Giver ikke meget for deres organisation når de snyder så meget, og mon ikke det også gælder programmørerne? ^^
Avatar billede esbenp Nybegynder
12. august 2006 - 16:39 #12
Det var da en lam kommentar
Avatar billede olebole Juniormester
14. august 2006 - 13:17 #13
Det vil jeg meget gerne se dokumentation på blev brugt på letour.fr!
Havde det været tilfældet, ville man lynhurtigt være kommet lysår på den forkerte side af Apache's grænse for samtidige forbindelser ... og det er kun for at nævne én enkelt ting.

Metoden er gammel og velkendt, men det undrer mig lidt, du ikke kan overskue, at det er en elendig løsning. Jeg ved ikke, hvad du ved om web og webservere, så jeg ved ikke rigtig, hvor jeg skal begynde med en forklaring  :)
Avatar billede esbenp Nybegynder
14. august 2006 - 18:13 #14
Altså den er kun aktiv under løbet så det er lidt svært at vise.

Men uden en aktiv forbindelse og uden polling hvordan vil du så levere data til klienten på det rigtige tidspunkt?
Avatar billede olebole Juniormester
15. august 2006 - 11:05 #15
Jamen, det ville jeg da aldrig gøre med en browser, en server og HTTP-protokollen. Det er disse ting jo slet ikke konstrueret til  :)

Der er tydeligvis en del ting, du ikke helt har forstået. Ajax er absolut ikke poppet - men den mulighed, du nu engang har for at hente data på en 'økonomisk' måde med jævnlige intervaller, når der er tale om en browser, en server og HTTP-protokollen.
Det er ikke uden grund, WWW's største aktører bruger så megen energi på Ajax-baserede applikationer  ;o)
Avatar billede olebole Juniormester
15. august 2006 - 11:07 #16
- og jeg tør iøvrigt sætte 100 mod 1 på, at den applikation, du taler om, ikke bruger den metode, du forestiller dig ... og 90 mod 1 på, at der faktisk er tale om en Ajax-app  ;o)
Avatar billede esbenp Nybegynder
15. august 2006 - 13:37 #17
Du svarede ikke på spørgsmålet.

Hvordan henter browseren med AJAX data fra serveren på det rigtigt tidspunkt uden polling og uden en åben forbindelse?
Avatar billede olebole Juniormester
15. august 2006 - 13:42 #18
Jeg prøver at besvare spørgsmålet endnu engang ... jeg skrev:
    "Jamen, det ville jeg da aldrig gøre med en browser, en server og HTTP-protokollen. Det er disse ting jo slet ikke konstrueret til  :)"

Du kan ikke med _nogen_ teknik undgå at skulle forespørge serveren med jævne mellemrum. Du kan ikke pushe data over HTTP ... de skal _hentes_  :)
Avatar billede foxwell Nybegynder
15. august 2006 - 14:50 #19
Esben, tak for forslaget, men det har ingen interesse. Det er fint at se folk diskutere, men det kommer jeg ikke nærmere på en løsning af.

Jeg forsøger at finde nogle AJAX tutorials, og vender tilbage når/hvis jeg får lavet en løsning (med mindre der svinger nogen forbi og kommer med et svar på det originale spørgsmål).

Tak for hjælpen til jer begge to. =)
Avatar billede olebole Juniormester
15. august 2006 - 15:04 #20
Hmmm ... Ajax er vel lidt overkill. Du kan nøjes med at kalde et billede:

<script type="text/JavaScript">
var oCheckIm = null;
function checkServer() {
    oCheckIm = new Image();
    oCheckIm.onload = function() {
        if (oCheckIm.width>1) alert("Der er nyt på serveren ...");
        checkServer();
    }
    oCheckIm.src = "http://www.domain.dk/side.php";
}
</script>

I side PHP skriver du noget à la:

<?
if (NOGET_NYT_PAA_SERVER) {
    header("Location: sti/til/stort_billede.gif");
    exit;
} else {
    header("Location: sti/til/lille_billede.gif");
    exit;
}
?>

- og 'lille_billede.gif' måler så 1*1 pixels ... og 'stort_billede.gif' måler 10*1 pixels (bredden først).

... simple as that  :)
Avatar billede olebole Juniormester
15. august 2006 - 15:07 #21
- og så skal funktionen naturligvis kaldes, når siden loader ... og der bør times. Ny JS-funktion:

<script type="text/JavaScript">
var oCheckIm = null;
function checkServer() {
    oCheckIm = new Image();
    oCheckIm.onload = function() {
        if (oCheckIm.width>1) alert("Der er nyt på serveren ...");
    }
    oCheckIm.src = "http://www.domain.dk/side.php";
    setTimeout("checkServer()", 10000); // Checker hvert 10. sekund
}
checkServer();
</script>
Avatar billede esbenp Nybegynder
15. august 2006 - 15:09 #22
foxwell jeg prøver såmænd bare selv at blive klogere.

olebole jeg forstår ikke helt din løsning. Jeg kan se checkServer() kalder sig i uendelig recursion. Er det meningen? Står din løsning ikke bare og venter med en åben forbindelse indtil der er nyt på serveren?
Avatar billede olebole Juniormester
15. august 2006 - 15:13 #23
- rettelsen hjælper nok  ;o)
Avatar billede foxwell Nybegynder
15. august 2006 - 15:52 #24
esben > helt fint, det skal du også have lov til =)

ole > mange tak, jeg prøver at se om jeg kan få det til at fungere! =)
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