Autor Zpráva
serion
Profil *
Zdravím. Pustil som sa do vytvárania maličkého ajaxchatu pre osobné účely, no narazil som na problém.

Mám klasický DIV s id = 'chatwindow'. V tomto DIVe by sa mali zobrazovať obrdžané správy, štruktúra je napríklad takáto:

<?xml version="1.0"?>

<root>
<messages>
<message id = "3" color = "#000000" to = "all" author = "Serion Illithien" time = "2007-08-22 14:24:37" type = 'chat'>preco mi nikto neodpoveda? :(</message>
<message id = "2" color = "#000000" to = "all" author = "Serion Illithien" time = "2007-08-22 14:15:26" type = 'chat'>ako sa mate?</message>
<message id = "1" color = "#000000" to = "all" author = "Serion Illithien" time = "2007-08-22 14:13:32" type = 'chat'>ahoj</message>
</messages>
</root>


Po obdržaní (cez zápis do .txt súboru som si overil že prehliadač obdržal presne horeuvedené) by mala správy sformátovať a pridať táto funkcia:


function refreshChat(url) {
var param = 'action=refresh';
param += '&last=' + lastMessage;
param += '&current=' + currentRoom;
new Ajax.Request (url, {
method: 'post',
postBody: param,
onSuccess: function(transport){
xmldoc = transport.responseXML;
// hlavne chatove okno
var chatDiv = document.getElementById('chatwindow');
var messages = xmldoc.getElementsByTagName('messages');
var message_nodes = messages.getElementsByTagName('message');
var n_messages = message_nodes.length;
var i = 0;
for (i = n_messages - 1; i > -1; i--) {
var newMessage = document.createElement('div');
newMessage.setAttribute('class', message_nodes[i].getAttribute('type') + '_message');
newMessage.setAttribute('id', 'msg' + message_nodes[i].getAttribute['id']);
var newName = document.createElement('div');
newName.setAttribute('class', message_nodes[i].getAttribute('type') + '_message_name');
newName.innerHTML = '<em>[' + message_nodes[i].getAttribute('time') + ']</em> <strong>' + message_nodes[i].getAttribute('author') + '</strong>';
var newText = document.createElement('div');
newText.setAttribute('class', message_nodes[i].getAttribute('type') + '_message_text');
newText.innnerHTML = message_nodes[i].firstChild.nodeValue;
newMessage.appendChild(newName);
newMessage.appendChild(newText);
chatDiv.appendChild(newMessage);
}
// koniec hlavneho chatoveho okna
}
})
}


Akonáhle ju však spustím, prehliadač obdrží správy v XML formáte no nič sa nedeje, v DIVe sa neobjavia. Neviete čo môže byť zle? S DOM som úplný začiatočník, takže je dosť možné že to bude nejaká prkotina, no trápi ma to už dva dni a neviem s s tým rady.

Za odpoveď predom ďakujem.
peta
Profil
misto
.responseXML;
pouzij
.responseText
a posli si to ve formatu
a|b|c|d|e
a|b|c|d|e
a|b|c|d|e

pak to das jako
x = ... .responseText;
alert(x)
y = x.split("\ ");
alert(y);
alert(y[0]);
z = y[0].split("|");
alert(z);
alert(z[0]);

No, nebude se ti to zpracovavat lepe?

Jinak bych ti poradil, ze si kazdou vec z alertuj, jestli se to skutecne provedlo:
newMessage.setAttribute('class', message_nodes[i].getAttribute('type') + '_message');
alert(newMessage.className);

"Neviete čo môže byť zle?"
Bez vypisuj JS konzoly nevime nic. Tazke bud odkaz na stranku nebo vypis z JS konzoly.
souki
Profil
peta
A co když někdo použije ve zprávě | ?
peta
Profil
souki
To si snad umi osetrit, ne? Treba pouzitim unicode entit.
Pripominas mi phpRS2.2 :) Tam je SQL dotaz napsan tak, ze pokud do textu das apostrof, tak ti ukonci values. Zadne htmlspecialchars nebo tak tam neni. Novy 2.8 jsem nezkoumal.
souki
Profil
peta
Já na tohle třeba používám json_encode. Přijde mi to daleko univerálnější a jednodušší na práci na straně JS
peta
Profil
souki
tak, ono je mozne to prevest na base64 nebo base16. Tim padem uz nemusis resit regularni vyrazy a pod, ale zase se ti stava zprava necitelna.
ah01
Profil
serion
Už na první pohled máš chybu tady:
var messages = xmldoc.getElementsByTagName('messages');

var message_nodes = messages.getElementsByTagName('message');

getElementsByTagName to množné číslo naznačuje, že tato metoda vrací pole (i v případě že se ten prvek v dokumentu nalézá jen jednou). Takže proměnná mesages je pole, ale přistupuješ k ní jako k DOMElemnetu. Navíc by ti stačilo pouze:
var message_nodes = xmldoc.getElementsByTagName('message');


Dál už jsem to nezkoumal, takže tam můžeš mít i další chyby, tohle byla první na kterou jsem narazil.

souki
Já bych to osobně řešil taky pomocí JSON komunikace místo XML, ale pokud chce používat XML proč mu nutit něco jiného.

peta
"ono je mozne to prevest na base64 nebo base16"
Proč to dělat jednoduše, když to de složitě :-)

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: