Avatar billede 2yung Nybegynder
25. december 2006 - 20:34 Der er 14 kommentarer

Ajax Php Function.

Heej Ajax Mennesker  ..

Jeg sidder her og er igang med nogen venner at lave en tekst chat ..

Men vi er nu løbet ind i det dilemma at vi ikke gider bruge Meta Refresh da det gir en masse klik lyde og det kan slowe serveren en del .. Vi har nu begge læst lidt om ajax, men vi forstår ikke helt hvorn man gør .. Og har derfor ikke kunnet lave nogen eksempler ..

<?
$hentBeskeder=mysql_query("SELECT * FROM `chat_beskeder` WHERE type='offentlig'")or die(mysql_error());
while($visBeskeder=mysql_fetch_assoc($hentBeskeder)){
$hent = mysql_query("SELECT * FROM `chat_brugere` WHERE id='$visBeskeder[brugerid]'")or die(mysql_error());
$vis=mysql_fetch_assoc($hent);
echo "<br /><a href=\"profil.php?id=$visBeskeder[brugerid]\" target=\"right\"><b>$vis[navn]</b></a><span class=\"gul\"><b> siger:</b> <span class=\"hvid\">$visBeskeder[besked]</span>";
}
?>

Det er vores php script .. Hvorn kan vi få lagt det ind i noget Ajax så den af sig selv kommer med nye beskeder istedet for vi skal alve en meta refresh .. ?
Der er 200 point på højkant ..
Avatar billede windcape Praktikant
25. december 2006 - 21:15 #1
Prøv http://dragons-lair.org/projects/chat/ og sig din mening, Koden er open-source, men mit repository er nede lige nu.

http://dragons-lair.org/projects/chat/chat.js indeholder det vigste javascript kode, og jeg kan sørge for at PHP koden bliver tilgængelig også.

Jeg vil sige at det i forsøger at kode en selv er nok lidt at skyde over målet ;)
Avatar billede 2yung Nybegynder
25. december 2006 - 21:22 #2
Det kan skam godt bruges, må vi se nogen php kode ? og måske du kunne flette vores ind i ? :D Mega sejt lavet .. Kan den godt arbejde på tværs af to iframes ?
Avatar billede windcape Praktikant
25. december 2006 - 21:25 #3
Avatar billede windcape Praktikant
25. december 2006 - 21:26 #4
og teoretisk set burde den virker fint sålænge at i holder html-strukturen som javascriptet er bygget ud fra.
Avatar billede windcape Praktikant
25. december 2006 - 21:27 #5
(Spoiler: new BSD licence, altså open-source).
Avatar billede 2yung Nybegynder
25. december 2006 - 21:27 #6
Jaah men kan den bruges på tværs af 2 frames ? vi har et skriv og et besked frame ..
Avatar billede windcape Praktikant
25. december 2006 - 21:31 #7
I skal bare modificer den til at sende kommandoen over til besked framen... selvom frames = evil, og bør undgåes for alt i verden.

Meget bedre hvis i designer siden med CSS istedet :-)
Avatar billede 2yung Nybegynder
25. december 2006 - 21:32 #8
altså:
      <form id="chatform" action="" method="post">
        <div>
          <input id="line" type="text" name="chat" /><input id="submit" type="submit" value="Send" />
        </div>
      </form>
Skal sendes over til det andet frame ?
Avatar billede olebole Juniormester
27. december 2006 - 15:00 #9
<ole>

Om http://dragons-lair.org/projects/chat/chat.js skal det lige nævnes, at:

1) scriptet ikke er XHTML-kompatibelt
2) at det virker ulogisk kun delvist at bruge DOM - og så blande det med invalid kode (såsom innerHTML)

/mvh
</bole>
Avatar billede windcape Praktikant
28. december 2006 - 12:01 #10
1) korrekt
2) korrekt

Men det er skrevet hurtigt som en mini proof-of-concept. Selve konceptet i brugen af XHR og JSON sammen med PHP er korrekt nok.

En ideel version ville være bygget op lidt anderledes :-)
Avatar billede olebole Juniormester
28. december 2006 - 12:31 #11
Vedr. punkt 1 så betyder det ikke så meget i øjeblikket, da browserne jo ikke understøtter XHTML (og kun ganske få kan kode brugbar XHTML)  :)
Avatar billede windcape Praktikant
28. december 2006 - 22:20 #12
ja, men koden til at gøre det kompatibelt ville også virke under HTML 4 :p
Avatar billede 2yung Nybegynder
02. januar 2007 - 23:29 #13
Heej igen ..

Jeg har fundet den her og fået den til at virke korrekt sammen med vores script, men problemet med denne er at vi ikke kan få den til at lave grafiske smiley'er ..

