powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / добавление обработчиков собыитй, к JsHttpRequest
6 сообщений из 6, страница 1 из 1
добавление обработчиков собыитй, к JsHttpRequest
    #34734035
Alex_BBB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использую популярную Ajax библиотеку JsHttpRequest (dklab.ru)


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
var req = new JsHttpRequest();

req.onreadystatechange = function() {
    if (req.readyState ==  4 ) {
        somefunk();//действия, когда пришел ответ с сервера
    }
}

req.open(null, 'smpl_backend.php', true);


//событие нажатия на ссылке
function linkClick(evt) {
    ...
    req.send( { q: value } );//посылаю запрос на сервер
}



Мне нужно два события:
1. Начало отправки запроса на сервер ( req.send( ) )
2. Конец приема ответа от сервера ( if (req.readyState == 4) {} )


Сейчас я просто вписываю функции которые хочу добавить вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
var req = new JsHttpRequest();

req.onreadystatechange = function() {
    if (req.readyState ==  4 ) {
        somefunk();//действия, когда пришел ответ с сервера

        someEndFunk1();
        someEndFunk2();
    }
}

req.open(null, 'smpl_backend.php', true);

//событие нажатия на ссылке
function linkClick(evt) {
    ...
    someStartFunk1();
    someStartFunk2();

    req.send( { q: value } );//посылаю запрос на сервер
}


А хотелось бы что-то типа такого:
Код: plaintext
1.
req.addStartEventListener( someStartFunk1 );
req.addEndEventListener( someEndFunk1 );


Как бы это получьше организовать? (пожалуйста, если можно, с примерами кода)

Спасибо.
...
Рейтинг: 0 / 0
добавление обработчиков собыитй, к JsHttpRequest
    #34734125
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну дык посмотри, как в самой JsHttpRequest организовано событие onreadystatechange. Сделай по аналогии.
...
Рейтинг: 0 / 0
добавление обработчиков собыитй, к JsHttpRequest
    #34734351
Alex_BBB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не могу понять...

А возможно как-то прототипами добавить рнужный функционал??

самое дурацкое решение:
сделать два глобальных массива.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
req.onreadystatechange = function() {
    if (req.readyState ==  4 ) {

 	for(var i= 0 ; i<endHendlersArray.length; i++)
		var func = endHendlersArray[i]; 
		func.call();
    }
}

Это и правда совсем не красиво.
...
Рейтинг: 0 / 0
добавление обработчиков собыитй, к JsHttpRequest
    #34734684
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чего не можешь понять? Открой файл с исходником JsHttpRequest, найди там строку class JsHttpRequest, где-то подальше строку типа function onreadystatechange(), смотри что в ней.
...
Рейтинг: 0 / 0
добавление обработчиков собыитй, к JsHttpRequest
    #34734752
Alex_BBB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там вообще нет строки class.

нечто я нашел, но модифицировать мне явно не удастся.
Сделал вот так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
//массив обработчиков
JsHttpRequest.prototype.onReadyListeners = [ ];

//метод добавления обработчка
JsHttpRequest.prototype.addReadyListener = function(listener){
  this.onReadyListeners[this.onReadyListeners.length]=listener;
}

//метод вызова всех обработчиков
JsHttpRequest.prototype.callReadyListeners = function(){
	for (var listeners = this.onReadyListeners, i =  0 , listener; listener = listeners[i]; i++) {
		listener();
	}
}

var req = new JsHttpRequest();

req.onreadystatechange = function() {
    if (req.readyState ==  4 ) {
        req.callReadyListeners();
    }
}

Но это не совсем того чего хотелось.
(Оцените пожалуйста грамотность данного кода)


А со второй задечей -( req.addStartEventListener( someStartFunk1 ); )

Код: plaintext
1.
2.
3.
4.
//событие нажатия на ссылке
function linkClick(evt) {
        req.callStartListeners();
        req.send( { q: value } );//посылаю запрос на сервер
}
можно тоже так же поступить, но что-то не нравистся мне. Хочется что бы вызов обработчиков событий добалялся именно к объекту JsHttpRequest, а не через вызов функции linkClick().

Т.е. вот просто вызываешь req.send( ) и все добаленные обработчики тоже исполняются.
...
Рейтинг: 0 / 0
добавление обработчиков собыитй, к JsHttpRequest
    #34735097
Alex_BBB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу проверить грамотность моей реализации добаления обрабоработчиков событий.

Для чего это надо?
Например для добаления визуальных эффектов - при отправке запроса можно вывести идикатор, а при получении ответа убрать его.
(да малоли для чего. В других библиотеках такое уже есть - я понимаю здесь была другая задача, так что можно считать код модулем что-ли)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
/* in addition to JsHttpRequest */
JsHttpRequest.prototype.onEndListeners = [ ];
JsHttpRequest.prototype.onStartListeners = [ ];

JsHttpRequest.prototype.addListener = function(type, listener){
        var listeners = (type == 'start') ? this.onStartListeners : ((type == 'end') ? this.onEndListeners : null );
        listeners[listeners.length]=listener;
}
JsHttpRequest.prototype.callListeners = function(type){
        var listeners = (type == 'start') ? this.onStartListeners : ((type == 'end') ? this.onEndListeners : null );
        for (var i =  0 , listener; listener = listeners[i]; i++) {listener();}
}
JsHttpRequest.prototype.sendWithListeners = function(data){
        this.callListeners('start');
        this.send(data);
}


Вот так можно это использовать:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
var gAjaxObj = new JsHttpRequest();
...

//добавим обработчик на событие посылки запроса
function aaa(){
  alert('aaaa');
}
gAjaxObj.addListener('start' , aaa)

//пошлем запрос и выполним присоединенные обработчики
gAjaxObj.sendWithListeners({ q: value });

Спасибо.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / добавление обработчиков собыитй, к JsHttpRequest
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]