Javascript AJAX responseText проблема в IE - PullRequest
1 голос
/ 12 апреля 2011

Я пытаюсь создать что-то вроде системы чата с PHP / MySql и AJAX, но у меня возникают трудности при запуске моего скрипта в IE. Я проверил его в Google Chrome, и он работал просто отлично. Но когда я тестирую его в IE, функция AJAX, которая должна получать все сообщения из базы данных каждые 3 секунды, не работает должным образом. Он вызывает скрипт PHP каждые 3 секунды и помещает responseText в div (отображение всех найденных сообщений каждые 3 секунды). Но показанные сообщения всегда одинаковы (пока я не закрою страницу и не перезапущу скрипт). Также, когда новое сообщение добавляется в базу данных, оно не отображается. Кажется, что текст ответа не обновляется. Вот мои сценарии:

(AJAX)

function getMessages(messengerid, repeat)
{
var xmlhttp;
if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
    document.getElementById("messages").innerHTML=xmlhttp.responseText;
    document.getElementById("messages").scrollTop = document.getElementById("messages").scrollHeight;
    }
  }
xmlhttp.open("GET","modules/get_messages.php?key=abcIUETH85i236t246jerst3487Jh&id="+messengerid,true);
xmlhttp.send();
if(repeat) {
    setTimeout("getMessages("+messengerid+", 1);", 3000);
}
}

(PHP / MySql)

<?php
$key = "abcIUETH85i236t246jerst3487Jh";

if( ($_GET['key'] == $key OR defined('IS_INTERNAL')) AND (int)$_GET['id'] > 0) {

    include_once("../config.php");
    include_once("../class/system.class.php");

    $sys = new system($template_name);

    if(!$sys->connect($db)) {
        exit();
    }

    $messages = $sys->getEntries("messages", " WHERE messenger_id = '".(int)$_GET['id']."' ORDER BY id ASC ");
    $messenger    = $sys->getEntries("messengers", " WHERE id = '".(int)$_GET['id']."' LIMIT 1");

    $user1 = $sys->getEntries("accounts", " WHERE id = '".$messenger[0]['account_id1']."' ");
    $user2 = $sys->getEntries("accounts", " WHERE id = '".$messenger[0]['account_id2']."' ");

    $displaynames[$user1[0]['id']] = $user1[0]['displayname'];
    $displaynames[$user2[0]['id']] = $user2[0]['displayname'];

    foreach($messages AS $key => $message) {

    if(is_numeric($key)) {              
    ?>
    <div class="message">
        <b><?=$displaynames[$message['account_id']];?>  (<?=date("h:m:s", $message['timestamp']);?>) says:</b> <br />
        <?=nl2br($message['message_content']);?>
    </div>
    <?php
    }
    }


}

?>

Любая помощь будет высоко ценится! Заранее спасибо.

С наилучшими пожеланиями, Skyfe.

Ответы [ 3 ]

0 голосов
/ 12 апреля 2011

Это общая проблема с IE, он кэширует результат. Добавьте некоторый фиктивный случайный параметр к вашему вызову ajax, например, текущую метку времени

0 голосов
/ 25 апреля 2011

я не знаю о php, но в jsp вы можете добавить следующий код на свою страницу jsp

response.setHeader("Cache-Control","no-store, no-cache, must-revalidate");
response.setHeader("Pragma","no-cache"); 
response.setDateHeader ("Expires", 0);

я знаю, что пост старый, я только что ответил для будущих зрителей: D;)

0 голосов
/ 12 апреля 2011

Ваш ответ кэшируется.Одним из способов решения этой проблемы является добавление уникального параметра в URL-адрес вашего запроса, например текущей отметки времени.

...