Как обойти обновление кэшированного содержимого после получения кода ответа http 304?

#php #ajax #http #prototypejs

#php #ajax #http #prototypejs

Вопрос:

У меня есть php-приложение, которое использует prototypejs для выполнения опроса ajax с помощью другого php-скрипта, чтобы проверить, есть ли новый контент или был ли контент обновлен. Он возвращает код ответа http 304, если содержимое не изменилось.

Все это работает нормально, однако я только что узнал, что браузеры, похоже, обновляют содержимое, хотя был отправлен код ответа 304. Похоже, что эти данные поступают из кэша браузера, который был заполнен содержимым из последнего успешного кода ответа 200 (когда опрашивающий обнаружил измененные данные).

http rfc гласит: «Если код состояния равен 304 (не изменен), кэш использует тело объекта, хранящееся в записи кэша, в качестве тела объекта этого исходящего ответа».

Есть ли способ обойти это? Поскольку, несмотря на то, что данные не были изменены, пользователи по-прежнему видят небольшое мерцание каждый раз, когда возвращается код 304. Я мог бы использовать код ответа 410 (Gone), у которого нет такого странного поведения, но я не думаю, что это правильный способ сделать это.

Мой текущий вызов ajax — это простой код прототипа:

 function showProcessing() {
  if(Ajax.activeRequestCount > 0)
    document.getElementById('inProgress2').style.display = 'none';
    document.getElementById('inProgress').style.display = 'inline';
}

function hideProcessing () {
  if(Ajax.activeRequestCount <= 0)
    document.getElementById('inProgress').style.display = 'none';
    document.getElementById('inProgress2').style.display = 'inline'; 
}

Ajax.Responders.register({
  onCreate: showProcessing,
  onComplete: hideProcessing
});
  

Итак, если это поведение можно отключить с помощью prototype, то, вероятно, это что-то, что должно быть сделано в части ‘onComplete’, но я понятия не имею, как.

Комментарии:

1. Должен ли ваш обработчик ответа ajax проверять код состояния HTTP и просто ничего не менять, если это 304?

2. Я не уверен, как это сделать, поскольку javascript / ajax не входит в число моих сильных сторон : (Я только что добавил небольшой фрагмент кода prototype js в свой исходный пост.

3. Я только что перешел на jquery, который, кажется, работает намного лучше с этим.

Ответ №1:

Пожалуйста, еще раз взгляните на исходный связанный веб-сайтhttp://codeigniter.com/wiki/AJAX_for_CodeIgniter / поскольку у него есть примеры только для htis.

Комментарии:

1. я не уверен, что я должен смотреть на этот URL?