Как избежать jQuery, когда нужен ajax?

171
03 мая 2018, 07:23

Мне не нравится использовать jQuery. (Сугубо эстетические мотивы и мой перфекционизм заставляют меня избегать фреймворков и писать на чистом языке).

Но, сами понимаете, - писать ajax на без jQuery - ещё хуже. Там очень много буков, в которых нужно разобраться. Есть ли способ подключить к своему скрипту только ajax из jQuery? Может кто-то где то вырезал эту часть jQuery?

Если такого нигде нет, не могли бы вы подсказать какие нибудь уроки/статьи/курсы, в которых можно понять - как писать ajax на чистом js. Спасибо.

Answer 1

В первую очередь нужно научиться сериализовывать данные.
Ниже приведена упрощённая реализация, не поддерживающая многократно вложенные данные.
Лучше всего взять готовую реализацию, например, $.param из того же jQuery

Далее воспроизводим обычный сниппет ajax вызова. Обработка результатов может быть разной, тут я использовал стандартный для nodejs callback-style, с сигнатурой function next(error, result).

function ajaxPost(uri, data, next) { 
  function serialize(data) { 
    var parts = []; 
    for (var k in data) { 
      if (Array.isArray(data[k])) { 
        parts.push(encodeURIComponent(k) + '[]=' + encodeURIComponent(data[k])) 
      } else if (typeof data[k] === 'object') { 
        for (var objk in data[k]) parts.push(encodeURIComponent(k + '[' + objk + ']') + '=' + encodeURIComponent(data[k][objk])) 
 
      } else { 
        parts.push(encodeURIComponent(k) + '=' + encodeURIComponent(data[k])) 
      } 
    } 
    return parts.join('&'); 
  } 
  // Далее стандартный сниппет: 
  var xhr = new XMLHttpRequest(); 
  xhr.onreadystatechange = function() { 
    if (xhr.readyState == 4) { 
      if (xhr.status === 200) { 
        next(null, xhr.responseText); 
      } else { 
        next(xhr.responseText); 
      } 
    } 
  } 
  xhr.open("POST", uri, true); 
  xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
  xhr.send(serialize(data)); 
} 
 
ajaxPost('https://httpbin.org/post', { 
  max: 5, 
  min: 2, 
  list: [1, 2, 5], 
  obj: {a: 'some', b: 42} 
}, function(err, res) { 
  if (err) return console.error(err); 
  console.log(res); 
})

Если вы не ограничены поддержкой старых браузеров, рекомендую всё же использовать новый синтаксис fetch.
Сериализация всё ещё остаётся на вашей совести, в данном примере я демонстрирую json:

fetch('https://httpbin.org/post', { 
  method: 'post', 
  headers: { 
    'Accept': 'application/json, text/plain, */*', 
    'Content-Type': 'application/json' 
  }, 
  body: JSON.stringify({a: 7, str: 'Some string: &=&'}) 
}).then(res => res.json()) 
  .then(res => console.log(res));

Answer 2

Разобрался таки в ajax без jQuery (немного). Для своих целей сделал такую функцию:

var ajax = function (requestObject) {
        request = new XMLHttpRequest();
        request.onreadystatechange = function () {
            if (request.readyState == 4 && request.status == 200) {
                requestObject.success(request.responseText);
            }
        }
        request.open("POST", requestObject.direction, true);
        request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
        data = "min=" + requestObject.min + "&max=" + requestObject.max;
        request.send(data);
    }

И вызов:

button.onclick = function () {
            ajax({
                direction: "num.php",
                min: document.querySelector("#min").value,
                max: document.querySelector("#max").value,
                success: function (data) {
                    document.querySelector("#res").innerHTML = data;
                }
            });         
        }

Чем то напоминает функцию jQuery, но эта только для моих целей, совсем не гибкая. Если поработать над ней, то можно сделать универсальную функцию, которую можно будет использовать где угодно. (А мне пока этого зватит)

READ ALSO
Нужна помощь по одному инструменту [требует правки]

Нужна помощь по одному инструменту [требует правки]

Всем привет, нужна ваше помочи возможно как то скопировать движок этого Инструмента либо если есть у кого нибудь идеи как можно сделать?...

203
Очистка формы html после submit с помощью ajax

Очистка формы html после submit с помощью ajax

У меня есть обычная html форма, которая проходит валидацию на frontend и на backendНа frontend валидация осуществляется при помощи плагина jQuery validate, а на backend...

341
javascript вызов функции до загрузки функции

javascript вызов функции до загрузки функции

подскажите пожалуйста, голова не варит:

214