Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

ajax - глюк с обработчиком onreadystatechange

15K
07 января 2008 года
hel
78 / / 10.11.2007
Столкнулся тут с проблемой.
После того, как я назначил обработчик xmlHttpObject.onReadyStateChange - он начал работать только в IE. В FF и опере молчит, а также не выдает никаких ошибок.
Также, сама задумка обработчика не работает даже в IE. Нужно, чтобы при определённом readyState записывалось нужное мне сообщение в нужное место, но оно показывается только когда я раскоментирую alert(). -_-
В общем пощу сюда весь скрипт, может кто знает, что я не так делаю?

Код:
var xmlHttpObject=false;

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="Загрузка...";
    }
}
11K
08 января 2008 года
Free Thinker
118 / / 16.03.2007
мне кажется, что может не работать из за неправильного вызова...
Цитата: hel

 
Код:
xmlHttpObject.open("POST", "index.php", false);
xmlHttpObject.send(PostQuery);



попробуй так:

 
Код:
xmlHttpObject.open("POST", "index.php?" + PostQuery, true);
xmlHttpObject.send(null);


кстати, проверяй http статус:
 
Код:
if (xmlHttp.readyState == 4)
{
        if (xmlHttp.status == 200)
        ...
15K
08 января 2008 года
hel
78 / / 10.11.2007
Вот спасибо, добрый человек. :)
В IE теперь всё работает как надо.

Но в FF и опере всё-равно как молчало, так и молчит, не выдаёт никаких признаков жизни... Причем я точно знаю, что ошибка где-то в обработчике. Т. к. без обработчика скрипт работает как надо, без ошибок получая страницу.

Вот измененный скрипт. Ума не приложу, где тут ошибка...
Код:
var xmlHttpObject=false;

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]
2
08 января 2008 года
squirL
5.6K / / 13.08.2003
замени
xmlHttpObject.onReadyStateChange=processRequestChange;
на
xmlHttpObject.onReadyStateChange=processRequestChange[COLOR="Red"]()[/COLOR];
15K
08 января 2008 года
hel
78 / / 10.11.2007
Ругается на несоответствие типов.
11K
09 января 2008 года
Free Thinker
118 / / 16.03.2007
squirL, не не, без скобок правильно.
27K
09 января 2008 года
AKS.
34 / / 27.08.2007
Цитата: hel

После того, как я назначил обработчик xmlHttpObject.onReadyStateChange...


onReadyStateChange замените на onreadystatechange (видите разницу?).

2
09 января 2008 года
squirL
5.6K / / 13.08.2003
Цитата: Free Thinker
squirL, не не, без скобок правильно.



хм... у меня Firefox без скобок ругался =\

251
09 января 2008 года
SkyMаn
1.7K / / 31.07.2007
Со скобками таки правильней будет.
15K
09 января 2008 года
hel
78 / / 10.11.2007
AKS.:
Биг сенькс! В этом и было дело, сейчас аякс работает в трёх браузерах на пятерку.

Без скобок правильно, я посмотрел на w3c.
11K
10 января 2008 года
Free Thinker
118 / / 16.03.2007
Цитата: squirL
хм... у меня Firefox без скобок ругался =\



пробовал на опере, фф и ие6/7. все работает без скобок.

27K
10 января 2008 года
AKS.
34 / / 27.08.2007
Цитата: Free Thinker
пробовал на опере, фф и ие6/7. все работает без скобок.


В данном случае даже пробовать нет смысла.
Принцип достаточно прост. Для обработки события необходимо event property (в данном случае это св-во onreadystatechange) присвоить значение функции-обработчика события. Именно это и происходит, когда справа от оператора присвоения находится идентификатор-ссылка на функцию. Если же следом за идентификатором поставить скобки (вызов функции), то необходимо позаботиться о том, чтобы вызванная функция возвратила другую функцию. Бросив беглый взгляд на функцию, на которую указывает processRequestChange, можно сразу заметить, что она ничего не возвращает. Следовательно и вызов представляется совершенно бессмысленным.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог