Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.05.2011, 00:03
Аватар для yashka525
Mr. Jacob
Отправить личное сообщение для yashka525 Посмотреть профиль Найти все сообщения от yashka525
 
Регистрация: 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.
Ответить с цитированием
  #2 (permalink)  
Старый 20.05.2011, 11:09
Профессор
Отправить личное сообщение для nikita.mmf Посмотреть профиль Найти все сообщения от nikita.mmf
 
Регистрация: 01.02.2010
Сообщений: 364

У вас проблема обработки статусов, IE кэширует get запросы, поэтому статус у них не 200, а 304, поэтому замените проверку статуса на
if ( request.status >= 200 && request.status < 300 || request.status === 304 )
Ответить с цитированием
  #3 (permalink)  
Старый 20.05.2011, 15:17
Аватар для Magneto
Люмус, Емаксос Developer!
Отправить личное сообщение для Magneto Посмотреть профиль Найти все сообщения от Magneto
 
Регистрация: 06.05.2010
Сообщений: 677

Есть небольшой хак, работает во всех браузерах, замени строчку 17 на:
request.open('GET', PhpFile+Values+'a='+Math.random(), !0);//адрес подключения, !0=true
Ответить с цитированием
  #4 (permalink)  
Старый 20.05.2011, 20:56
Аватар для yashka525
Mr. Jacob
Отправить личное сообщение для yashka525 Посмотреть профиль Найти все сообщения от yashka525
 
Регистрация: 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.
Ответить с цитированием
  #5 (permalink)  
Старый 21.05.2011, 01:01
Аватар для Magneto
Люмус, Емаксос Developer!
Отправить личное сообщение для Magneto Посмотреть профиль Найти все сообщения от Magneto
 
Регистрация: 06.05.2010
Сообщений: 677

Ой, я чуток ошибся, надо так:
'?a='+Math.random()
Ответить с цитированием
  #6 (permalink)  
Старый 21.05.2011, 01:36
Аватар для yashka525
Mr. Jacob
Отправить личное сообщение для yashka525 Посмотреть профиль Найти все сообщения от yashka525
 
Регистрация: 20.01.2011
Сообщений: 194

Сообщение от Magneto Посмотреть сообщение
Ой, я чуток ошибся, надо так:
'?a='+Math.random()
Нет, это я сделал, сразу поправил, он все равно не работает.
Ответить с цитированием
  #7 (permalink)  
Старый 22.05.2011, 05:29
Аватар для yashka525
Mr. Jacob
Отправить личное сообщение для yashka525 Посмотреть профиль Найти все сообщения от yashka525
 
Регистрация: 20.01.2011
Сообщений: 194

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

Кстати, тут надо ставить ?a=... или &a=... в зависимости от числа передаваемых переменных.
Ответить с цитированием
  #8 (permalink)  
Старый 07.06.2011, 08:43
Аватар для yashka525
Mr. Jacob
Отправить личное сообщение для yashka525 Посмотреть профиль Найти все сообщения от yashka525
 
Регистрация: 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");
Ответить с цитированием
  #9 (permalink)  
Старый 09.06.2011, 20:06
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

Сообщение от yashka525 Посмотреть сообщение
У меня есть маленький сайт, он полностью на ajax...
Скажите, а зачем при перемещении от пункта к пункту меню и возврате обратно на ранее просмотренные пункты Вы всё-равно опять запускаете AJAX-запрос? AJAX и WEB 2.0 вроде для того и придуманы чтобы не грузить ничего лишнего и лишний раз...
Ответить с цитированием
  #10 (permalink)  
Старый 10.06.2011, 21:56
Аватар для yashka525
Mr. Jacob
Отправить личное сообщение для yashka525 Посмотреть профиль Найти все сообщения от yashka525
 
Регистрация: 20.01.2011
Сообщений: 194

Потому что я начинающий программист. Ну а вдруг у меня на сервере что-то поменялось пока Вы сидели на первом пункте меню? Хотя Вы правы, мне надо сократить запросы на сервер, но... я пока не знаю как. Есть идеи?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает jQuery меню с AJAX eugene1986 jQuery 0 08.07.2010 18:49
ajax запросы, работает на одних компах и не работает на других vtornik23 AJAX и COMET 2 22.03.2010 18:22
При наборе адреса с www не работает AJAX (JQuery)! madmis AJAX и COMET 3 23.11.2009 19:03
Safari + ajax некорректно работает, а в других работает demi AJAX и COMET 35 15.07.2009 14:11
AJAX - заполнение select - неправильно работает в Mozilla 5.0 С.Тарасов AJAX и COMET 0 17.06.2009 00:58