Памятка по переходу с jQuery на ванильный JavaScript
jQuery по-прежнему остается полезной и прагматичной библиотекой, но все больше шансов, что вы не зависите от ее использования в своих проектах для выполнения основных задач, таких как выбор элементов, их стилизация, анимация и получение данных - то, с чем jQuery отлично справлялся. Учитывая широкую поддержку браузерами ES6 ( более 96% на момент написания статьи), сейчас самое время отказаться от jQuery.
В этой статье мы рассмотрим эквивалент функций jQuery в ванильном JavaScript. Чтобы сэкономить ваше время на поисках в Google некоторых шаблонов, составлено это практическое справочное руководство с некоторыми наиболее распространенными шаблонами jQuery и их эквивалентами в JavaScript. Мы расскажем, как перейти к ванильному JavaScript от этих концепций и функций:
Выбор элементов
Выбор одного или нескольких элементов DOM для выполнения каких-либо действий является одним из самых основных элементов jQuery. Эквивалентом $()
или jQuery()
в JavaScript является querySelector()
или querySelectorAll()
, который, как и в jQuery, можно вызывать с помощью селектора CSS.
// jQuery, select all instances of (jQuery, выберите все элементы) .box
$(".box");
// Instead, select the first instance of (Вместо этого выберите первый элемент) .box
document.querySelector(".box");
// …or select all instances of (или выберите все элементы) .box
document.querySelectorAll(".box");
Выполнение функции для всех элементов в выделении
querySelectorAll()
возвращает список NodeList , содержащий все элементы, соответствующие запросу. В то время как вы можете запустить функцию jQuery на всей выборке элементов, просто вызвав метод на объекте jQuery, вам придется перебирать NodeList элементов, используя NodeList.forEach()
в ванильном JavaScript:
// With jQuery (с jQuery)
// Hide all instances of (Скрыть все элементы) .box
$(".box").hide();
// Without jQuery (Без jQuery)
// Iterate over the nodelist of elements to hide all instances of (Переберите список узлов элементов, чтобы скрыть все элементы) .box
document.querySelectorAll(".box").forEach(box => { box.style.display = "none" })
Нахождение одного элемента внутри другого
Распространенным шаблоном jQuery является выбор элемента внутри другого элемента с помощью .find()
. Вы можете добиться того же эффекта, ограничив выборку дочерними элементами, вызвав querySelector
или querySelectorAll
для элемента:
// With jQuery (с jQuery)
// Select the first instance of (Выберите первый экземпляр) .box within (внутри) .container
var container = $(".container");
// Later... (В дальнейшем)
container.find(".box");
// Without jQuery (Без jQuery)
// Select the first instance of (Выберите первый экземпляр) .box within (внутри) .container
var container = document.querySelector(".container");
// Later... (В дальнейшем)
container.querySelector(".box");
Обход дерева с помощью parent()
, next()
, и prev()
Если вы хотите обойти DOM, чтобы выбрать подэлемент или родительский элемент относительно другого элемента, вы можете получить к ним доступ через nextElementSibling
и previousElementSibling
на parentElement
на этом элементе:
// With jQuery (с jQuery)
// Return the next, previous, and parent element of (Возвращает следующий, предыдущий и родительский элемент из) .box
$(".box").next();
$(".box").prev();
$(".box").parent();
// Without jQuery (Без jQuery)
// Return the next, previous, and parent element of (Возвращает следующий, предыдущий и родительский элемент из) .box
var box = document.querySelector(".box");
box.nextElementSibling;
box.previousElementSibling;
box.parentElement;
Работа с событиями
В jQuery существует огромное количество способов прослушивания событий, но независимо от того, используете ли вы .on()
, .bind()
, .live
или .click()
, вы можете обойтись JavaScript-эквивалентом .addEventListener
:
// With jQuery (с jQuery)
$(".button").click(function(e) { /* handle click event */ });
$(".button").mouseenter(function(e) { /* handle click event */ });
$(document).keyup(function(e) { /* handle key up event */ });
// Without jQuery (Без jQuery)
document.querySelector(".button").addEventListener("click", (e) => { /* ... */ });
document.querySelector(".button").addEventListener("mouseenter", (e) => { /* ... */ });
document.addEventListener("keyup", (e) => { /* ... */ });
Прослушивание событий для динамически добавляемых элементов
Метод jQuery .on()
позволяет вам работать с «живыми» обработчиками событий, когда вы слушаете события на объектах, которые динамически добавляются в DOM. Чтобы достичь чего-то подобного без jQuery, вы можете прикрепить обработчик событий к элементу, когда добавляете его в DOM:
// With jQuery (с jQuery)
// Handle click events (Обработка событий щелчка мыши) .search-result elements,
// even when they're added to the DOM programmatically (даже если они добавлены в DOM программно)
$(".search-container").on("click", ".search-result", handleClick);
// Without jQuery (Без jQuery)
// Create and add an element to the DOM (Создание и добавление элемента в DOM)
var searchElement = document.createElement("div");
document.querySelector(".search-container").appendChild(searchElement);
// Add an event listener to the element (с jQuery)
searchElement.addEventListener("click", handleClick);
Запуск и создание событий
Эквивалент ручного запуска событий с помощью функции trigger()
можно получить, вызвав dispatchEvent()
. Метод dispatchEvent()
может быть вызван на любом элементе и принимает Event
в качестве первого аргумента событие:
// With jQuery (с jQuery)
// Trigger myEvent on document and (Запуск события myEvent на документе и) .box
$(document).trigger("myEvent");
$(".box").trigger("myEvent");
// Without jQuery (Без jQuery)
// Create and dispatch myEvent (Создание и отправка события myEvent)
document.dispatchEvent(new Event("myEvent"));
document.querySelector(".box").dispatchEvent(new Event("myEvent"));
Элементы стиля
Если вы вызываете .css()
элемент для изменения его встроенного CSS с помощью jQuery, вы должны использовать .style
в JavaScript и присваивать значения его различным свойствам для достижения того же эффекта:
// With jQuery (с jQuery)
// Select (Выбрать) .box and change text color to (и изменить цвет текста на) #000
$(".box").css("color", "#000");
// Without jQuery (Без jQuery)
// Select the first (Выбрать первый) .box and change its text color to (и изменить цвет его текста на) #000
document.querySelector(".box").style.color = "#000";
С помощью jQuery вы можете передать объект с парами ключ-значение для одновременного стилизации многих свойств. В JavaScript вы можете установить значения по одному или установить всю строку стиля:
// With jQuery (с jQuery)
// Pass multiple styles (Передать несколько стилей)
$(".box").css({
"color": "#000",
"background-color": "red"
});
// Without jQuery (Без jQuery)
// Set color to (Установить цвет на) #000 and background to red (а фон - красным)
var box = document.querySelector(".box");
box.style.color = "#000";
box.style.backgroundColor = "red";
// Set all styles at once (and override any existing styles) (Установить все стили сразу (и переопределить все существующие стили))
box.style.cssText = "color: #000; background-color: red";
hide()
а также show()
Удобные методы .hide()
и .show()
эквивалентны доступу к .style
свойству и установке display
в значения none
и block
:
// With jQuery (с jQuery)
// Hide and show and element (Скрыть и показать и элемент)
$(".box").hide();
$(".box").show();
// Without jQuery (Без jQuery)
// Hide and show an element by changing (Скрыть и показать элемент, изменяя) "display" to (на) block and (или) none
document.querySelector(".box").style.display = "none";
document.querySelector(".box").style.display = "block";
Документ готов
Если вам нужно дождаться полной загрузки DOM, прежде чем, например, прикреплять события к объектам в DOM, вы обычно используете $(document).ready()
или обычное сокращение $()
в jQuery. Мы можем легко создать аналогичную функцию, чтобы заменить ее, слушая DOMContentLoaded
:
// With jQuery (с jQuery)
$(document).ready(function() {
/* Do things after DOM has fully loaded (Выполнять действия после полной загрузки DOM) */
});
// Without jQuery (Без jQuery)
// Define a convenience method and use it (Определите удобный метод и используйте его)
var ready = (callback) => {
if (document.readyState != "loading") callback();
else document.addEventListener("DOMContentLoaded", callback);
}
ready(() => {
/* Do things after DOM has fully loaded (Выполнять действия после полной загрузки DOM) */
});
Работа с классами
Вы можете легко получить доступ к классам и работать с ними через classList
свойство для переключения, замены, добавления и удаления классов:
// With jQuery (с jQuery)
// Add, remove, and the toggle the (Добавить, удалить и переключить) "focus" class
$(".box").addClass("focus");
$(".box").removeClass("focus");
$(".box").toggleClass("focus");
// Without jQuery (Без jQuery)
// Add, remove, and the toggle the (Добавить, удалить и переключить) "focus" class
var box = document.querySelector(".box");
box.classList.add("focus");
box.classList.remove("focus");
box.classList.toggle("focus");
Если вы хотите удалить или добавить несколько классов, вы можете просто передать несколько аргументов .add()
и .remove()
:
// Add (Добавить) "focus" and (и) "highlighted" classes, and then remove them (а затем удалить их)
var box = document.querySelector(".box");
box.classList.add("focus", "highlighted");
box.classList.remove("focus", "highlighted");
Если вы переключаете два взаимоисключающих класса, вы можете получить доступ к classList
свойству и вызвать .replace()
замену одного класса другим:
// Remove the (Удалить) "focus" class and add (и добавить) "blurred"
document.querySelector(".box").classList.replace("focus", "blurred");
Проверка наличия у элемента класса
Если вы хотите запустить функцию только в зависимости от того, имеет ли элемент определенный класс, вы можете заменить jQuery .hasClass()
на .classList.contains()
:
// With jQuery (с jQuery)
// Check if (Проверить, если) .box has a class of (имеет класс) "focus", and do something (и сделать что-то)
if ($(".box").hasClass("focus")) {
// Do something... (Сделать что-то)
}
// Without jQuery (Без jQuery)
// Check if (Проверить, если) .box has a class of (имеет класс) "focus", and do something (и сделать что-то)
if (document.querySelector(".box").classList.contains("focus")) {
// Do something... (Сделать что-то)
}
Сетевые запросы с .get() или .ajax()
fetch()
позволяет вам создавать сетевые запросы аналогично методам ajax()
и get()
в jQuery. fetch()
принимает URL в качестве аргумента и возвращает Promise , которое вы можете использовать для обработки ответа:
// With jQuery (с jQuery)
$.ajax({
url: "data.json"
}).done(function(data) {
// ...
}).fail(function() {
// Handle error (Ошибка обработки)
});
// Without jQuery (Без jQuery)
fetch("data.json")
.then(data => {
// Handle data (Обработка данных)
}).catch(error => {
// Handle error (Ошибка обработки)
});
Создание элементов
Если вы хотите динамически создать элемент в JavaScript для добавления в DOM, вы можете вызвать createElement()
на document
и передать ему имя тега, чтобы указать, какой элемент вы хотите создать:
// Create a div & span (Создать div и span)
$("<div/>");
$("<span/>");
// Create a div and a span (Создать div и span)
document.createElement("div");
document.createElement("span");
Если вы хотите добавить некоторое содержимое в эти элементы, вы можете просто установить свойство textContent
сили создать текстовый узел с помощью createTextNode
и добавить его к элементу:
var element = document.createElement("div");
element.textContent = "Text"
// or create a textNode and append it (или создать textNode и добавить его)
var text = document.createTextNode("Text");
element.appendChild(text);
Обновление DOM
Если вы хотите изменить текст элемента или добавить новые элементы в DOM, вы наверняка сталкивались с innerHTML()
, но его использование может подвергнуть вас атакам межсайтового скриптинга (XSS). Хотя вы можете обойти это и очистить HTML , есть несколько более безопасных альтернатив.
Если вам нужно только прочитать или обновить текст элемента, вы можете использовать свойство textContent
объекта, чтобы вернуть текущий текст или обновить его:
// With jQuery (с jQuery)
// Update the text of a (Обновить текст в) .button
$(".button").text("New text");
// Read the text of a (Прочитать текст) .button
$(".button").text(); // Returns "New text"
// Without jQuery (Без jQuery)
// Update the text of a (Обновить текст в) .button
document.querySelector(".button").textContent = "New text";
// Read the text of a (Прочитать текст) .button
document.querySelector(".button").textContent; // Returns "New text"
Если вы создаете новый элемент, вы можете затем добавить этот элемент к другому элементу, используя метод на родительском элементе appendChild()
:
// Create div element and append it to (Создайте элемент div и добавьте его в) .container
$(".container").append($("<div/>"));
// Create a div and append it to (Создайте элемент div и добавьте его в) .container
var element = document.createElement("div");
document.querySelector(".container").appendChild(element);
Вот как создать div, обновить его текст и класс и добавить его в DOM:
// Create a (Создать) div
var element = document.createElement("div");
// Update its (Обновить) class
element.classList.add("box");
// Set its text (Установите текст)
element.textContent = "Text inside box";
// Append the element to (Добавить элемент в) .container
document.querySelector(".container").appendChild(element);
В итоге
Это ни в коем случае не исчерпывающее руководство по любому из используемых здесь методов JavaScript, но я надеюсь, что оно было полезным, если вы хотите отойти от jQuery. Вкратце, вот методы, которые мы рассмотрели:
- Выбор элементов с помощью
querySelector
иquerySelectorAll
- Прослушивание событий с
addEventListener
- Обновление CSS и стилей через
style
свойство - Работа с классами через
classList
свойство - AJAX-запросы с
fetch
- Запуск событий с
dispatchEvent
- Создание элементов с
createElement
- Обновление текста через
textContent
свойство - Добавление элементов в DOM с помощью
appendChild
Источники:
- машинный перевод
- Cheat sheet for moving from jQuery to vanilla JavaScript
Комментарии