|
|
|
| Я долго лазил по форум, нашел документацию по AJAX но у меня ничего не работает.
Такая проблемма, если можете помогите. Есть чат, он на фреймах но я понял что посетитлям он не понравиться, очень он долгий на фреймах. Есть файл к примеру msg.php где генерируються
последиия сообщения из чата. Что мне нужно сделать, чтобы сообщения выводились не обновлением страницей, а с помошью AJAX. Чтоб AJAX СМОТРЕЛ В СКРИПТ И ДОБОВЛЯЛ В ОКНО ТОЛЬКО НОВЫЕ СООБЩЕНИЯ ПОЯВИВЩЕСЯ В НЕМ. Помогите пожайлуста!!!
Заранее спасибо!!! | |
|
|
|
|
|
|
|
для: staglu
(01.05.2007 в 22:09)
| | Что именно в AJAX-е у тебя не работает? | |
|
|
|
|
|
|
|
для: shkryab
(01.05.2007 в 22:54)
| | - | |
|
|
|
|
|
|
|
для: shkryab
(01.05.2007 в 22:54)
| | Вот смотрите, есть скрипт:
<?php
session_start();//Стартуем сесию
?>
<head>
<meta http-equiv=\"Refresh\" content=\"5; url=msg.php\">
<title></title>
</head>
<BODY onLoad='window.scrollBy(0,9999)'>
<?php
include("admin/conf/config.php");//Подключаем файл конфигурации
//************************************************************************************
// Функции *
//************************************************************************************
function err($msge) //Функция вывода ошибки
{
$server = $_SERVER['SERVER_NAME'];
echo "
<center>
<TABLE width=600 cellpadding = 0 cellspacing = 0 border = 0 >
<TR>
<TD width=\"2%\"><IMG src='http://$server/graf/1.gif' width=14 height=12 border=0></TD>
<TD width=\"96%\" background='http://$server/graf/2.gif'></TD>
<TD width=\"2%\"><IMG src='http://$server/graf/3.gif' width=14 height=12 border=0></TD>
</TR>
<TR>
<TD background='http://$server/graf/4.gif'></TD>
<TD>
<table width=100% border = 0 >
<tr>
<TD colspan=3 >\n";
echo '<center><font color =red><img src=http://'.$server.'/graf/error.png align = middle><b>'.$msge.'</b></font></center>';
echo "
</TD>
</tr>
</TABLE>
</TD>
<TD background='http://$server/graf/8.gif'></TD>
<TR>
<TD width='2%'><IMG src='http://$server/graf/5.gif' width=14 height=12 border=0></TD>
<TD width='96%' background='http://$server/graf/6.gif'></TD>
<TD width='2%'><IMG src='http://$server/graf/7.gif' width=14 height=12 border=0></TD>
</TR></center>\n";
exit();
}
function ok($msge) //Функция подтверждения
{
$server = $_SERVER['SERVER_NAME'];
echo "
<center>
<TABLE width=600 cellpadding = 0 cellspacing = 0 border = 0 >
<TR>
<TD width=\"2%\"><IMG src='http://$server/graf/1.gif' width=14 height=12 border=0></TD>
<TD width=\"96%\" background='http://$server/graf/2.gif'></TD>
<TD width=\"2%\"><IMG src='http://$server/graf/3.gif' width=14 height=12 border=0></TD>
</TR>
<TR>
<TD background='http://$server/graf/4.gif'></TD>
<TD>
<table width=100% border = 0 >
<tr>
<TD colspan=3 >\n";
echo '<center><font color =green><img src=http://'.$server.'/graf/ok.png align = middle><b>'.$msge.'</b></font></center>';
echo "
</TD>
</tr>
</TABLE>
</TD>
<TD background='http://$server/graf/8.gif'></TD>
<TR>
<TD width='2%'><IMG src='http://$server/graf/5.gif' width=14 height=12 border=0></TD>
<TD width='96%' background='http://$server/graf/6.gif'></TD>
<TD width='2%'><IMG src='http://$server/graf/7.gif' width=14 height=12 border=0></TD>
</TR></center>\n";
}
//******************************************************************************
// Проверяем введенные данные *
//******************************************************************************
$id_session = session_id();
$sql = "SELECT * FROM session_chat
WHERE s_id = '$id_session';";
$db = mysql_query($sql);
$massiv = mysql_fetch_array($db);
if(mysql_num_rows($db) <= 0 )
{
err("У вас нет прав! Возможно вы не авторизовались.<br><a href=http://".$server."/chat/chat.php>Авторизоваться</a> <a href=http://".$server."/register/index.php>Регистрация</a>");
}
else
{
echo " <table width='100%' border=0>";
$sql="SELECT * FROM chat";
$sql = mysql_query($sql);
while($mass = mysql_fetch_array($sql))
{
$time = substr($mass['time'],10,18);
$msg = "<font size=4 color=".$massiv['color_log']."><b>".$massiv['login'].": </b></font><font color=".$massiv['color_msg'].">".$msg."</font>";
echo "
<TR>
<TD background='http://".$server."/graf/2.png'></TD>
</TR>
<tr>
<td><font color='66666' size='1'>$time</font></td>
<td>$mass[msg]</td>
</tr>";
}
echo "</table>";
echo " <html><head>
<meta http-equiv = \"Refresh\" content = \"5; url=$mass[link]\">
</head></html>\n";
}
?>
<html>
</body>
</html>
|
Мне нужно, чтоб его содержимое не обновлялось с поиощью meta тега. А выводилась через ajax | |
|
|
|
|
|
|
|
для: shkryab
(01.05.2007 в 22:54)
| | Вот в этом скрипте извлекаються сообщения из БД. Но в чате,чтоб просмотреть новые сообщения от пользователей, приходилось обновлять страницу с помощью meta тега. Но как сделать чтоб сообшения обновлялись без meta тега | |
|
|
|
|
|
|
|
для: Staglu
(01.05.2007 в 23:01)
| |
var req;
function loadXMLDoc(url,data)
{
if (window.XMLHttpRequest)
{
req = new XMLHttpRequest();
req.onreadystatechange = processReqChange;
req.open("POST", url, true);
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=cp1251");
req.send(data);
}
else if (window.ActiveXObject)
{
req = new ActiveXObject("Microsoft.XMLHTTP");
if (req)
{
req.onreadystatechange = processReqChange;
req.open("POST", url, true);
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=cp1251");
req.send(data);
}
}
}
function processReqChange()
{
if (req.readyState == 4)
{
if (req.status == 200)
{
//всякие действия с полученными данными например:
document.getElementById('elem').innerHTML=req.responseText;
}
else
{
alert("Не удалось получить данные:\n" + req.statusText);
}
}
}
|
Ответ от сервера будет находиться в req.responseText. В нем будет содержаться то, что в php скрипете выводилось на экран (echo "бла бла бла" - бла бла бла и будет содержаться в req.responseText). Параметры функции loadXMLDoc(url,data):
url - файл на сервере к которому Вы обращаетесь;
data - данные которые передаёте на сервер.
Переданные данные будут находиться в массиве $_POST[]. Данные должны передаваться в виде переменная=значение.
К примеру:
В файле 1.html вызываеться функция
...
loadXMLDoc("qwerty.php","msg=12345")
...
|
файл qwerty.php содержит такое:
...
echo $_POST[msg];
...
|
тогда ответ от сервера (который содержиться в req.responseText) будет содержать текст "12345". | |
|
|
|
|
|
|
|
для: shkryab
(01.05.2007 в 23:29)
| | Спаибо, понял!!! А если информация в файле qwerty.php добавиться, то и в 1.html она тоже отоброзиться. И некаких обновленний страници 1.html делать не нужно??? Я праильно вас поня??? | |
|
|
|
|
|
|
|
для: Staglu
(01.05.2007 в 23:36)
| | Всмысле добавиться? То что в файле будет выводиться на страницу (echo или теги вне скрипта) будут содержаться в ответе от сервера. Сам скрипт может свершать какие угодно действия. | |
|
|
|
|
|
|
|
для: shkryab
(01.05.2007 в 23:29)
| | Все не так просто, как кажется:аякс - это только средство связи между клиентом и броузером. А обработку данных нужно делать либо на РНР на сервере, либо и на сервере и в броузере с помощью ява-скрипт. Здесь так просто никто не поможет, если только не отдаст свой собственный готовый скрипт чата. | |
|
|
|
|
|
|
|
для: coloboc66
(01.05.2007 в 23:42)
| | Что мне делать, у меня работает только с помошью <meta> тега кажде 5 секун происходит обновления. Можно сделать так, чтобы данные не обновлялись всей страницей, а докачивались только те которые только которые новые. | |
|
|
|
|
|
|
|
для: Staglu
(01.05.2007 в 23:48)
| | meta надо в таком случае ваще убрать, да и фреймы тоже не нужны... Чат ниразу не писал и не видел ни одного кода чата :) но думаю, что необходимо через некоторые интервалы времени обращаться к скрипту на сервере, передавая ему о сообщении которое являеться последним или сообщение клиента в соответствии с этим в скрипте должен формироваться ответ, который буде обрабатываться на клиенте. | |
|
|
|
|
|
|
|
для: coloboc66
(01.05.2007 в 23:42)
| | Дык на сколько я понял вопрос стоял о том как по средствам AJAX-а обменяться данными между клиентом и сервером. Это я и попытался объяснить как можно более кратко и полно. Надеюсь получилось... | |
|
|
|
|
|
|
|
для: shkryab
(01.05.2007 в 23:49)
| | При работе с аяксом нужно полностью отказаться от фреймов и от рефрешей. И начать заново изучать ява-скрипт и DOM. Такая вот беда... | |
|
|
|
|
|
|
|
для: coloboc66
(02.05.2007 в 00:20)
| | неправда. я пишу чат, без хвастовства говорю, успешно
у меня 3 ифрейма, потому что если делать без них, то сообщения и список пользователей всю страницу опустят вниз, их надо делать с прокруткой
от дом я тоже отказался
в ответе с сервера я первой строчкой пишу md5 хэш всех сообщений и потом сравниваю его с последним полученным
если отличается, то разбиваю сообщения которые идут на следующих строках с помощью split ('\n'), а данные каждого сообщения при помощи split ('\t')
о доме можно забыть! только лишние проблемы с совместимосью! | |
|
|
|
|
|
|
|
для: bronenos
(02.05.2007 в 05:35)
| | Не могу понять, зачем использовать аякс с фреймами, это вещи, друг друга взаимоисключающие. Зачем эти фреймы нужны, если сообщения можно сразу выводить на страницу? К тому же броузеры ифреймы блокируют. Если каждое новое сообщение выводить вверх страницы, то никаких прокруток не нужно.
...а данные каждого сообщения при помощи split ('\t') - можно подробней? Что здесь понимается под данными? Это имеется ввиду табуляция строки по длине? | |
|
|
|