Аналогии с jQuery на чистом JavaScript
содержание
- Выбор элементов с querySelector и querySelectorAll
- Прослушиваем события с помощью addEventListener
- Обновляем CSS и стили через свойство style
- Работаем с классами, через свойство classList
- AJAX запросы с fetch
- Вызываем события с помощью dispatchEvent
- Создаем элементы с createElement
- Обновляем текст с помощью свойства textContent
- Добавляем элементы в DOM с appendChild
jQuery является полезной и довольно практичной библиотекой, но не обязательно быть зависимыми от её применения в ваших проектах, для того, чтобы сделать простые задачи, такие как выборка элементов, их стилизация, анимация и получение данных от сервера.
Выборка элементов
Выборка одного или нескольких элементов DOM для каких-либо манипуляций с ними это одна из самых простых функций jQuery. Эквивалентом $() или jQuery() в JavaScript являются querySelector() или querySelectorAll()
, в которых вы можете задавать параметры как и в jQuery — с помощью CSS селектора.
// Выбираем все элементы .box
$(".box");
// Вместо этого, мы можем выбрать первый элемент с .box
document.querySelector(".box");
// …или же выбрать все элементы .box
document.querySelectorAll(".box");
Запускаем функцию на всех элементах выборки
querySelectorAll() отдаёт, как и jQuery, массив элементов, с которым вы уже в последствии можете работать. Но там, где вам нужно просто запустить функцию с jQuery на всей выборке, просто вызвав её, на чистом JavaScript вам нужно будет пройтись по всему массиву элементов:
// C jQuery
// Скрываем все .box
$(".box").hide();
// Без jQuery
// Проходимся по всему массиву элементов, чтобы скрыть все элементы с .box
document.querySelectorAll(".box").forEach(box => { box.style.display = "none" }
Находим элемент внутри элемента
Обычно в jQuery это делается с помощью find(). Вы можете достичь такого же эффекта, сузив выборку до потомков элемента, просто вызвав querySelector или querySelectorAll на самом элементе:
// С jQuery
// Выбираем первый .box в .container
var container = $(".container");
// И потом...
container.find(".box");
// Без jQuery
// Выбираем первый .box в .container
var container = document.querySelector(".container");// И потом...
container.querySelector(".box");
Выбираем элементы в DOM-дереве с помощью parent(), next() и prev()
Если вы хотите пройтись по DOM-дереву для выборки родственных или родительских элементов, относительно какого-либо элемента, то вы можете это сделать с помощью методов nextElementSibling, previousElemenSibling и parentElemnt. Которые вам нужно применить на интересующем вас элементе:
// jQuery
// Отдаст следующий, предыдущий и родительский элемент для .box
$(".box").next();
$(".box").prev();
$(".box").parent();
// Без jQuery
// Отдаст следующий, предыдущий и родительский элемент для .box
var box = document.querySelector(".box");
box.nextElementSibling;
box.previousElementSibling;
box.parentElement;
Работа с событиями
В jQuery есть огромное множество способов для того, чтобы слушать события, вместо on(), bind(), live() или click(), вы могли бы сделать всё тоже самое с помощью их эквивалента addEventListener:
// С jQuery
$(".button").click(function(e) { /* handle click event */ });
$(".button").mouseenter(function(e) { /* handle click event */ });
$(document).keyup(function(e) { /* handle key up event */ });
// Без jQuery
document.querySelector(".button").addEventListener("click", (e) => { /* ... */ });
document.querySelector(".button").addEventListener("mouseenter", (e) => { /* ... */ });
document.addEventListener("keyup", (e) => { /* ... */ });
Слушаем события на динамически добавленных элементах
С помощью jQuery метода on(), вы можете работать с элементами “на живца”, слушая ещё и те, которые были динамически добавлены в структуру DOM. Чтобы сделать что-то подобное без jQuery, вы можете прикрепить обработчик события к элементу, как только вы добавите его в структуру DOM:
// С jQuery
// Обработка событий по клику на .search-result элементы,
// даже когда они динамически добавляются в DOM
$(".search-container").on("click", ".search-result", handleClick);
// Без jQuery
// Создаём элемент в структуре DOM
var searchElement = document.createElement("div");
document.querySelector(".search-container").appendChild(searchElement);// Слушаем событие на элементе
searchElement.addEventListener("click", handleClick);
Вызываем и создаем события
Вы можете вручную вызывать события с помощью trigger() в jQuery,
а также в чистом JS при помощи dispatchEvent().
Метод dispatchEvent() может быть вызван совершенно на
любом элементе и берёт Event, как первый аргумент:
// C jQuery
// Вызываем myEvent на документе и .box
$(document).trigger("myEvent");
$(".box").trigger("myEvent");
// Без jQuery
// Создаем и запускаем myEvent
document.dispatchEvent(new Event("myEvent"));
document.querySelector(".box").dispatchEvent(new Event("myEvent"));
Стилизация элементов
Если вы вызываете css() на элементе, чтобы поменять его
CSS инлайново с помощью jQuery,
то этого же эффекта вы можете добиться с помощью .style
в чистом JavaScript.
// С jQuery
// Выбирает .box и меняет его цвет текста на #000
$(".box").css("color", "#000");
// Без jQuery
// Выбирает первый .box и меняет его цвет текста на #000
document.querySelector(".box").style.color = "#000";
С jQuery вы можете передать объект с парами ключ-значения, чтобы стилизовать уже большое количество свойств за раз.
В JavaScript вы можете выставить только одно значение за раз или указать вcе стили одной строкой:
// С jQuery
// Передаем несколько стилей
$(".box").css({
"color": "#000",
"background-color": "red"
});
// Без jQuery
// Выставляем цвет на #000 и делаем фон красным
var box = document.querySelector(".box");
box.style.color = "#000";
box.style.backgroundColor = "red";
// Выставляем все стили разом, но перезаписываем уже существующие
box.style.cssText = "color: #000; background-color: red";
методы hide() и show()
Все удобства методов hide() и show()
можно получить через свойство .style, выставив display на none или block:
// C jQuery
// Спрятать и показать элемент
$(".box").hide();
$(".box").show();
// Без jQuery
// Прячем и показываем элемент, изменяя display на block или none
document.querySelector(".box").style.display = "none";
document.querySelector(".box").style.display = "block";
Document ready
Если вам нужно подождать полной загрузки DOM,
перед, к примеру, развешиванием ивентов на объекты в структуре документа,
то в jQuery вы бы использовали $(document).ready()
или его сокращение $().
Но на самом деле мы можем легко и просто сами создать похожую функцию,
в которой будем слушать событие DOMContentLoaded:
// C jQuery
$(document).ready(function() {
/* Начинаем работу после полной загрузки DOM */
});
// Без jQuery
// Пишем схожий метод и смело начинаем его использовать
var ready = (callback) => {
if (document.readyState != "loading") callback();
else document.addEventListener("DOMContentLoaded", callback);
}
ready(() => {
/* Начинаем работу после полной загрузки DOM */
});
Работа с классами
работать с классами можно через свойство classList,
в котором есть возможности для переключения, замены,
добавления и удаления классов любого элемента DOM.
// C jQuery
// Добавляем, удаляем и переключаем класс focus
$(".box").addClass("focus");
$(".box").removeClass("focus");
$(".box").toggleClass("focus");
// Без jQuery
// Добавляем, удаляем и переключаем класс focus
var box = document.querySelector(".box");
box.classList.add("focus");
box.classList.remove("focus");
box.classList.toggle("focus");
Если необходимо удалить или добавить несколько классов,
то можно просто передать несколько аргументов в add() и remove():
// Добавляем "focus" и "highlighted" классы, а затем удаляем ихvar box = document.querySelector(".box");
box.classList.add("focus", "highlighted");
box.classList.remove("focus", "highlighted");
Если вам надо поменять два класса, которые взаимозаменяют друг друга,
то вы можете вызывать replace() на classList и заменить
один класс другим:
// Удаляем класс "focus" и добавляем "blurred"
document.querySelector(".box").classList.replace("focus", "blurred");
Проверяем есть ли класс у элемента
Если вы хотите запустить функцию на элементе только в том случае,
если у него есть определенный класс,
то вы можете заменить hasClass() на classList.contains():
// С jQuery
// Проверяем есть ли у .box класс focus и потом запускаем на нем функцию
if ($(".box").hasClass("focus")) {
// Понеслась...
}
// Без jQuery
// Проверяем есть ли у .box класс focus и потом запускаем на нем функцию
if (document.querySelector(".box").classList.contains("focus")) {
// Понеслась...
}
Сетевые запросы с get() или ajax()
Метод fetch() позволяет вам создавать сетевые
запросы схожим образом с ajax() и get()
методами от jQuery. fetch() берёт ссылку,
как аргумент и отдаёт промис, который вы уже можете
использовать для обработки данных.
// С jQuery
$.ajax({
url: "data.json"
}).done(function(data) {
// ...
}).fail(function() {
// Handle error
});
// Без jQuery
fetch("data.json")
.then(data => {
// Handle data
}).catch(error => {
// Handle error
});
Создание элементов
Если вы хотите динамически создать элемент в JavaScript,
чтобы добавить его в DOM, то вы можете
вызывать createElement() на document и передать
ему имя тега, как аргумент, чтобы указать
какой именно элемент вы хотите создать:
// Создаем div и span
$("");
$("");
// Создаем div и span
document.createElement("div");
document.createElement("span");
Что бы добавить какой-либо контент этим элементам,
надо просто использовать свойство textContent
или создать текстовой узел с помощью createTextNode и
добавить его созданному элементу:
var element = document.createElement("div");
element.textContent = "Text"
// или создайте textNode и добавьте его элементу
var text = document.createTextNode("Text");
element.appendChild(text);
Обновление DOM
Если вам нужно изменить текст элемента или
добавить новые элементы в DOM, то скорее всего
вы будете использовать innerHTML,
но его использование довольно рисковое дело,
связанное с XSS атаками.
Что бы только “прочесть” или обновить текст элемента,
можно применить свойство textContent на нужном объекте:
// C jQuery
// Меняем текст в .button
$(".button").text("New text");// Считываем текст в .button
$(".button").text(); // Отдаёт"New text"
// Без jQuery
// Меняем текст в .button
document.querySelector(".button").textContent = "New text";// Считываем текст в .button
document.querySelector(".button").textContent; // Отдаёт"New text"
Для того , что бы дгбавить другому элементу созданый вновь элемент,
используем на родительском элементе метод appendChild():
// Создаём div и вставляем его в .container
$(".container").append($(""));
// Создаём div и вставляем его в .container
var element = document.createElement("div");
document.querySelector(".container").appendChild(element);
А теперь всё вместе, как мы можем обновить текст и класс и добавить это всё в DOM:
// Создаём div
var element = document.createElement("div");
// Добавляем ему класс
element.classList.add("box");
// Указываем текст
element.textContent = "Text inside box";
// Вставляем его в .container
document.querySelector(".container").appendChild(element);
Этот блог бесплатный, в нём нет рекламы и ограничений paywall.
Вы можете его поддержать через Яндекс.Деньги. Спасибо.