Ne v kontakte Antisocial programmer's blog

Simple AJAX Long Request

    dev     web     projects     ajax

Для одного из моих проектов, над которым я сейчас активно работаю понадобилось сделать возможность выполнения длинных запросов с “обратной связью”, т. е. с возможностью отсылки информации о ходе выполнения скрипта. Поскольку подключать к проекту какого-нибудь монстра типа JQuery ради одной этой возможности я посчитал нецелесообразным, решено было написать свою простую библиотеку, выполняющую эту функцию. результат я представляю вам в этом посте.

Simple AJAX Long Request (SALR) 1.0

Возможности:

  1. Отправка GET запросов с произвольными данными, переданными в виде хеша.
  2. Отправка форм POST и GET запросами.
  3. Автоматическая конвертация PHP-типов в соответствующие типы объектов JS.
  4. Глобальный доступ к PHP API благодаря реализации в виде статического класса.
  5. Перехват многих фатальных ошибок (см. http://dklab.ru/chicken/nablas/45.html)


Совместимость:

Протестирован в Firefox 3.5, Opera 10.10, Konqueror 4.3.5r0 и IE 7. Теоретически должен работать и в остальных браузерах, включая IE6 (а может и 5) и WebKit-based браузерах.

JavaScript API

После подключения к веб-странице файла longreq.js становится доступен объект lreq, через который и происходит взаимодействие с библиотекой.

lreq.send(url, data, callback)

Отправляет запрос на адрес url с данными data с переданной функцией callback в качестве обработчика.

Параметры:

url - строка. Адрес скрипта, на который следует отправить запрос.
data - хэш. Хэш с GET-параметрами, передаваемыми в запросе. Преобразование ключей и значений производится вызовом метода .toString()
callback - функция. Функция, которая будет вызываться всякий раз, когда приходят данные с сервера. Подробное описание функции и аргументов приведено ниже.

lreq.sendForm(url, form, callback)

Отправляет форму form на адрес url с переданной функцией callback в качестве обработчика.

Параметры:

url - строка. Адрес скрипта, на который следует отправить запрос.
form - DOM-узел. Объект формы, которая будет отправлена.
callback - функция. Функция, которая будет вызываться всякий раз, когда приходят данные с сервера. Подробное описание функции и аргументов приведено ниже.

Замечание:

Форма может по умолчанию иметь обработчик, отличный от указанного в параметре url и он не будет потерян при отправке формы с помощью SALR.

Функция callback.

function callback(mode, jaData, htmlData)

 Параметры:

mode - режим вызова функции.
  0, если это первый вызов, произведенный функцией send() на стороне сервера
  1, если это не первый вызов, произведенный функцией send() на стороне сервера
  2, если это вызов во время завершения работы скрипта.
jaData - это данные, переданные в качестве аргумента функции LongRequest::send(). При mode == 2 всегда null
htmlData - это все данные, выведенные скриптом в браузер в обход функции LongRequest::send(). При моде != 2 всегда null

Замечание:

callback вызывается всегда хотя бы один раз когда серверный скрипт завершает работу с mode, равным 2.

PHP API

После подключения файла longreq.php становится доступен статический класс LongRequest, через который происходит взаимодействие с библиотекой.

LongRequest::init()

Инициализирует работу с библиотекой, включает буферизацию вывода и пытается снять ограничение по времени выполнения скрипта.
Весь вывод, произведенный с этого момента и до завершения работы скрипта будет отправлен непосредственно перед завершением скрипта и передан в качестве аргумента htmlData в callback-функцию.

Longrequest::send($data)

Отправляет произвольные данные в браузер. Данные будут переданы callback-функции в качестве аргумента jsData.
Данные приводятся к JS-типам следующим образом:

♦ null - в null
♦ Число - в число.
♦ Строка - в строку.
♦ Массив - в хэш, все его элементы будут рекурсивно преобразованы согласно этим же правилам.
♦ Все прочее (объекты) - сериализованы функцией serialize() и представлены как строка.

Параметры:

$data - произвольный тип. Данные, которые будут переданы в браузер.

Скачать: longreq.tar_.gz

P.S. Chester Bennington (Linkin Park) — System

blog comments powered by Disqus