JavaScript без jQuery: 10 советов
jQuery – отличная библиотека! Она пришла к нам в те времена, когда браузер IE6 был браузером номер один. В те времена было много сложностей и препятствий при работе с браузерами, что делало работу более чем утомительной. В такой ситуации библиотека jQuery была отличным инструментом чтобы добиться кроссбраузерности сайта.
С тех пор браузеры ушли далеко вперёд, что определённо развязывает нам руки при написании кода. Мы можем комфортно использовать все преимущества предоставляемые ES5, а так же в нашем арсенале есть наикрутейший HTML5 APIs, который значительно упрощает работу с DOM.
Разработчики сейчас находятся в ситуации, когда они могут выбирать, использовать ли им библиотеку jQuery, или же они могут вполне обойтись и без неё, не потеряв при этом в функциональности и производительности.
Не поймите меня неправильно – jQuery по прежнему остаётся отличной библиотекой, и в большинстве случаев вам действительно нужно будет использовать её. Тем не менее, для каких-то простых и маленьких вещей, вроде простой страницы с ограниченным JavaScript-взаимодействием, расширения для браузеров или мобильных сайтов, вы можете использовать чистый JS.
В этой статье будут описаны 10 советов, которые помогут вам в ваших стремлениях.
1. Ожидание готовности документа (Document Ready)
Правило номер 1: когда вы пишете код на jQuery, возьмите себе в привычку оборачивать его в $(document).ready(). Так вы всегда будете уверены что ваш документ и его DOM-структура полностью готовы для дальнейших манипуляций.
— Регулярная проверка качества ссылок по более чем 100 показателям и ежедневный пересчет показателей качества проекта.
— Все известные форматы ссылок: арендные ссылки, вечные ссылки, публикации (упоминания, мнения, отзывы, статьи, пресс-релизы).
— SeoHammer покажет, где рост или падение, а также запросы, на которые нужно обратить внимание.
SeoHammer еще предоставляет технологию Буст, она ускоряет продвижение в десятки раз, а первые результаты появляются уже в течение первых 7 дней. Зарегистрироваться и Начать продвижение
Без jQuery, вместо $(document).ready() можем использовать document.addEventListener('DOMContentLoaded'). Вот как это выглядит:
JS
// Создаём обработчик события DOMContentLoaded готовности всего // документа и вызываем анонимную функцию. // Затем вы можете обернуть весь ваш код в этой функции, заключив // его в фигурные скобки. Как только загрузка страницы завершится, // этот код сработает. document.addEventListener('DOMContentLoaded', function () { // Приветствие нашего гавайского человечка срабатывает сразу же после загрузки страницы console.log('Aloha'); });
2. Выборка элементов
Раньше для выборки элементов мы могли полагаться лишь на id , class и имена тегов и jQuery для нас с вами был чем-то вроде спасателя, так как позволял осуществлять сложные выборки по селекторам CSS. С тех пор браузеры поймали эту фишку и ввели два важнейших API-метода - querySelector и querySelectorAll:
JS
// Мы можем использовать метод document.querySelector // чтобы получить самый первый элемент, который в точности // удовлетворяет указанным нами условиям // Аргумент является по сути строкой, содержащей один // или более CSS-селекторов var lochNess = document.querySelector(".monsters"); console.log("It's from Scotland - " + lochNess.textContent); // Мы также имеем возможность выбрать все элементы определённого // типа или класса используя document.querySelectorAll // Результатом будет возвращённый список узлов документа, которые // соответствуют заданными нами параметрам var scary = document.querySelectorAll(".monsters"); console.log("Hide and seek champions: "); for (var i = 0; i < scary.length; i++) { console.log(scary[i].innerHTML); }
HTML
<ul> <li class="monsters">Nessy</li> <li class="monsters">Big foot</li> <li class="monsters">La chupacabra</li> </ul>
3. Добавление и удаление отслеживания событий
Отслеживание событий – это фундаментальная вещь при создании любых веб-приложений. Раньше существовало два основных лагеря, которые подходили к вопросу отслеживания событий по-разному: это IE и все остальные. Однако сегодня мы просто используем addEventListener:
JS
var btn = document.querySelectorAll("button"), list = document.querySelector("ul"); // Мы вызываем метод addEventListener по отношению // к нашей цели (в данном случае это кнопка) // Отслеживание событий запустится как только будет // осуществлён клик по кнопке btn[0].addEventListener("click", function () { // Когда клик по кнопке был осуществлён, мы хотим сделать // доступным увеличение нашего списка // Для этого мы добавим отслеживание события hover // по списку. // Как только курсор будет наведён на список, будет вызвана // функция увеличения enlarge list.addEventListener("mouseover", enlarge); }); // Для отключения зума, мы можем просто использовать // removeEventListener для удаления отслеживания события btn[1].addEventListener("click", function () { // Удаление отслеживания события не работает на // анонимных функциях. Поэтому используйте именованные // функции list.removeEventListener("mouseover", enlarge); }); // Давайте создадим нашу увеличивающую функцию enlarge var enlarge = function () { // Добавляем класс увеличения к ненумерованному списку list.classList.add("zoomed"); // Когда курсор выходит за рамки списка, возвращаем // нормальный размер, удаляя класс list.addEventListener("mouseout", function () { list.classList.remove("zoomed") }); }; // Теперь мы хотим добавить цвета именам, по кликая по ним // Когда событие клика обнаружено на одном из элементов // списка, меняем его цвет на зелёный // Мы можем добавлять отслеживание событий ко всему // родительскому объекту // Т.е. нам не нужно добавлять отслеживание событий к // каждому тегу <li> list.addEventListener("click", function (e) { // Появление цвета у конкретного элемента списка // только после клика по нему e.target.classList.add('green'); });
HTML
<button>Enable zoom</button> <button>Disable zoom</button> <br><br> Click on any of the names to color them green <ul> <li>Chewbacca</li> <li>Han Solo</li> <li>Luke</li> <li>Boba fett</li> </ul>
CSS
.green { color: green; } .zoomed { cursor: pointer; font-size: 23px; }
4. Управление классами и атрибутами
Раньше управление классами и атрибутами элементов без jQuery было довольно неудобно. Однако всё изменилось с появлением свойства classList. И если вам нужно поуправлять атрибутами, то всё что вам нужно - это задать атрибут setAttribute
JS
var btn = document.querySelectorAll("button"), div = document.querySelector("#myDiv"); btn[0].addEventListener("click", function () { // Получаем любой атрибут. Всё очень просто console.log(div.id); }); // Element.classList хранит все классы элемента в форме DOMTokenList var classes = div.classList; btn[1].addEventListener("click", function () { console.log(classes); }); btn[2].addEventListener("click", function () { // Поддерживается добавление и удаление классов classes.add("red"); }); btn[3].addEventListener("click", function () { // Вы так же можете выключать и включать классы с //помощью toggle classes.toggle("hidden"); });
HTML
<div id='myDiv' class="square"></div> <button>Display id</button> <button>Display classes</button> <button>Color red</button> <button>Toggle visibility</button>
CSS
.square { width: 100px; height: 100px; margin-bottom: 20px; border: 1px solid grey; border-radius: 5px; } .hidden { visibility: hidden; } .red { background-color: red; }
5. Получение и задание контента элемента.
Для этого в jQuery есть удобные методы text() и html(). Но вы так же можете использовать методы textContent и innerHTML эти методы уже достаточно давно существуют на чистом JS.
JS
var myText = document.querySelector("#myParagraph"), btn = document.querySelectorAll("button"); // Мы запросто можем получить текст содержащийся в узле, // а также текст всех его потомков var myContent = myText.textContent; console.log("textContent: " + myContent); // Когда используем метод textContent применительно к // текстовой составляющей элемента, то он удаляет старый контент и // заменяет его новым btn[0].addEventListener('click', function () { myText.textContent=" Koalas are the best animals "; }); // Когда нам нужно получить весь HTML-код узла, включая // теги, мы можем использовать innerHTML var myHtml = myText.innerHTML; console.log("innerHTML: " + myHtml); // Чтобы изменить html, просто подключите новый контент // Конечно же, мы не ограничены добавлением только лишь текста btn[1].addEventListener('click', function () { myText.innerHTML="<button> Penguins are the best animals </button>"; });
HTML
<p id="myParagraph"><strong> Which are the best animals? </strong></p> <button>Koalas</button> <button>Penguins</button>
6. Вставка и удаление элементов
Несмотря на то, что на jQuery это делается несколько проще, добавление или удаление DOM-элементов не является непосильной задачей для JavaScript. Вот как это делается на JS:
JS
var lunch = document.querySelector("#lunch"); // Во вкладке "Ланч" идёт описание нашего сегодняшнего ланча // Давайте добавим туда чутка картошки фри var addFries = function () { // Сначала мы должны создать наш элемент и задать // его содержимое (контент) var fries = document.createElement("div"); fries.innerHTML = '≶li>≶h4> Fries ≶/h4>≶/li>'; // После чего мы можем использовать appendChild> // для вставки. После чего наша картошка фри появится в списке // нашего ланча lunch.appendChild(fries); }; // Теперь нам нужно добавить сыра до и после котлетки в нашем бургере. var addCheese = function () { var beef = document.querySelector("#Beef"), topSlice = document.createElement("li"), bottomSlice = document.createElement("li"); bottomSlice.innerHTML = topSlice.innerHTML = 'Cheese'; // Вставляем верхний кусочек: // Берём родительский элемент котлетки (это сендвич), и // юзаем на него insertBefore // Первым аргументом в методе insertBefore идёт то что мы // собираемся добавить // Вторым аргументом идет узел, перед которым нужно добавить новый элемент beef.parentNode.insertBefore(topSlice, beef); // Нижний кусочек: // Здесь мы немножко сфокусничаем! // Подключим следующий ближайший элемент в качестве второго аргумента // метода insertBefore, таким образом мы вставим то что нам нужно, // там где мы этого хотим beef.parentNode.insertBefore(bottomSlice, beef.nextSibling); }; var removePickles = function () { // Наконец, мы получили возможность избавиться от маринованных огурчиков. // И в этом опять-таки нам помог javascript! var pickles = document.querySelector("#pickles"); if (pickles) { pickles.parentNode.removeChild(pickles); } }; // Вкусняшка! var btn = document.querySelectorAll("button"); btn[0].addEventListener('click', addFries); btn[1].addEventListener('click', addCheese); btn[2].addEventListener('click', removePickles);
HTML
<button>Add fries to lunch</button> <button>Add cheese to sandwich</button> <button>Remove pickles</button> <h3>My Lunch</h3> <ul id="lunch"> <li><h4>My sandwich</h4></li> <li>Bread</li> <li id="pickles">Pickles</li> <li id="Beef">Beef</li> <li>Mayo</li> <li>Bread</li> </ul>
7. Проход по дереву элементов структуры DOM
Настоящие JS-джедаи знают, как много всего бывает спрятано в DOM. В сравнении с jQuery, обычное API DOM ограничено в функциональности при выборке родительских а также братских/сестринских элементов. Так или иначе, в вашем кармане есть множество различных способов, чтобы сверху донизу пройтись по DOM-дереву.
JS
var snakes = document.querySelector('#snakes'), birds = document.querySelector('#birds'); snakes.addEventListener('click', function (e) { // Для получения доступа к родителю конкретного дочернего // элемента в древе DOM используется метод parentNode var parent = e.target.parentNode; console.log("Parent: " + parent.id); // С другой стороны, вызов метода children позволяет // получить все дочерние элементы выбранного объекта console.log("Children: "); var children = e.target.children; // Этот кусок кода вернёт HTMLCollection (вид массива), // так что мы можем получить доступ к каждому дочернему элементу // объекта, если пройдёмся по массиву циклом for (var i = 0; i < children.length; i++) { console.log(children[i].textContent); } }); birds.addEventListener('click', function (e) { // Получаем ближайший братский элемент var previous = e.target.previousElementSibling; if (previous) { console.log("Previous sibling: " + previous.textContent); } var next = e.target.nextElementSibling; if (next) { console.log("Next sibling: " + next.textContent); } // Так или иначе, чтобы получить все братские элементы в // одном узле - это более сложная задача. Нам нужно взять // каждый родительский элемент каждого ребёнка и затем исключить // из него оригинальный элемент. Делается это с помощью фильтра и // вызова функции, которая проверяет каждый дочерний элемент один за одним. console.log("All siblings: "); Array.prototype.filter.call(e.target.parentNode.children, function (child) { if (child !== e.target) { console.log(child.textContent); } }); });
HTML
Click on the objects to see their parent and children elements <div id="snakes"> Snakes <ul id="venomous"> Venomous <li>Cobra</li> <li>Rattlesnake</li> </ul> <ul id="non-venomous"> Non venomous <li>Python</li> <li>Anaconda</li> </ul> </div> Click on any of the birds to see its siblings <div> Birds <ul id="birds"> <li>Flamingo</li> <li>Seagull</li> <li>Raven</li> <li>Dodo</li> </ul> </div>
CSS
div { color: white; background-color: #93d0ea; font-family: sans-serif; width: 180px; text-align: center; padding: 10px; margin: 5px; }
8. Обработка массивов
Некоторые из служебных методов, которые обеспечивает jQuery, теперь доступны с появлением ES5-стандартов. Для множественных ассоциативных массивов мы можем использовать forEach и map вместо их jQuery-аналогов each() и map(). Вот только будьте внимательны, есть между ними определённые отличия в аргументах и в возвращаемом по умолчанию значении this.
JS
var ninjaTurtles = ["Donatello", "Leonardo", "Michelangelo", "Raphael"]; // Цикл ForEach автоматически проходит по всему массиву ninjaTurtles.forEach(function (entry) { console.log(entry); }); // Метод map вызывает функцию на каждый элемент // массива и создаёт новый массив с результатами var lovesPizza = ninjaTurtles.map(function (entry) { return entry.concat(" loves pizza!"); }); console.log(lovesPizza);
9. Анимация
Благодаря jQuery, вы фактически можете анимировать всё, что угодно и как угодно, это поистине мощный инструмент! В случае когда вам нужно создать сложную анимацию для вашего проекта, без jQuery вам просто не обойтись.
— Разгрузит мастера, специалиста или компанию;
— Позволит гибко управлять расписанием и загрузкой;
— Разошлет оповещения о новых услугах или акциях;
— Позволит принять оплату на карту/кошелек/счет;
— Позволит записываться на групповые и персональные посещения;
— Поможет получить от клиента отзывы о визите к вам;
— Включает в себя сервис чаевых.
Для новых пользователей первый месяц бесплатно. Зарегистрироваться в сервисе
Однако, благодаря чудесам современных CSS3-свойств, мы можем без проблем создать свою простейшую анимацию либо использовать специальные CSS-библиотеки как например Animate.css, позволяющую создавать и запускать анимации, просто добавляя или удаляя классы к тем или иным элементам страницы.
JS
var btn = document.querySelectorAll("button"), circle = document.querySelector("#circle"); // Сначала нам нужно добавить класс для анимации нашего объекта // чтобы библиотека смогла распознать его circle.classList.add('animated'); // Мы пройдёмся циклом по всем нашим кнопкам и добавим отслеживание // событий к каждой из них for (var i = 0; i < btn.length; i++) { // Чтобы определить каждую анонимную функцию мы будем // использовать переменную i (function (i) { btn[i].addEventListener('click', function () { // Чтобы начать анимацию мы должны добавить определённый // класс объекту // В нашем случае мы храним имена классов в атрибуте data-animation в каждой кнопке var animation = btn[i].getAttribute('data-animation'); circle.classList.add(animation); // Чтобы заставить всё это работать больше одного раза // нам нужно будет удалять класс после того, как анимация // будет закончена window.setTimeout(function () { circle.classList.remove(animation); }, 1000); }); }(i)); }
HTML
<button data-animation="bounce">Bounce</button> <button data-animation="pulse">Pulse</button> <button data-animation="fadeInLeftBig">Fade in</button> <button data-animation="fadeOutRightBig">Fade out</button> <button data-animation="flip">Flip</button> <div id="circle"></div>
CSS
body { text-align: center; } #circle { border-radius: 50%; margin: 50px auto; width: 50px; height: 50px; background-color: #93d0ea; }
10. AJAX
AJAX - это одна из тех технологий, которая раньше приводила к кроссбраузерному беспорядку. Слава богам, что теперь мы можем использовать один и тот же код где бы то ни было.
Но не всё так гладко и цветочно, как хотелось бы, AJAX-запросы написанные с XMLHttpRequest всё ещё остаются довольно громоздкими, поэтому лучше бы их оставить на совесть библиотек.
Но! Вам не нужно подключать всю jQuery-библиотеку только ради AJAX. Вы можете использовать одну из доступных лёгких библиотек. Вот как можно писать AJAX-запросы, используя маленькую библиотеку запросов
JS
// Простейший пример регистрирует тело нашей url // страницы в консоль // Можно сделать это вручную с помощью GET-запросов, // но это несколько утомительно var request = new XMLHttpRequest(); request.open('GET', 'http://tutorialzine.com/misc/files/my_url.html', true); request.onload = function (e) { if (request.readyState === 4) { // Проверяем успешность GET-запроса if (request.status === 200) { console.log(request.responseText); } else { console.error(request.statusText); } } }; // Ловим ошибки request.onerror = function (e) { console.error(request.statusText); }; request.send(null); // Используем небольшую библиотеку, такую как Reqwest, что в значительной степени облегчит вам работу reqwest({ url: 'http://tutorialzine.com/misc/files/my_url.html', method: 'get', error: function (err) { }, success: function (resp) { console.log(resp); } });
Итог
Если вы стремитесь создавать быстрозагружающиеся на любых устройствах страницы и приложения, удобные для пользователей, то минималистичный чистый код без каких либо дополнительных тяжеловесных библиотек - это ваш выбор.
В то же время не стоит изобретать колесо, ведь никто не выиграет от того, что вы будете пытаться написать самостоятельно сложный код, который вполне может предложить jQuery. Также не стоит жертвовать своим временем и трудиться в поте лица, дабы сэкономить пару байтов трафика.
Однако существует некоторое количество рекомендаций и методов, о которых мы говорили сегодня и о которых стоит знать. В некоторых случаях они действительно будут полезным и помогут действительно сэкономить определённое количество трафика. Попробуйте в следующий раз писать на чистом JS, возможно вам больше и не понадобится ничего другого!
Материал подготовил Денис Малышок специально для сайта CodeHarmony.ru
P.S. Присмотритесь к премиум-урокам по различным аспектам сайтостроения, включая JavaScript, jQuery и Ajax, а также к бесплатному курсу по созданию своей CMS-системы на PHP с нуля. Все это поможет вам быстрее и проще освоить практические навыки веб-программирования:
Понравился материал и хотите отблагодарить?
Просто поделитесь с друзьями и коллегами!
Смотрите также: