Avatar billede mikze Nybegynder
08. september 2004 - 16:48 Der 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:

<script>
parent.document.getElementById('display').innerHTML = "<? $sql = mysql_query("SELECT * FROM tabel") or die(mysql_error()); while($row=mysql_fetch_array($sql)) { ?><div id='<?=$row[brugernavn]?>' style='position:absolute; top: <?=$row[styletop]?>; left: <?=$row[styleleft]?>; z-index: <?=$row[stylezindex]?>'><img src='<?=$row[hits]?>' alt='<?=$row[brugernavn]?>' ondrag='return false' onclick='return false'></div><? } ?>";
function loadet() {
setTimeout("location.reload(true)",100);
}
</script>

Det virker også indtil jeg kører dette script:

<script>
function opdater(id, topfelt, leftfelt, zINDEXet) {
var minehits = eval("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;
window.script.location.href = 'opdatereren.php?mitid='+id+'&topfelt='+topfelt+'&leftfelt='+leftfelt+'&zindex='+zINDEXet+'&topgamle='+gamleTOP+'&leftgamle='+gamleLEFT+'&zindexgamle='+gamlezindex;
}
</script>
Avatar billede roenving Novice
08. september 2004 - 16:52 #1
Hvordan starter du de to funktioner ?-)
Avatar billede olebole Juniormester
08. september 2004 - 16:54 #2
<ole>

*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.

/mvh
</bole>
Avatar billede olebole Juniormester
08. september 2004 - 16:56 #3
... og jeg mente naturligvis begge steder 'hvert 1/10. sekund'  ;o)
Avatar billede mikze Nybegynder
08. september 2004 - 17:09 #4
olebole :)..

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


roenving:

loadet() funktionen bliver loadet med:

<body onload="loadet()">

Og opdater(alt muligt) bliver startet med:

<AREA SHAPE=POLY COORDS="468,234,507,208,468,182,429,208,468,234,468,234" onclick="ryk('48', '152', '440', '7');">

Som fx.
Avatar billede olebole Juniormester
08. september 2004 - 17:18 #5
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  :)
Avatar billede mikze Nybegynder
08. september 2004 - 17:21 #6
Nej nej :D..

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 ?
Avatar billede olebole Juniormester
08. september 2004 - 17:47 #7
Aben skal lige hente nogle bananer, den kikker på det lidt senere  ;o)
Avatar billede mikze Nybegynder
09. september 2004 - 12:28 #8
:P..
Avatar billede olebole Juniormester
09. september 2004 - 19:25 #9
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:

<?
$sql = mysql_query("SELECT * FROM tabel") or die(mysql_error());
while( $row=mysql_fetch_assoc($sql) ) {
    $s .= "<div id='".$row["brugernavn"]."' style='absolute;top:".$row["styletop"]."px;left:".$row["styleleft"]."px;z-index:".$row["stylezindex"].";'><img src='".$row["hits"]."' alt='".$row["brugernavn"]."' ondragstart='return false' onclick='return false'></div>";
}
?>
<script type="text/JavaScript">
parent.document.getElementById("display").innerHTML = "<?=$s?>";
function loadet() {
    setTimeout("location.reload(true)",10000);
}
</script>

Anden del kan se sådan ud:

<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.

Håber, det hjalp lidt på tingene  :)
/mvh
Avatar billede roenving Novice
11. september 2004 - 04:18 #10
-- og jeg undrer mig stadig over hvor javascript-variablen 'mig' kommer fra ?-)
Avatar billede olebole Juniormester
11. september 2004 - 04:26 #11
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'  :)
Avatar billede roenving Novice
11. september 2004 - 04:34 #12
Tjah ...
Avatar billede mikze Nybegynder
12. september 2004 - 14:27 #13
Den kommer fra en <div> som hedder MIG :D..
Avatar billede mikze Nybegynder
12. september 2004 - 14:40 #14
Men tilbage til spørgsmålet. Jeg har nu rettet dem :).. Men der sker stadig det samme. Den viser bare UDFØRT når man har klikket på det :S
Avatar billede mikze Nybegynder
12. september 2004 - 14:40 #15
Og så bliver den ikke opdateret mere.
Avatar billede mikze Nybegynder
15. september 2004 - 17:09 #16
Olebole? Roenving?
Avatar billede mikze Nybegynder
10. oktober 2004 - 11:38 #17
:/
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