Ajax

индекс
86,27

Prototype, Ajax.PeriodicalUpdater и Internet Explorer

Довольно простой код для использования Ajax.PeriodicalUpdater предлагается в описании API на официальном сайте prototype

new Ajax.PeriodicalUpdater('items', '/items', {
method: 'get', frequency: 3, decay: 2
});


Все вроде хорошо, но сегодня наткнулся на грабли при работе в IE, а именно скрипт не выполнял своего прямого предназначения - не обновлял контейнер по таймеру.

Искал решение долго и упорно, но в рунете ничего внятного не нашел (возможно, искал не так долго и упорно, как того требовалось бы). А вот покопавшись по забугорским сайтам наткнулся на такую статью: http://blog.innerewut.de/2007/9/22/ie-do…

И тогда проблему решил следующим способом:

new Ajax.PeriodicalUpdater('items', '/items', {
method: 'post', frequency: 3, decay: 2
});


IE, просто, кеширует GET запросы в ajax (в том числе и при PeriodicalUpdater). Победить можно либо посылая различные параметры при каждом GET запросе, либо использовать POST. Данное решение снимает все проблемы и позволяет обновлять нужный нам контейнер во всех браузерах. Ура! (:

P.S. при программирование на Ruby переключение на POST не столь просто, поэтому придется повозиться - как именно показано в статье http://blog.innerewut.de/2007/9/22/ie-do….

x-posted: http://n0ns3ns3.livejournal.com/236264.h…
+7
16 июля 2008, 08:26
11

комментарии (19)

0
mechmind #
Спасибо за сэкономленные час-два отладки :)
0
Lex85 #
Полностью присоединяюсь к предыдущему комментарию. Спасибо!
+3
sirus #
Можно с GET и без возьни, достаточно добавить нужный хеадер

new Ajax.PeriodicalUpdater('items', '/items', {
method: 'get',
frequency: 3,
decay: 2,
requestHeaders : {
'If-Modified-Since' : 'Sat, 1 Jan 2000 00:00:00 GMT'
}
})
0
nons #
спасибо, попробую ваш метод (:
0
lahmatiy #
Хотел тоже самое написать :)
Только лучше подправить сам proptotype.js, а то каждый раз добавлять хеадер как то не круто.
0
sirus #
я думаю не стоит лезть внутрь prototype, потому как после обновления версии все ваши изменения будут потеряны...
а каждый раз и ненадо добавлять хеадер, надо использовать тогда когда надо :), если надо всегда используйте либо 'post', либо глобализируйте опции
0
caezar #
тогда лучше запостить тикет и попытаться доказать что это нужно
0
Q_Zma #
лучше наверно будет просто воспользоваться одним из основных инструментов prototypejs: Object.extend(dest, src), и, либо свой апдейтер создать со своим заголовком If-Modified-Since, либо просто перегрузить один метод в дефолтном апдейтере...
можно так же без заголовков обойтись перегрузив Ajax.PeriodicalUpdater.onTimerEvent (это самый компактный метод :)) и добавив в url что-нть типа ts=<CURRENT_TIMESTAMP>
0
sirus #
в url некрасиво добавлять, хотя подход с url использовался раньше чаще, на данный момент круче все же через header, чище получается, если можно так выразится - то более REST правильно
0
Q_Zma #
ну всё это дело вкуса, не буду спорить... в общем, задача решабельна безнапряжабельно и вариабельно :)
+1
1999 #
была та же проблема при работе с прототайпом, лечил выставлением в серверном скрипте заголовков против кэширования, работало на ура
+1
95Eq #
Это не проблема при работе с прототайпом, это нормальное поведение HTTP метода GET.
0
1999 #
с этим никто и не спорит
0
Ango #
как вариант, в гет запросах для ие добавлять параметр ParamName= new Date().getTime()
0
Insane #
Обнаружил подобную проблему с Аяксом в MobileSafari на iPhone. Он кэшировал GET запросы в независимо от запрета это делать. Тоже решил проблему POST запросами.
0
tenshi #
код "запрета это делать" пожалуйста в студию.
0
Insane #
Понял свою ошибку. Я в заголовке запроса выставлял Cache-control: no-cache. Но видимо, это надо было делать на сервере. :(
НЛО прилетело и опубликовало эту надпись здесь
0
nons #
спасибо за ваш комментарий, и могу вас уверить - побудила :)
плюс вам

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.