Статьи

Собственные JavaScript-эквиваленты методов jQuery: события, Ajax и утилиты

Это последняя часть моей серии, которая следует из « Действительно ли вам нужен jQuery?» В этой статье мы рассмотрим эквиваленты JavaScript для более продвинутых методов, которые предоставляет jQuery…

Запуск скриптов при загрузке страницы

В недалёком прошлом разработчики помещали скрипты в заголовок HTML и использовали window.onload = start; запустить начальную функцию. Это работало, но window.onload срабатывает только после того, как все внедренные файлы, такие изображения были полностью загружены; Вы могли бы ждать некоторое время для запуска кода.

jQuery предоставляет гораздо более эффективный метод:

 $(start) 

Функция start () выполняется, как только HTML-файл загружен и DOM готов, но он не будет ждать других ресурсов. За кулисами он использует собственное событие DOMContentLoaded с отступлениями в jQuery 1.x для IE6 / 7/8:

 document.addEventListener("DOMContentLoaded", start); 

Я имел обыкновение беспокоиться о такой ерунде. Это не нужно: просто загрузите ваш скрипт внизу страницы непосредственно перед закрывающим </body> и вы будете знать, что DOM готов.

для каждого

jQuery позволяет запускать пользовательские функции для всех элементов в массиве. (Это включает в себя наборы узлов. Хотя они могут начать жизнь как NodeList, jQuery копирует их в массивоподобный объект, прежде чем они будут возвращены):

 $("p").each(function(i) { console.log("index " + i + ": " + this); }); 

each них используется внутри, когда вы применяете несколько методов к цепочке jQuery. Эта команда зациклила бы все узлы <p> дважды:

 $("p").addClass("newclass").css({color:"#f00"}); 

Нативный forEach поддерживается в большинстве браузеров, включая IE9 +. Тем не менее, это относится только к массивам, поэтому нам нужно преобразовать NodeLists, просматривая все элементы или используя прототип среза Array:

 Array.prototype.slice.call(document.getElementsByTagName("p")); 

Ughh. Лично я предпочитаю короткую пользовательскую функцию, которой можно передать массив, NodeList или объект с обратным вызовом. Он перебирает элементы, передавая каждый со своим индексом этой функции. Этот пример автоматически отменяет дальнейшую обработку, когда обратный вызов возвращает false:

 function Each(obj, fn) { if (obj.length) for (var i = 0, ol = obj.length, v = obj[0]; i < ol && fn(v, i) !== false; v = obj[++i]); else for (var p in obj) if (fn(obj[p], p) === false) break; }; 

События

Обработка событий была ужасной в дни до jQuery. IE6 / 7/8 реализовал другую модель событий, и даже те браузеры, которые предположительно следовали стандартам W3C, имели достаточно несоответствий, чтобы сделать разработку неудобной. JQuery по-прежнему делает события легче понять:

 $("#clickme").on("click", function(e) { console.log("you clicked " + e.target); e.preventDefault(); }); 

Но нативный эквивалент не слишком сложен:

 document.getElementById("clickme").addEventListener("click", function(e) { console.log("you clicked " + e.target); e.preventDefault(); }); 

Это не будет работать в IE6 / 7/8, но не будет работать и в jQuery 2.x. Большинство библиотек предоставляют обходной путь, который регистрирует события, используя метод oldIE attachEvent. В качестве альтернативы, если вам требуется только одно событие определенного типа на узле, просто примените кросс-браузерный метод DOM1 ‘on’, например

 document.getElementById("clickme").onclick = runSomething; 

(Не забудьте включить строку, например, e = e ? e : window.event; в верхней части функции-обработчика, чтобы справиться с объектом события oldIE). Помните, ничего из этого не требуется, если вы поддерживаете IE9 +.

jQuery предоставляет нестандартные типы, такие как события ‘focusin’ и ‘live’, т.е. к сопоставленным элементам, добавленным на страницу при будущих операциях, также будет применено событие. jQuery достигает этого, присоединяя обработчик к родительскому элементу (например, к телу страницы) и анализируя объект события, когда он всплывает через DOM. Вы можете сделать это самостоятельно — это более эффективно, использует меньше кода и является стандартной практикой JavaScript, например, вместо того, чтобы прикреплять событие hover к каждой строке таблицы, вы присоединяете его к таблице, анализируете объект и реагируете соответственно.

Если вы предпочитаете синтаксис jQuery, почему бы не использовать min.js Реми Шарпа ? Он предоставляет селектор $ , связанный on событиями, функциональность trigger и поддержку forEach . Общий вес: 617 символов для минимизированной версии.

Ajax

Когда в последний раз вы разрабатывали проект, который требовал XMLHttpRequest, внедрение сценариев, запросы GET, отправку POST, обработку JSON и загрузку изображений? jQuery справляется со многими ситуациями, и, хотя он и гибкий, вам редко понадобятся все эти опции. Типичный код jQuery Ajax:

 $.ajax({ url: "webservice", type: "POST", data: "a=1&b=2&c=3", success: function(d) { console.log(d); } }); 

Нативный эквивалент:

 var r = new XMLHttpRequest(); r.open("POST", "webservice", true); r.onreadystatechange = function () { if (r.readyState != 4 || r.status != 200) return; console.log(r.responseText); }; r.send("a=1&b=2&c=3"); 

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

Вы должны использовать JQuery?

Только вы можете принять это решение, но использование jQuery в качестве отправной точки по умолчанию для каждого проекта не обязательно будет эффективным или приведет к созданию элегантного кода.

jQuery был чрезвычайно полезен и стал одной из основных причин возрождения фронт-энда. Однако, в отличие от специализированных библиотек для обработки холста, SVG или других сфокусированных задач, jQuery предоставляет общий набор инструментов — они вам никогда не понадобятся. Поставщики браузеров догнали, и, если вам не требуется поддержка oldIEs, jQuery не является основным ресурсом, которым он когда-то был. Чтобы поместить это в контекст, если вы перешли на jQuery 2.0, вам, вероятно, не нужен jQuery.

Я оставлю вам ссылку на Vanilla JS ; библиотека, используемая многими ведущими веб-компаниями, которая имеет модульную архитектуру и меньше, чем все ее конкуренты. Сайт издевательский, но прекрасно иллюстрирует суть.