readyState входит только в состояние 1

Andrey_rus

Новичок
readyState входит только в состояние 1

Для созданного объекта XMLHtppRequest задаю необходимые параметры и в том числе функцию обратного вызова (ожидания)

PHP:
xmlHttp.open("POST", "validate.php", true);	
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");	
xmlHttp.onreadystatechange = handleRequestStateChange;		
xmlHtpp.send(null);
В функции handleRequestStateChange ожидается состояние readyState == 4^

PHP:
function handleRequestStateChange() {							      // Вывод текущего состояния (для дебага)				
      document.getElementById('reg_error').innerHTML = xmlHttp.readyState;
	// Когда readyState == 4, мы можем прочитать ответ сервера
	if(xmlHttp.readyState == 4) {
		// Продолжить, только если статус HTTP равен "ОК" - 200
		if(xmlHttp.status == 200) {
			// Прочитать ответ полученный от сервера
			try {
				readResponse();
			} catch (e) {
				
			}
			
		}
	}
}
Так вот состояние readyState всегда равняется единице, т.е. запрос формируется, но xmlHtpp.send уже не работает. Вопрос: почему? Тесты показали, что рушится все как раз при вызове xmlHtpp.send.

Код основан на примере из книжки "AJAX и PHP" К. Дари

На всякий случай приведу код формирования ссылки на объект XMLHttpRequest, но практически уверен проблема не здесь:

PHP:
// Функция создания экземпляра объекта XMLHttpRequest
function createXMLHttpRequestObject() {
	// Переменная для хранения ссылки на объект XMLHttpRequest
	var xmlHttp;
	// Попытка создать объект по новому образцу
	// Работает для всех браузерах за исключением Explorer 6 и более ранних
	try {
		// Попытка создать объект XMLHttpRequest
		xmlHttp = new XMLHttpRequest();
	} catch(e) {
		// Если браузер все же старой версии (Explorer 6 или ранее),
		// то пытаемся создать объект другой версии
		var XmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0",
		                                "MSXML2.XMLHTTP.5.0",
		                                "MSXML2.XMLHTTP.4.0",
		                                "MSXML2.XMLHTTP.3.0",
		                                "MSXML2.XMLHTTP",
		                                "Microsoft.XMLHTTP");
        // Попробовать все возможные prog id пока какой-нибудь не подойдет
        for(var i = 0; i < XmlHttpVersions.length && !xmlHttp; i++) {
        	try {
        		// Попытка создать объект XMLHtppRequest
        		xmlHttp = new ActiveXObject(XmlHttpVersions[i]);
        	} catch (e) {}
        }
		
	}
	
	// Вернуть созданный объект или вывести сообщение об ошибке
	if(!xmlHttp) {
		alert('Ошибка создания объекта XMLHttpRequest');
	} else {
		return xmlHttp;
	}
}
 

Andrey_rus

Новичок
Я тестировал В Explorere версии 6 и в Opera 9. Но вот дотестировался только до такой проблемы :) Но спасибо за замечание, потом покопаю на тему кроссбраузерности.
 

dimagolov

Новичок
Alexandre, а xmlHttp = new XMLHttpRequest(); разве не для всех кроме IE написано?

Andrey_rus, поставь плагин чтобы смотреть заголовки и смотри что куда посылается.
с чего решили, что send не работает? как выглядет серверная часть? что сервер получает в запросе?
 

Andrey_rus

Новичок
dimagolov, спасибо, плагин поставил.

То, что рушится все на вызове метода send Проверяю просто:

PHP:
// Послать запрос серверу для проверки извлеченных данных
alert('before open');
xmlHttp.open("POST", serverAdress, true);	
alert('after open 1');
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");	
alert('after open 2');
xmlHttp.onreadystatechange = handleRequestStateChange;	
alert('after open 3');
xmlHtpp.send(null);
alert('after send');
так вот сообщение "after send" уже не выводится.

Послушав Вашего совета, dimagolov с плагином для просмотра заголовков, понимаю, что приводить код серверной части нет смысла. Функция send не вызывается, следовательно никаких заголовков не передается еще (проверено опять же плагином). Т.е. до выполнения серверного скрипта дело не доходит. Значит проблема не в этом, да?
 

dimagolov

Новичок
Andrey_rus
пиши код ВНИМАТЕЛЬНО!!!

xmlHttp.onreadystatechange = handleRequestStateChange;
xmlHtpp.send(null);
 
Сверху