Javascript-форум (https://javascript.ru/forum/)
-   Ваши сайты и скрипты (https://javascript.ru/forum/project/)
-   -   Fast-AJAX - быстрая библа для аякса (https://javascript.ru/forum/project/56484-fast-ajax-bystraya-bibla-dlya-ayaksa.html)

KosBeg 18.06.2015 13:43

Fast-AJAX - быстрая библа для аякса
 
Всем привет!
Говорю сразу - мне пофиг нужна ли она кому-то или нет, я писал ее для себя :yes:
Кому нужно - тот возьмет :D
Я прошу вас проветить КАЧЕСТВО КОДА и исправить вожможные проблемы ;)
(function() {
'use strict';

var fast_ajax, xhr, setheader;

fast_ajax = function(opt) {

  // Стандартные настройки
  opt.url !== undefined ? opt.url = opt.url : opt.type = location.href;
  opt.type !== undefined ? opt.type = opt.type.toUpperCase() : opt.type = 'GET';
  opt.data = typeof opt.data === 'object' ? opt.data : null;
  opt.timeout = typeof opt.timeout === 'number' ? opt.timeout : 0;
  opt.async = opt.async !== false ? true : false;
  
  // Настройки-Колбеки
  opt.ontimeout = typeof opt.ontimeout === 'function' ? opt.ontimeout : function(data) { alert(data) };
  opt.success = typeof opt.success === 'function' ? opt.success : function(data) { alert(data) };
  opt.onerror = typeof opt.onerror === 'function' ? opt.onerror : function(data) { alert(data) };
  
  xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
  
  // Хедеры которые ставятся
  setheader = function() {
    xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');
    xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
    xhr.setRequestHeader('AJAX-Engine', 'Fast-AJAX');  
  };

  // В зависимости от запроса подставляем opt.data в get параметры (page.php?_param=data), или POST
  switch (opt.type) {
    case 'GET':
      xhr.open('GET', opt.url + "?" + fast_ajax.toQueryString(opt.data), opt.async);
      setheader();
      xhr.send(null);
    break;
    default:
      xhr.open(opt.type, opt.url, opt.async);
      setheader();
      xhr.send(fast_ajax.toQueryString(opt.data));
  };

  // если все хорошо =)
  xhr.onreadystatechange = function() {
    if(xhr.readyState != 4) return;
      if (xhr.status >= 200 && xhr.status < 400) {
        opt.success(xhr.responseText);
      } else {
        console.error( 'ERROR: ' + (xhr.status ? xhr.statusText : 'the request fails') );
        return;
      };
  };

  // ошибка =(
  xhr.onerror = function(e) {
    opt.onerror(e);
  };
};

// здесь будут хранится все доп. методы, PS: сокращение pl = plugin
fast_ajax.pl = fast_ajax.prototype = {};

// превращение такого {_ajax: 'kosbeg', param: 'data'} в такое _ajax=kosbeger&param=data
fast_ajax.toQueryString = fast_ajax.pl.toQueryString = function(data) {
  var query = '', i,
  push = function (key, value) {
    query += encodeURIComponent(key) + '=' + encodeURIComponent(value) + '&';
  }, key, value;
    
  for (key in data) {
	if (!Object.hasOwnProperty.call(data, key)) {
      continue;
    }	

    value = data[key];

    if ((typeof (data) === "object") && (data instanceof Array)) {
      for (i = 0; i < value.length; i++) {
        push(key, value[i]);
      };
    } else {
      push(key, data[key]);
    };
  };
  
  return query.replace(/&$/, '').replace(/%20/g, '+');
};

// кросраузерный парсинг JSON, по возможности используется нативный
fast_ajax.parseJSON = fast_ajax.pl.parseJSON = function(data) {
  if (typeof (data) !== "string" || !data || data === '') {
    return null;
  }

  data = data.replace(/^\s+/, '');
  data = data.replace(/\s+$/, '');			
    
  if (window.JSON && window.JSON.parse) {
    return window.JSON.parse(data);
  }
    
  var checkChars = /^[\],:{}\s]*$/,
  checkEscape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
  checkTokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
  checkBraces = /(?:^|:|,)(?:\s*\[)+/g;				
    
  if (checkChars.test(data.replace(checkEscape, "@").replace(checkTokens, "]").replace(checkBraces, ""))) {
    return (new Function( "return " + data ))();
  }
};

 // выносим переменную за границы замыкания
  window.fast_ajax = window.$a = fast_ajax;
})();

// запрос на Fast-AJAX
$a({
  url: 'ajax.php',
  type: 'pOsT',
  data:  {_ajax: 'kosbeg', param: 'data'},
  success: function(data){
    data = $a.parseJSON(data);
	document.querySelector('#content_pure').innerHTML = data.page;
  }
});

// запрос на jQuery
$.ajax({
  url: 'ajax.php',
  type: 'pOsT',
  data: {_ajax: 'kosbeg', param: 'data'},
  success: function(data){
    data = $.parseJSON(data);
	$("#content_jq").text(data.page);
  }
});


PS: это только заготовка кода =)
Я сюда еще добавлю кросдоменный аякс, кеширование при помощи Mozilla LocalForage, и нормальный таймаут 8)

nerv_ 18.06.2015 14:14

Цитата:

Сообщение от KosBeg
Я прошу вас проветить КАЧЕСТВО КОДА

Мои глаза :D

Цитата:

Сообщение от KosBeg
быстрая библа для аякса

чем быстрая то?)

рони 18.06.2015 14:15

Цитата:

Сообщение от KosBeg
type: 'pOsT',

это специально для
Цитата:

Сообщение от KosBeg
opt.type.toUpperCase()

?
:)

kobezzza 18.06.2015 14:15

fetch api

nerv_ 18.06.2015 14:16

Цитата:

Сообщение от kobezzza
fetch api

чё ты делаешь? Это кульминация была, до которой можно было 2-3 страницы срача написать :D

KosBeg 18.06.2015 14:18

Цитата:

Сообщение от nerv_
чем быстрая то?)

не спрашивай, главное что на чистом JS, а не на jQuery :write:
Цитата:

Сообщение от nerv_
Мои глаза :D

Мои тоже :D
Цитата:

Сообщение от рони
type: 'pOsT',
это специально для
opt.type.toUpperCase()

да! просто бывает что я пишу 'post' вместо 'POST'...
Цитата:

Сообщение от kobezzza
fetch api

мне не нрава!..
jQuery.AJAX API самое то для меня :yes:

KosBeg 18.06.2015 14:20

Так, ребята, у Вас сразу шутки(как всегда :haha:)
А у меня конкретный вопрос ;)

nerv_ 18.06.2015 14:23

Цитата:

Сообщение от KosBeg
jQuery.AJAX API самое то для меня

знаешь ли ты что, твой код не реализует jQuery.AJAX API? :)

KosBeg 18.06.2015 14:26

Цитата:

Сообщение от nerv_
знаешь ли ты что, твой код не реализует jQuery.AJAX API? :)

а я и не знал :lol:
в jQuery.AJAX API есть Deferred/Promise
я в курсе, но для меня это самое то!
Вопрос - как его еще улучшить?)

nerv_ 18.06.2015 14:31

Цитата:

Сообщение от KosBeg
Вопрос - как его еше улучшить?)

еще? разве
Цитата:

Сообщение от nerv_ (Сообщение 375604)
Мои глаза :D

не достаточно?)

Научи json отправлять :)


Часовой пояс GMT +3, время: 01:42.