Witam, napisałem chat w js z użyciem jquery. Chat kożysta z json. Przy starcie pobierane jest 20 ostatnich wiadomości, później tylko nowe.
W FF dziala wszystko wyśmienicie, jednak IE chyba posiada jakiś cache, bo gdy napiszę wiadomość(czy to na IE, czy to na FF) to nie wyświetla mi jej(tylko w IE, w FF widać ją zaraz).
Wiadomości są widoczne, dopiero po ponownym uruchomieniu przeglądarki(IE), odświerzanie nic nie daje.
Skrypt działa poprawnie również w Opera
Używam IE7
Skrypt działa tak:
plik chat.json.php powinien mi zwrócić nowe wiadomości(te których ID jest większe od podanego). I gdy napiszę wiadomość w IE i próbuje manualnie zobaczyć wynik json wchodząc na plik chat.json.php?id=57&location=0 to w IE widzę pusty wynik: [], gdy odświeże go w FF to widzę: [author...............].
I teraz zdziwienie bo gdy otworzę go w IE to widzę wynik taki jak w FF? Czego to może być przyczyna? jQuery...?
Poniżej pliki związane z chatem.
chat.json.php- Odbieranie wiadomosci z bazy
<?php
/*ąłśąłś*/
require_once 'inc/config.php';
require_once 'inc/jsonFunctions.php';
$location = (isset($_GET['location'])) ?
intval($_GET['location']) : '';
{
die('Przesłano nie poprawne informacje!'); }
$sth = $pdo -> query('SELECT chat.id, chat.message, chat.time, chat.author AS pid, players.login FROM chat
LEFT JOIN players
ON players.id=chat.author
WHERE chat.id>'.$id.' ORDER BY chat.id DESC LIMIT 20');
$sth -> execute();
while($row = $sth -> fetch())
{
'id' => $row['id'],
'login' => $row['login'],
'pid' => $row['pid'],
'text' => toCode($row['message']),
'date' => date('Y-m-d H:i:s', $row['time']) );
}
$sth -> closeCursor();
echo json_encode
($messages); ?>
plik sendMessage.json.php- wysylanie wiadomosci
<?php
/*ąłśąłś*/
require_once 'inc/config.php';
if (!isset($_SESSION['pid'])) {
}
$text = (isset($_POST['text'])) ?
$_POST['text'] : ''; $location = (isset($_POST['location'])) ?
intval($_POST['location']) : ''; {
die('Wypełnij wszystkie pola!'); }
$sth = $pdo -> prepare('INSERT INTO chat(author, time, message, location) VALUES(:pid, :time, :message, :location)');
$sth -> bindValue(':pid', $_SESSION['pid']);
$sth -> bindValue(':time', time()); $sth -> bindValue(':message', $text);
$sth -> bindValue(':location', $location);
$sth -> execute();
$sth -> closeCursor();
Plik HTML:
<form id="sendMessage" method="post" action="json/sendMessage.json.php"> <input type="text" style="width: 400px;" name="message" id="messageText" /> <input type="submit" value="Wyślij" style="width:50px;" onclick="sendMessage(); return false;" /> Wczytywanie chatu...
Oto kod JS:
var lastId = 0;
function show(data)
{
var chatDiv = $('.chat').html();
var newElement = '<div class="msg"><div class="author">'+data['login']+': </div> <div class="text">'+data['text']+'</div></div>';
$('.chat').html(newElement+chatDiv);
}
function getMessages(id)
{
$.ajax({
type: 'GET',
dataType: 'json',
url: 'json/chat.json.php',
data: { 'location': 0, 'id': id },
success: function(result)
{
if (id == 0)
{
$('.chat').html('');
}
if (typeof result == 'object')
{
for (n in result)
{
show(result[n]);
lastId = result[n]['id'];
}
}
}
});
}
function getNew()
{
getMessages(lastId);
}
function sendMessage()
{
var e = $('#sendMessage');
var messageText = $('#messageText').attr('value');
$('#messageText').attr('value', '');
$.ajax({
type: e.attr('method'),
url: e.attr('action'),
dataType: 'json',
data: { location: 0, text: messageText },
success: function (result)
{
if (result != 1)
alert('Wiadomość nie została wysłana!');
}
})
}
getMessages(0);
setInterval('getNew()', 1000);
Edit
Po 6 godzinach prawie znalazłem rozwiązanie. Masakra.
Rozwiązanie: w obiekcie przekazywanym do funkcji $.ajax trzeba ustawić
cache: false,
Ten post edytował daniel1302 5.02.2012, 18:23:48