Изобретая велосипеды: AJAX

2 декабря 2008

короче, суть в том, что нужно мне было сделать штуку, чтобы удобно было делать запросы через ajax и не менее удобно обрабатывать ответы от них.

так вот, если раньше я таскал за собой или дикий кусок js, изменять который было сложно или некий фреймворк типа jQuery, то теперь я сделал простенький объект, который делает всю грязную работ,. а мне остается только передать параментры и функцию обработки, и поскольку я не жадный, то нате:

if (typeof jsAjax == "undefined" || !jsAjax) {
  var jsAjax = {};
}

jsAjax.ajax = typeof jsAjax.ajax != 'undefined' && jsAjax.ajax ? jsAjax.ajax : function(o) {
  var url = (typeof o === 'string') ? o : o.url;
  var callback = (typeof o.callback === 'undefined') ? function() {} : o.callback;
  var method = (typeof o.method === 'undefined') ? 'GET' : o.method;
  var type = (typeof o.type === 'undefined') ? 'text' : o.type;

  var len = (typeof o.vars === 'undefined') ? 0 : o.vars.length;
  var str="";
  for(var i = 0;i < len;i++)
  {
    if(i!='0')
    {
      str=str+'&';
    }
    str=str+o.vars[i].name+'='+escape(o.vars[i].value);
  }

  var xhr = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();

  var onCompleteRequest = function () {
    if (xhr.readyState == 4)
    {
      if (xhr.status == 200)
      {

        if (type == "text") {
          r=xhr.responseText;
        } else if (type=="json") {
           r=eval('('+xhr.responseText+')');
        } else if (type=="xml") {
          r=xhr.responseXML.documentElement;
        } else {
          r=xhr.responseText;
        }
        callback(r);
      }
    }
  };

  xhr.open(method, url, true);
  xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  xhr.setRequestHeader('Accept-Language', 'en');
  xhr.setRequestHeader('Accept-Charset', 'utf-8');
  xhr.onreadystatechange=onCompleteRequest;
  xhr.send(str);

};

Пользоваться безумно просто, чтоб было более менее понятно, несколько примеров:

jsAjax.ajax("http://example.com/");

jsAjax.ajax({url:"http://example.com/",vars:[{name:"x",value:"y"},{name:"y",value:"x"}],method:"POST",callback:function() {alert(r);}});

jsAjax.ajax({url:"http://example.com/",vars:[{name:"x",value:"y"},{name:"y",value:"x"}],method:"POST",type:"json",callback:someFunction});

теперь по поводу параметров:

можно передать просто текст, тогда он будет считаться адресом и сделает тупой GET запрос, а можно поступить умнее и заполнить структурку состоящюю из следующих полей

url — адрес который запрашиваем
vars — список параметров запроса в виде:

[{name:"someName",value:"someValue"},{name:"someOtherName",value:"someOtherValue"}]

method — метод запроса (GET или POST)
type — тип ответа передаваемый в функцию обработки (text,json,xml)
callback — функция обработки ответа (ответ в соответствии с типом как видно из кода передается одной переменной)

вообщем вызов с полным списком переменных будет выглядеть примерно так:

jsAjax.ajax({
url:"http://somedome.com/somepage.php",
vars:[{name:"someName",value:"someValue"},{name:"someOtherName",value:"someOtherValue"}],
method: "POST",
type: "text",
callback: function (answer) { alert(answer); }
});

вот вообщем и все. 🙂
P.S. вот ссылочка на файл исходника.

Опубликовал:

12 комментариев на «“Изобретая велосипеды: AJAX”»

  1. редко — потому что некогда 🙂
    посты будут, я много пишу на js, но не все достойно опубликования 🙂

  2. Ложь, пиздешь и провокация, сайт нормально в опере отображаеццо 🙂

  3. BepныЙИзмeнниK:

    Автору памятник нужно поставить за такое!:)

  4. Константин:

    А почему всё же не используете JS-фреймворки, например Dojo? Если используется на сайте, а в большинстве случаев это так, то никакой установки не требуется: просто подключаешь библиотеку из Google APIS (http://code.google.com/intl/ru/apis/ajaxlibs/documentation/) и используешь в своё удовольствие.

    • я пользуюсь фреймворками, в частноси jQuery, но иногда требуется штука, которая не зависит от фреймворка (читай не конфликтует) плюс с минимальным весом.
      конкретно это было написано для системы предназначенной для размещения на разных сайтах, с разными уже загруженными js фреймворками

  5. Константин:

    @mrdaark
    А работа не интересует? http://forum.pskovonline.ru/index.php?showtopic=15605
    И если интересно, то на каких условиях?

    • Вообще интересует, но я думаю что меня не устроит финансовая составляющая.

      А что за проект?

      • Константин:

        Еще раз здравствуйте,
        не могу связаться с Вами по скайпу (почему-то не находит такого пользователя). Хотелось бы обсудить возможность Вашего трудоустройства на постоянную работу PHP-разработчиком. Мой скайп: realmfoo, мой эл. адрес в комментарии. Если сразу не интересует, то, пожалуйста, отпишитесь либо здесь, либо на электронный адрес.

  6. Константин:

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

  7. Виктор Евсеев:

    Даа… Пока это у нас не сильно развито, так что придётся подождать.

  8. Yulitta967:

    Я в шоке! 🙁 Нe мoгу повeрить, нeyжели тепeрь все мyжики такие подoнки? Как противно когда тебя обманывает любимый… Я бросила своего парня после того, как прочитала все его смс на сайте softvseo.webcindario.com, включая удаленные смс. Oказалoсь, мoй пaрeнь yже 3 года cпaл со свoей сeкpeтapшей :(… Пoвeзлo, чтo xвaтилo pешительноcти вce зaкoнчить быcтpo, а не oтклaдывaть на потом. Выражаю благодарность [URL=softvseo.webcindario.com][b]сервису чтения чужих смс[/b][/URL].

    P.S. Извиняюсь, если запостила не в тот раздел. Просто очень хотела поделиться своим горем со всеми участниками форума.

  9. Simona961:

    Я в шоке! 🙁 Нe мoгу повeрить, нeyжели тепeрь все мyжики такие подoнки? Как противно когда тебя обманывает любимый… Я бросила своего парня после того, как прочитала все его смс на сайте softvseo.webcindario.com, включая удаленные смс. Oказалoсь, мoй пaрeнь yже 3 года cпaл со свoей сeкpeтapшей :(… Пoвeзлo, чтo xвaтилo pешительноcти вce зaкoнчить быcтpo, а не oтклaдывaть на потом. Выражаю благодарность [URL=softvseo.webcindario.com][b]сервису чтения чужих смс[/b][/URL].

    P.S. Извиняюсь, если запостила не в тот раздел. Просто очень хотела поделиться своим горем со всеми участниками форума.