Ajax és firefox
2008-12-24T12:45:02+01:00
2008-12-24T16:16:57+01:00
2022-07-30T11:55:28+02:00
rhinoeli
Sziasztok!

AJAX chat programot írok.

Íme, a jelenlegi kód:

function createXmlHttp() { var keres = null; if (window.XMLHttpRequest) { keres = new XMLHttpRequest(); } else if (typeof ActiveXObject != undefined) { keres = new ActiveXObject('Microsoft.XMLHTTP'); } return keres; } var ajaxkeres = null; var nick; var szoveg; var rajta="FALSE"; function kuldes() { if (document.getElementById('chatnick').value && document.getElementById('chatszoveg').value) { ajaxkeres = createXmlHttp(); if (ajaxkeres) { nick=document.getElementById('chatnick').value; szoveg=document.getElementById('chatszoveg').value; ajaxkeres.open('get', 'chat.php' + '?sid=' + randomString(8) + '&nick=' + nick + '&szoveg=' + szoveg, true); document.getElementById('chatszoveg').value=""; document.getElementById('chatszoveg').focus(); ajaxkeres.onreadystatechange = chatiro; ajaxkeres.send(null); } } } function chatiro() { if (ajaxkeres.readyState == 4 || ajaxkeres.readyState == "complete") { var tartalom = document.getElementById('chattartalom'); tartalom.innerHTML = ajaxkeres.responseText; } }

Tehát egy űrlapból kapja a cuccot.
A kuldes() meghívódik.
Az if(ajaxkeres) feltétel teljesül.
Ez után viszont nem történik semmi Firefoxban. Nem hívódik meg a chat.php, nem ír az adatbázisba. Ezek szerint a
ajaxkeres.open('get', 'chat.php' + '?sid=' + randomString(8) + '&nick=' + nick + '&szoveg=' + szoveg, true);
sorban lehet gond?
IE-ben tökéletes.
Van egy másik függvény, ami 3 mp-enként hívódik meg, és a chat.php-t kéri hozzászólás beillesztése nélkül, majd a chatiro() függvényhez hasonló függvény beírja a DIV elemembe. Ez működik FF alatt is, ha pl IE-ből hozzáírok, akkor az frissül FF-ben is.

Mi lehet a probléma?

Üdv. Ádám
Mutasd a teljes hozzászólást!
<input type='text' size='50' value=' onkeypress="return keypress(event);" id='chatszoveg'>

