Xpoint
   [напомнить пароль]

Эмуляция отправки формы при помощи XMLHttpRequest

Данный набор функций позволяет отправлять данные на сервер при помощи XMLHttpRequest так, что на сервере они будут восприниматься как данные обычной POST-формы. Поскольку кодирование данных осуществляет функция encodeURIComponent(), всегда используется кодировка UTF-8.

Работает в браузерах IE5.5+, Mozilla, Safari. Работает и в Опере 8+, но версия 8.00 Оперы не поддерживает метод setRequestHeader, то есть данные на сервер передаются без заголовка Content-Type: application/x-www-form-urlencoded (исправлено в версии 8.01). В принципе, серверными методами эту проблему можно обойти.

/*
Создание XMLHttpRequest-объекта
Возвращает созданный объект или null, если XMLHttpRequest не поддерживается
*/
function createRequestObject() {
    var request = null;
    try {
        request=new ActiveXObject('Msxml2.XMLHTTP');
    } catch (e){}
    if(!request) try {
        request=new ActiveXObject('Microsoft.XMLHTTP');
    } catch (e){}
    if(!request) try {
        request=new XMLHttpRequest();
    } catch (e){}
    return request;
}

/*
Кодирование данных (простого ассоциативного массива вида { name : value, ...} в
URL-escaped строку (кодировка UTF-8)
*/
function urlEncodeData(data) {
    var query = [];
    if (data instanceof Object) {
        for (var k in data) {
            query.push(encodeURIComponent(k) + "=" + encodeURIComponent(data[k]));
        }
        return query.join('&');
    } else {
        return encodeURIComponent(data);
    }
}

/*
Выполнение POST-запроса 
url  - адрес запроса
data - параметры в виде простого ассоциативного массива { name : value, ...} 
callback - (не обяз.) callback-функция, которая будет вызвана после выполнения запроса и получения ответа от сервера
*/
function serverRequest(url, data, callback) {
    var request = createRequestObject();
    if(!request) return false;
    request.onreadystatechange  = function() { 
            if(request.readyState == 4 && callback) callback(request);
        };
    request.open('POST', url, true);
    if (request.setRequestHeader)
        request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    request.send(urlEncodeData(data));
    return true;
}

Если на сервере проверяется Referer, то надо учитывать, что Firefox при XMLHttpRequest не передает его в заголовках. В этом случае в код следует включить строчку request.setRequestHeader("Referer", location.href);

Комментарии

2005-07-19 18:53:54 [обр] Bohdan C[досье]
Как сделать Https запрос?
спустя 1 час 15 минут [обр] Bohdan C[досье]
В опере не работает :(
спустя 6 месяцев [обр] Eugene Efremov[досье]
  1. if (request.setRequestHeader) — ошибка в IE, он так с ActiveX объектами обращаться не позволяет.
  2. Чтобы эта самая setRequestHeader гарантировано присутствовала, надо юзать ActiveXObject('Msxml2.XMLHTTP.3.0'). И if выкинуть.
Иными словами:
function createRequestObject() 
{
  try {
    return new ActiveXObject('Msxml2.XMLHTTP.3.0'); // IE
  } catch (e) {
    try {
      return new XMLHttpRequest(); // FF
    } catch (e) {
      return null;
    }
  }
}
спустя 19 минут [обр] Eugene Efremov[досье]
Ах да, опера еще.
Тогда как-нибудь так:
function createRequestObject() 
{
  try {
    return new ActiveXObject('Msxml2.XMLHTTP.3.0'); // IE
  } catch (e) {
    try {
      var ret = new XMLHttpRequest(); // FF, Opera 8.01
      if (!ret.setRequestHeader) throw "Opera 8.00";
      return ret;
    } catch (e) {
      return null;
    }
  }
}
спустя 2 года 5 месяцев [обр] Rion[досье]
ошибочка в описании в самом верху
не escapeURIComponent а encodeURIComponent
спустя 2 года [обр] Александр Михалицын[досье]
Rion[досье],
исправлено!
Powered by POEM™ Engine Copyright © 2002-2005