http://www.plasticshore.com/projects/chat/

Vi laver en str_replace(); på outputtet inden det kommer ud til browseren, det eneste sted vi kan ligge replace er enten i selve Javascriptet eller php'en .. Den replacer dem korrekt, men den viser html tagget istedet for selve billedet, hvilket vi jo ikke ønsker .. :)

Kan i hjælpe med den ?
Avatar billede 2yung Nybegynder
04. januar 2007 - 00:10 #14
Okey det problem er nu løst, vi fandt uda f at det var pga det var. CreateTextNode, hvilket udskriver det som ren tekst .. Vi ændrede det til innerHTML ..

var GetChaturl = "getChatData.php";
var SendChaturl = "sendChatData.php";
var lastID = -1;
window.onload = initJavaScript;

function initJavaScript() {
    document.forms['chatForm'].elements['chatbarText'].setAttribute('autocomplete','off'); //this non standard attribute prevents firefox' autofill function to clash with this script
    checkStatus(''); //sets the initial value and state of the input comment
    checkName(); //checks the initial value of the input name
    receiveChatText(); //initiates the first data query
}




function receiveChatText() {
    if (httpReceiveChat.readyState == 4 || httpReceiveChat.readyState == 0) {
      httpReceiveChat.open("GET",GetChaturl + '?lastID=' + lastID + '&rand='+Math.floor(Math.random() * 1000000), true);
    httpReceiveChat.onreadystatechange = handlehHttpReceiveChat;
      httpReceiveChat.send(null);
    }
}


function handlehHttpReceiveChat() {
  if (httpReceiveChat.readyState == 4) {
    results = httpReceiveChat.responseText.split('---'); //the fields are seperated by ---
    if (results.length > 2) {
        for(i=0;i < (results.length-1);i=i+4) { //goes through the result one message at a time
            insertNewContent(results[i+1],results[i+2],results[i+3]); //inserts the new content into the page
        }
        lastID = results[results.length-4];
    }
    setTimeout('receiveChatText();',1000); //executes the next data query in 4 seconds
  }
}

function insertNewContent(liName,liText,liBid) {
    insertO = document.getElementById("outputList");
    document.getElementById('chatoutput').innerHTML +="<b><a target='right' href='../profil.php?id="+liBid+"'>P</a></b><span class='graa'>"+ liName + "Siger:</span><br /><span class='hvid'>" + liText + "<br /></span><br>";
}

function sendComment() {
    currentChatText = document.forms['chatForm'].elements['chatbarText'].value;
    if (currentChatText != '' & (httpSendChat.readyState == 4 || httpSendChat.readyState == 0)) {
        currentName = document.forms['chatForm'].elements['name'].value;
        param = 'n='+ currentName+'&c='+ currentChatText;   
        httpSendChat.open("POST", SendChaturl, true);
        httpSendChat.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
      httpSendChat.onreadystatechange = handlehHttpSendChat;
      httpSendChat.send(param);
      document.forms['chatForm'].elements['chatbarText'].value = '';
    } else {
        setTimeout('sendComment();',1000);
    }
}

function handlehHttpSendChat() {
  if (httpSendChat.readyState == 4) {
      receiveChatText(); //refreshes the chat after a new comment has been added (this makes it more responsive)
  }
}

function checkStatus(focusState) {
    currentChatText = document.forms['chatForm'].elements['chatbarText'];
    oSubmit = document.forms['chatForm'].elements['submit'];
    if (currentChatText.value != '' || focusState == 'active') {
        oSubmit.disabled = false;
    } else {
        oSubmit.disabled = true;
    }
}

function checkName() {
    currentName = document.forms['chatForm'].elements['name'];
    if (currentName.value == '') {
        currentName.value = 'guest_'+ Math.floor(Math.random() * 10000);
    }
}

function getHTTPObject() {
  var xmlhttp;
  /*@cc_on
  @if (@_jscript_version >= 5)
    try {
      xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (E) {
        xmlhttp = false;
      }
    }
  @else
  xmlhttp = false;
  @end @*/
  if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
    try {
      xmlhttp = new XMLHttpRequest();
    } catch (e) {
      xmlhttp = false;
    }
  }
  return xmlhttp;
}

var httpReceiveChat = getHTTPObject();
var httpSendChat = getHTTPObject();


Det er vores scripts.js fil som udføre hele arbejdet, men nu opdatere den ikke af sig selv, hvad skal vi ændre i den så den kan opdatere af sig selv ? Har prøvet at lave et setTimeOut, men så kommer der nogen underlige beskeder ..

Kan i hjælpe ?
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