Июль 12, 2021
Теги: JavaScript
Полезные примеры, если вы не хотите использовать JS библиотеки и просто удобные готовые решения простых задач.
Инициализация переменной если она не задана:
Цикл по элементам и применение обработчика нажатия:
То же самое, но выполнение обработчика только один раз (аналог jquery one)
То же самое, только поиск внутри какого-то объекта (":scope" обязателен, иначе контекст не будет учитываться):
Вариант для постоянной привязки обработчика в аякс-контейнере:
Аналог jquery-функции parents, возвращает ближайший родительский элемент или сам элемент:
Аналог jquery-функции "ready":
Пример функции ajax-запроса (первый параметр - action, второй - объект параметров запроса, третий - callback-функция с параметром data, в котором содержится разобранный из json объект):
GrainMessenger.prototype.query = function(action,params,callback) {
var _this = this;
var formData = new FormData();
formData.append('action', action);
for(var key in params)
formData.append(key, params[key]);
const request = new XMLHttpRequest();
request.responseType = "json";
request.open("POST", this.ajaxUrl, true);
//request.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); // do not use with FormData
request.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
request.addEventListener("readystatechange", function() {
if(request.readyState !== 4)
return;
if (request.status === 200) {
let data = request.response;
callback.call(_this,data);
} else {
console.log('ajax request error');
}
});
request.send(formData);
}
Несколько более продвинутый вариант функции отправки ajax запроса:
let post = function(post,success,fail,always) {
if(post instanceof FormData) {
var formData = post;
} else {
var formData = new FormData();
for(var key in post)
formData.append(key, post[key]);
}
const request = new XMLHttpRequest();
request.responseType = 'json';
request.open('POST', '/ajax.php', true);
request.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
request.addEventListener("readystatechange", function() {
if(request.readyState !== 4)
return;
if(always)
always.call(this);
if (request.status === 200) {
let data = request.response;
if(typeof data.errors !== 'undefined' && data.errors.length>0 && fail)
fail.call(this,data.errors);
else if(success)
success.call(this,data);
} else {
if(fail)
fail.call(this,['Error '+request.status+', see console']);
console.log('ajax request error',formData,request);
}
}.bind(this));
request.send(formData);
};
Аналог $.proxy(functionName,object) - вызов функции с определенной переменной this:
Плавный скроллинг к элементу: