
19.05.2011, 00:03
|
 |
Mr. Jacob
|
|
Регистрация: 20.01.2011
Сообщений: 194
|
|
AJAX не работает в IE
У меня есть маленький сайт, он полностью на ajax. Все везде работает, кроме IE. Когда, например, шелкаешь в меню что-то, то скрипт срабатывает, запрос происходит, все норм. Но в IE, когда посылаешь второй (другой) запрос (шелкаешь ВТОРОЙ раз), ничего не пашет.
Код взят с этого сайта, javascript.ru:
function getXmlHttp(){
var xmlhttp;
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (E) {
xmlhttp = false;
}
}
if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
xmlhttp = new XMLHttpRequest();
}
return xmlhttp;
}
var request=getXmlHttp();
потом идет моя функция для меню...
function Menu(elem){
if ((elem.id=='Main_Lg' || elem.id=='Main_Bt') && (location.hash == '#:Main')){} //если мы на главной странице, и делается запрос на нее же - ничего не делаем
else{
var PhpFile, HashValue, Values;
(elem.id=='Main_Lg' || elem.id=='Main_Bt')? (PhpFile = 'Main.php', HashValue = 'Main', Values = '') : (PhpFile = 'Instrument.php', HashValue = 'Instrument|Name='+elem.id, Values = encodeURI('?Name='+elem.id));
request.onreadystatechange=function(){//если все готово - начинаем запрос
if(request.readyState==4){// если запрос закончил выполняться
if (request.statusText=='Not Found'){// если статус Not Found, то...
ChangblContnt.innerHTML = NotFoundText;// показываем NotFoundText
}
else if(request.status==200){// если статус 200 (ОК) - выдать ответ пользователю
ChangblContnt.innerHTML=request.responseText;//ответ php файла
Title.innerHTML = document.getElementById('TtlChngrDv').innerHTML;// меняем title
}
}
}
request.open('GET', PhpFile+Values, !0);//адрес подключения, !0=true
request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");//тип header
request.send(null);//посылаем данные
ChangblContnt.innerHTML = Loading;//показываем анимационную gif
location.hash = ':' + HashValue;// меняем hash
}
}
Я знаю, у меня ужасный код  , но пытаюсь по чучуть учитья, не бейте сильно. В общем, помогите разобратся почему не пашет в IE, сайт - http://noty.vestnikistiny.info/
Последний раз редактировалось yashka525, 20.05.2011 в 00:51.
|
|

20.05.2011, 11:09
|
Профессор
|
|
Регистрация: 01.02.2010
Сообщений: 364
|
|
У вас проблема обработки статусов, IE кэширует get запросы, поэтому статус у них не 200, а 304, поэтому замените проверку статуса на
if ( request.status >= 200 && request.status < 300 || request.status === 304 )
|
|

20.05.2011, 15:17
|
 |
Люмус, Емаксос Developer!
|
|
Регистрация: 06.05.2010
Сообщений: 677
|
|
Есть небольшой хак, работает во всех браузерах, замени строчку 17 на:
request.open('GET', PhpFile+Values+'a='+Math.random(), !0);//адрес подключения, !0=true
|
|

20.05.2011, 20:56
|
 |
Mr. Jacob
|
|
Регистрация: 20.01.2011
Сообщений: 194
|
|
Нет, не работает не то и не другое...
С этим даже в Chrome не пашет:
if ( request.status >= 200 && request.status < 300 || request.status === 304)
А это не работает только в IE:
'&a='+Math.random()
Даже обидно, первый запрос прям четко, за четверть секунды, а второй не проходит...
UPD
Очень странно, '&a='+Math.random() должно работать ( http://xmlhttprequest.ru/#problem), но не работает. Спасибо за мысль, буду работать над этим, но если есть еще идеи, пожалуйста, помогите.
Конечно, можно все делать методом POST потому что он не кешируется, но это не решение проблемы, хотелось бы понять, что не работает.
Последний раз редактировалось yashka525, 20.05.2011 в 21:20.
|
|

21.05.2011, 01:01
|
 |
Люмус, Емаксос Developer!
|
|
Регистрация: 06.05.2010
Сообщений: 677
|
|
Ой, я чуток ошибся, надо так:
'?a='+Math.random()
|
|

21.05.2011, 01:36
|
 |
Mr. Jacob
|
|
Регистрация: 20.01.2011
Сообщений: 194
|
|
Сообщение от Magneto
|
Ой, я чуток ошибся, надо так:
'?a='+Math.random()
|
Нет, это я сделал, сразу поправил, он все равно не работает.
|
|

22.05.2011, 05:29
|
 |
Mr. Jacob
|
|
Регистрация: 20.01.2011
Сообщений: 194
|
|
Прошу прощение, все заработало! Я просто полностью переписал всю функцию, с нуля (это очень помогает, если не понимаешь что не работает), потому что могла быть ошибка в другом месте. Спасибо большое  , Magneto, этот хак работает:
request.open('GET', PhpFile+Values+'&a='+Math.random(), !0);
Кстати, тут надо ставить ?a=... или &a=... в зависимости от числа передаваемых переменных.
|
|

07.06.2011, 08:43
|
 |
Mr. Jacob
|
|
Регистрация: 20.01.2011
Сообщений: 194
|
|
Но все ровно, IE есть IE и в нем ниче не пашет. Решил проблему с помощью php. Я в тот файл, который отвечает на запрос вставил это:
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
|
|

09.06.2011, 20:06
|
Профессор
|
|
Регистрация: 02.07.2010
Сообщений: 642
|
|
Сообщение от yashka525
|
У меня есть маленький сайт, он полностью на ajax...
|
Скажите, а зачем при перемещении от пункта к пункту меню и возврате обратно на ранее просмотренные пункты Вы всё-равно опять запускаете AJAX-запрос? AJAX и WEB 2.0 вроде для того и придуманы чтобы не грузить ничего лишнего и лишний раз...
|
|

10.06.2011, 21:56
|
 |
Mr. Jacob
|
|
Регистрация: 20.01.2011
Сообщений: 194
|
|
Потому что я начинающий программист.  Ну а вдруг у меня на сервере что-то поменялось пока Вы сидели на первом пункте меню? Хотя Вы правы, мне надо сократить запросы на сервер, но... я пока не знаю как. Есть идеи?
|
|
|
|