ajax - глюк с обработчиком onreadystatechange
После того, как я назначил обработчик xmlHttpObject.onReadyStateChange - он начал работать только в IE. В FF и опере молчит, а также не выдает никаких ошибок.
Также, сама задумка обработчика не работает даже в IE. Нужно, чтобы при определённом readyState записывалось нужное мне сообщение в нужное место, но оно показывается только когда я раскоментирую alert(). -_-
В общем пощу сюда весь скрипт, может кто знает, что я не так делаю?
function Ajax(Page){
var PostQuery="act=ajax&page="+encodeURI(Page);
if(window.XMLHttpRequest){
xmlHttpObject=new XMLHttpRequest();
}
else if(window.ActiveXObject){
xmlHttpObject=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlHttpObject.onReadyStateChange=processRequestChange;
xmlHttpObject.open("POST", "index.php", false);
xmlHttpObject.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlHttpObject.setRequestHeader("Content-length", 2);
xmlHttpObject.send(PostQuery);
}
function processRequestChange(){
//alert("hello");
if(xmlHttpObject.readyState==4){
document.getElementById("page").innerHTML=xmlHttpObject.responseText;
}
else if(xmlHttpObject.readyState==3 || xmlHttpObject.readyState==1){
document.getElementById("page").innerHTML="Загрузка...";
}
}
xmlHttpObject.send(PostQuery);
попробуй так:
xmlHttpObject.send(null);
кстати, проверяй http статус:
{
if (xmlHttp.status == 200)
...
В IE теперь всё работает как надо.
Но в FF и опере всё-равно как молчало, так и молчит, не выдаёт никаких признаков жизни... Причем я точно знаю, что ошибка где-то в обработчике. Т. к. без обработчика скрипт работает как надо, без ошибок получая страницу.
Вот измененный скрипт. Ума не приложу, где тут ошибка...
function Ajax(Page){
var PostQuery="index.php?act=ajax&page="+encodeURI(Page);
if(window.XMLHttpRequest){
xmlHttpObject=new XMLHttpRequest();
}
else if(window.ActiveXObject){
xmlHttpObject=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlHttpObject.onReadyStateChange=processRequestChange;
xmlHttpObject.open("POST", PostQuery, true);
xmlHttpObject.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlHttpObject.send(null);
}
function processRequestChange(){
if(xmlHttpObject.readyState==4){
if(xmlHttpObject.status==200){
document.getElementById("page").innerHTML=xmlHttpObject.responseText;
}
else{
document.getElementById("page").innerHTML="Ошибка.";
}
}
else if(xmlHttpObject.readyState==3 || xmlHttpObject.readyState==1){
document.getElementById("page").innerHTML="Загрузка...";
}
}
Пример вызова:
[html]<a href='index.php?page=add_news' onclick='Ajax("add_news");return false;'>Добавить новость</a>
<div id='page'></div>[/html]
xmlHttpObject.onReadyStateChange=processRequestChange;
на
xmlHttpObject.onReadyStateChange=processRequestChange[COLOR="Red"]()[/COLOR];
После того, как я назначил обработчик xmlHttpObject.onReadyStateChange...
onReadyStateChange замените на onreadystatechange (видите разницу?).
хм... у меня Firefox без скобок ругался =\
Биг сенькс! В этом и было дело, сейчас аякс работает в трёх браузерах на пятерку.
Без скобок правильно, я посмотрел на w3c.
пробовал на опере, фф и ие6/7. все работает без скобок.
В данном случае даже пробовать нет смысла.
Принцип достаточно прост. Для обработки события необходимо event property (в данном случае это св-во onreadystatechange) присвоить значение функции-обработчика события. Именно это и происходит, когда справа от оператора присвоения находится идентификатор-ссылка на функцию. Если же следом за идентификатором поставить скобки (вызов функции), то необходимо позаботиться о том, чтобы вызванная функция возвратила другую функцию. Бросив беглый взгляд на функцию, на которую указывает processRequestChange, можно сразу заметить, что она ничего не возвращает. Следовательно и вызов представляется совершенно бессмысленным.