Szerintem enterre elküldi az űrlapot, az lehet a gond, minden más jónak tűnik (mondjuk a szerver oldalt nem néztem.)
Mutasd a teljes hozzászólást!

  • ebben ránézésre nincs hiba, legalábbis elvi

    lehet valamelyik id rossz, és azért lép ki hibával, vagy ilyesmi...

    nézd meg a hibakonzolt
    Mutasd a teljes hozzászólást!
  • Tök üres a hibakonzol. Többször is ellenőriztem most. Ha csak simán a chat.php-t kérem az ajaxkeres.open-nel,
    ajaxkeres.open('get', 'chat.php', true);
    akkor sem fut le a chat.php.

    Hmm, és most vettem észre, újratölti az egész oldalt, IE-ben is! Ez miért lehet?
    Mutasd a teljes hozzászólást!
  • Másold be azt a részt, ahol a kuldest hivod, szerintem nem raktál return false-t rá.
    Mutasd a teljes hozzászólást!
  • Nem lehet, hogy meghívja a chat.php-t, csak valamilyen oknál fogva rosszul küldi az adatokat és azért nem ír az adatbázisba?
    Mutasd a teljes hozzászólást!
  • Enter leütésére hívódik meg:

    <input type='text' onkeypress='keypress(event)'> function keypress(e) { if (!e) var e = window.event; if (e.keyCode) code = e.keyCode; else if (e.which) code = e.which; if (code==13) kuldes(); }
    Mutasd a teljes hozzászólást!
  • Ha mindentől függetlenül a chat.php-val írnék valamit az adatbázisba, vagy akármit csináltatnék a szerveren, nem csinálja meg. Tehát a chat.php nem fut le.
    Mutasd a teljes hozzászólást!
  • hasonlít ahhoz amit én kezdtem el készíteni annál más hiba volt az, hogy x idő után folyamatosan láttam azt, hogy hogyan frissít és kaptam vissza a mysql hiba jelentéseket a lekérdezéssel meg csatlakozásal kapcsolatban amivel pedig nem volt gond...
    de én sem látok így hibát. ha esetlegesen több kódot kapnánk lehet, hogy látnánk
    Mutasd a teljes hozzászólást!
  • Na jó, szóval: MEGBOLONDULTAM? Az előbb jó volt. :D

    Bemásolok mindent rögtön, egy pillanatot kérek.
    Mutasd a teljes hozzászólást!
  • Első körben telepítsd fel a firebug-ot és nézd meg, hogy az ajax kérés mit ad vissza.

    <input type='text' onkeypress='keypress(event)'> helyett <input type='text' onkeypress='keypress(event);return false;'> Az általad írt kód is jó, de így biztosan nem küldi el kétszer az adatokat. A másik, hogy: ajaxkeres.onreadystatechange = chatiro; helyesen ajaxkeres.onReadyStateChange = chatiro;

    Remélem segítettem :D
    Mutasd a teljes hozzászólást!
  • onkeypress="keypress(event);return false;"
    Így nem tudok írni...

    onReadyStateChange
    esetében még IE-ben sem jó. Szerintem ez kisbetűvel ok.

    Azért kösz.
    Mutasd a teljes hozzászólást!
  • Tehát az egész mindenség, a nem ideillő részek eltávolítva.

    [b]index.html[/b] <body onLoad='bodyonload()'> <form name='urlap'> <input type='text' size='20' id='chatnick' value=''> <div id='chattartalom' style='border: 1px dotted #333333'></div> <input type='text' size='50' value=' onkeypress="keypress(event)" id='chatszoveg'> </form> [b]a JS[/b] function bodyonload() { kuldes2(); return false; } function keypress(e) { if (!e) var e = window.event; if (e.keyCode) code = e.keyCode; else if (e.which) code = e.which; if (code==13) kuldes(); return false; } function createXmlHttp() { var keres = null; if (window.XMLHttpRequest) { keres = new XMLHttpRequest(); } else if (typeof ActiveXObject != undefined) { keres = new ActiveXObject('Microsoft.XMLHTTP'); } return keres; } var ajaxkeres = null; var nick; var szoveg; function kuldes() { if (document.getElementById('chatnick').value && document.getElementById('chatszoveg').value) { ajaxkeres = createXmlHttp(); if (ajaxkeres) { nick=document.getElementById('chatnick').value; szoveg=document.getElementById('chatszoveg').value; ajaxkeres.open('get', 'chat.php' + '?sid=' + randomString(8) + '&nick=' + nick + '&szoveg=' + szoveg, true); document.getElementById('chatszoveg').value=""; document.getElementById('chatszoveg').focus(); ajaxkeres.onreadystatechange = chatiro; ajaxkeres.send(null); } } } function chatiro() { if (ajaxkeres.readyState == 4 || ajaxkeres.readyState == "complete") { var tartalom = document.getElementById('chattartalom') tartalom.innerHTML = ajaxkeres.responseText; } } function kuldes2() { ajaxkeres2 = createXmlHttp(); if (ajaxkeres2) { ajaxkeres2.open('get', 'chat.php' + '?sid=' + randomString(8), true); ajaxkeres2.onreadystatechange = chatfrissito; ajaxkeres2.send(null); } } function chatfrissito() { if (ajaxkeres2.readyState == 4 || ajaxkeres2.readyState == "complete") { var tartalom = document.getElementById('chattartalom') tartalom.innerHTML = ajaxkeres2.responseText; t=setTimeout("kuldes2()", 1500); } } [b]chat.php[/b] <?php header('Content-Type: text/html; charset=iso-8859-2'); mysql csatlakozás...; if ($_GET['nick'] && $_GET['szoveg']) { $ido=time(); $nick=$_GET['nick']; $szoveg=$_GET['szoveg']; mysql_query("INSERT INTO chat (ido, nick, szoveg) VALUES ('$ido', '$nick', '$szoveg')"); } $keres=mysql_query("SELECT * FROM chat ORDER BY ido ASC"); while($i=mysql_fetch_assoc($keres)) { $nev=$i['nick']; $szoveg=$i['szoveg']; print "<b>$nev</b>: $szoveg <br>"; } ?>
    Mutasd a teljes hozzászólást!
  • Az érdekes az, hogy a kuldes2() szépen működik FF-ben is. Ha beírok az adatbányába, akkor szépen frissül a DIV.
    Mutasd a teljes hozzászólást!
  • Az onkeypress valóban nem engedi így, merthogy minden leütésnél vizsgál :), valóban nem figyeltem.

    Viszont:
    <input type='text' size='50' value=' onkeypress="keypress(event)" id='chatszoveg'> A value='' helyett csak value=' van.

    Ha nem elírás, akkor meg is van, az FF nem fogja megenni így.
    Mutasd a teljes hozzászólást!
  • Ha nem elírás, akkor meg is van, az FF nem fogja megenni így.

    Elírás, a forrásban jól van...
    Mutasd a teljes hozzászólást!
  • Ismétlem, a kuldes2(), ami LOOP-szerűen frissíti a DIV-et, működik FF-ben.
    A sima kuldes(), ami a
    chat.php?sid=aQgfgeaa&nick=xy&szoveg=blabla
    url-t kér viszont nem futtatja le a chat.php-t.

    Olyan érzésem van, hogy ebből kellene kiindulni, de nem tudom, hogyan, merre...

    Kell az ajaxkeres-t nullázni, vagy ilyesmi? (nah közben ebédelek)
    Mutasd a teljes hozzászólást!
  • Odáig eljut, hogy küldje a kérés a chat.php-nek?
    Mutasd a teljes hozzászólást!
  • <input type='text' size='50' value=' onkeypress="return keypress(event);" id='chatszoveg'>

    Szerintem enterre elküldi az űrlapot, az lehet a gond, minden más jónak tűnik (mondjuk a szerver oldalt nem néztem.)
    Mutasd a teljes hozzászólást!
  • nekem ez a rész nem tetszik

    $keres=mysql_query("SELECT * FROM chat ORDER BY ido ASC"); while($i=mysql_fetch_assoc($keres)) { $nev=$i['nick']; $szoveg=$i['szoveg']; print "<b>$nev</b>: $szoveg <br>"; }

    mert ha megvannak a szükséges $_GET-ek akkor itt felülíródik. szerintem legyen egy külön adatlekérő ajax-os függvény ami megnyitja a chat.php-t vagy mi is a neve és egy get-et ad neki mittom én ?frissit=1 ha van ilyen akkor kéri le az adatokat és írja szépen ki...

    vagyis valahogy így:
    if(isset($_GET['frissit'] && $_GET['frissit'] == 1){ $keres=mysql_query("SELECT * FROM chat ORDER BY ido ASC"); while($i=mysql_fetch_assoc($keres)) { $nev=$i['nick']; $szoveg=$i['szoveg']; print "<b>$nev</b>: $szoveg <br>"; } }
    Mutasd a teljes hozzászólást!
  • a nickre és a szövegre rakhatnál escapelést, mert így simán injektálható.
    Mutasd a teljes hozzászólást!
  • Chat.php nem fut le. Most néztem Firebuggal, az ajaxkeres NULL. Az ajaxkeres2 az OK. Tehát valahol ebben a részben lehet gond:
    function kuldes() { if (document.getElementById('chatnick').value && document.getElementById('chatszoveg').value) { ajaxkeres = createXmlHttp(); if (ajaxkeres) { nick=document.getElementById('chatnick').value; szoveg=document.getElementById('chatszoveg').value; ajaxkeres.open('get', 'chat.php' + '?sid=' + randomString(8) + '&nick=' + nick + '&szoveg=' + szoveg, true); document.getElementById('chatszoveg').value=""; document.getElementById('chatszoveg').focus(); ajaxkeres.onreadystatechange = chatiro; ajaxkeres.send(null); } } }
    Mutasd a teljes hozzászólást!
  • Nah, srácok!

    1. Valószínűleg az oldalam többi részében van valahol egy szintaktikai hiba, idézőjelhiány vagy felesleg, és ezért az FF az inputokból való szöveg kiolvasásánál elbukik, megakad. Ezt megoldottam, a feltétel ellenőrzése előtt még elolvassa, utána változóként már továbbviszi. Érdekes, a hibakonzol nem jelezte ezt.

    2. Inf3rno hívta fel a figyelmem rá, hogy a DIV-em űrlapon belül van, és így ENTER lenyomására elküldte az űrlapot... Ezt megoldottam. Ez a segítség volt számomra a leghasznosabb, ezért inf3rno kapja a pontot.

    Köszönöm mindenkinek, kellemes ünnepeket!

    Üdv, Ádám
    Mutasd a teljes hozzászólást!
abcd