08. september 2004 - 16:48Der er
16 kommentarer og 1 løsning
Problemer med Javascript
Hej. Jeg har lavet et lille system med Javascript og PHP. Jeg har en iframe som skal hente oplysninger hver tiendedel af et sekundt, og så udskrive det i en DIV altså oplysningerne, men det må ikke blinke eller klikke. Det virker også fint, men når jeg kører et andet Javascript script så virker det ikke mere.
Dette script SKAL den kører HELE tiden ligemeget hvad, men det gør den ikke. Den skriver bare Udført i statuslinjen og andre gange: Der opstod en fejl på siden. Her er den kode som SKAL høre HELE tiden:
Kommunerne har digitaliseret indgangen for borgerne. Men bag skærmen håndteres mange arbejdsgange stadig manuelt mellem systemer, mails og organisatoriske siloer.
*ROTFLAMO* hvert 10. sekund ...?!!?!!??!! Jeg har ingen idé om, hvad du har taget, men kunne du ikke gemme lidt til mig? :D
At opdatere fra en database hvert 10. sekund er ikke bare fuldstændig vanvittigt - det er umuligt. Desuden kan PHP ikke køre på klienten, så du er nødt til at hente data fra serveren, hvilket som oftest betyder reload af dokumentet.
Jeg ved det :D.. Men det går "fint" altså ikke helt præcist hver tiende sekundt men ca hver halve eller hvert sekundt opdatere den :)... og ang. reload af dokumentet, det er det som setTimeout("location.reload(true)",100); gør :D
Hvert andet eller tredie sekund er stadig helt hen i vejret ... der skal ikke mange samtidige brugere på (eller hentes ret mange data), før det skaber problemer. Hvis du ligger på en server hos en udbyder, får de garanteret ikke lov til at køre det script - hvis han finder ud af, hvad det gør.
Derudover bør du skrive til en streng-buffer, som skrives ud til sidst. Det går helt galt, hvis man forlanger så meget af serveren og samtidig skriver ineffektiv kode.
Hvad angår reload, havde jeg åbenbart misforstået dig ... jeg troede, du ville undgå reload :)
Jeg vil have at den _SKAL_ reloade.. Og det SKAL den gøre hele tiden :).. Og det er et som den ikke gør, der står bare UDFØRT eller Der opstod en fejl på siden.
Og Olebole(Javascript aben :P) kan du se nogle fejl :D ?
Jeg glemte at kikke på dit spm. i går. Det har jeg gjort nu - og jeg ved zq ikke rigtig, hvor jeg skal starte og slutte ... koden består primært af fejl og uhensigtsmæssigheder. Tag det ikke som personlig kritik. Det er ment venligt, men du trænger til at lære helt grundlæggende programmerings-regler. Lad os starte et sted:
Når du skriver $row[brugernavn], er det en fejl. PHP er godt nok indrettet til at prøve at rette denne fejl - men det kan medføre alvorlige sikkerhedsbrist. Brug derfor _altid_ gåseøjne i array-kald.
Hvad har du af felter i din database? Hvis du har mere end 'brugernavn', 'styletop', 'styleleft', 'styleindex' og 'hits', kalder du ineffektivt i din SQL-sætning. Når du kalder med '*', henter du _alle_ data i hver række. Det vil sige, du henter en bunke overflødig data og lader PHP slæbe rundt på dem. Det belaster både SQL-serveren og PHP helt unødigt. Hent kun de felter, du har brug for.
At skrive ud i løkker er en no-no i alle programmerings/script sprog. Man fylder en streng-buffer og skriver den ud ét sted. Altså ikke:
while ($row=mysql_fetch_assoc($res)) { print "<div id='".$row["brugernavn"]."'>".$row["tekst"]."</div>"; }
... men:
while ($row=mysql_fetch_assoc($res)) { $s .= "<div id='".$row["brugernavn"]."'>".$row["tekst"]."</div>"; } print $s;
Det sidste afvikler som oftest flere hundrede gange hurtigere - og belaster tilsvarende serveren flere hundrede gange mindre. Læg i øvrigt mærke til, jeg bruger mysql_fetch_assoc() i stedet for mysql_fetch_array(). Der er ingen grund til at hente et både streng- og tal-indekseret array, når der kun er brug for et, der er streng-indekseret.
Så ser det ud til, at du bruger navnet 'script' på en (i)frame. Det kan du ikke, da 'script' i JavaScript er et reserveret ord ... kald den noget andet.
Første del af dit script kommer så til at se ud noget à la:
<script type="text/JavaScript"> function opdater(id, topfelt, leftfelt, zINDEXet) { var minehits = document.getElementById("<?=$_SESSION["brugernavn"]?>"); var gamleTOP = minehits.style.top; var gamleLEFT = minehits.style.left; var gamlezindex = minehits.style.zIndex; mig.style.zIndex = zINDEXet; mig.style.top = topfelt; mig.style.left = leftfelt; frames.NOGET.location.href = "opdatereren.php?mitid="+id+"&topfelt="+topfelt+"&leftfelt="+leftfelt+"&zindex="+zINDEXet+"&topgamle="+gamleTOP+"&leftgamle="+gamleLEFT+"&zindexgamle="+gamlezindex; } </script>
Læg mærke til, jeg bruger den rigtige reference til frame'en, der har navnet 'NOGET' ... giv den selv et andet navn. Læg også mærke til, at jeg angiver, hvilket script-sprog der anvendes. Det bør du gøre, selvom de fleste browsere retter fejlen for dig ... og gætter på, hvad du mener.
Når du har rettet disse mest åbenlyse fejl, bør du overveje en halt anden måde at gøre det på :) Det er fantastisk ineffektivt at lade serveren udskrive HTML'en. Det bør du lade klienten om, da du ellers igen spilder masser af unødig server-kraft og ditto båndbredde. Lad i stedet serveren skrive de nødvendige data ud i simpelt XML. Gerne med meget korte element-navne, som <a>blabla</a>, <b>bla</b>, <c>blablabla</c>, osv. Load så data i en usynlig (i)frame og lad JavaScript parse XML'en og skriv den tilsvarende HTML op i hoved-frame'en. Det er _langt_ mere effektivt.
Til slut et par betragtninger: Det virker, somom der er tale om en '3D-agtig' chat. Den slags er script-sprog som ASP og PHP temmelig uegnede til. Man kan godt lave noget, der fungere med ganske få samtidige brugere - men er det noget, der skal bruges lidt mere seriøst, skal man kunne skrive udvidelser til Apache (eller COM-objekter til IIS).
Hvis en udbyder finder ud af, hvad du laver på serveren, vil han uden tvivl forlange, du stopper øjeblikkeligt ... og hvis jeg lå på samme server, ville jeg gøre ham opmærksom på, hvad du har gang i, så det kunne blive stoppet. Sagen er, at man belaster serveren kraftigt og helt unødigt med den slags, hvilket går ud over allle andre på samme server. Det kan man _kun_ tillade sig, hvis serveren er ens helt egen.
Samtale mellem min 82 årige far og naboens søn Emil (ca. 5 år):
"Hej Arne ... mig skal over til Anne!" "Nej, Emil - det hedder: Jeg skal over til Anne." "Nææhh ... det hedder: Mig skal over til Anne!" "Arhj, nu må du holde op. Det hedder da: JEG skal over til Anne." "Næ, det er MIG, der skal over til Anne ... det er da ikke DIG...!"
... måske, der alligevel er en fornuftig forklaring på 'mig' :)
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.