Статьи

Собственные JavaScript-эквиваленты методов jQuery: DOM и формы

Дискуссия по-прежнему бушует о моем недавнем JQuery? В статье есть две причины, по которым использование jQuery является хорошей идеей:

  1. вам нужно поддерживать IE6 / 7/8 (помните, что вы не можете перейти на jQuery 2.0), или
  2. без jQuery вы бы потратили больше времени на написание jQuery-подобной библиотеки, чем на разработку своего приложения.

Во всем остальном будьте прагматичны. jQuery — это общая библиотека на 270 Кб. Вам вряд ли потребуется вся функциональность, которую он предоставляет, и, даже если вы пропустите определенные модули, он останется значительным количеством кода. Вы можете загрузить уменьшенную версию 30 КБ из CDN, но браузер должен остановить обработку и проанализировать код на каждой странице, прежде чем делать что-либо еще.

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

DOM селекторы

jQuery разрешает выбор узла DOM с использованием синтаксиса селектора CSS, например

// find all paragraphs with the class "summary" in the article with ID "first"
var n = $("article#first p.summary");

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

 var n = document.querySelectorAll("article#first p.summary");

document.querySelectorAll jQuery имеет дополнительную поддержку для более продвинутых селекторов, но, по большей части, он будет запускать document.querySelectorAll$()

Собственный JavaScript также предоставляет четыре альтернативы, которые почти наверняка будут быстрее, чем querySelectorAll, если вы сможете их использовать:

  1. document.querySelector(selector)
  2. document.getElementById(idname)
  3. document.getElementsByTagName(tagname)
  4. document.getElementsByClassName(class)

Методы getElementsByTagName и getElementsByClassName могут также применяться к отдельным узлам, чтобы ограничить результат только потомками, например

 var n = document.getElementById("first");
var p = n.getElementsByTagName("p");

Давайте сделаем некоторое тестирование. Я написал небольшую подборку сценариев для извлечения всех узлов комментариев из моего jQuery «Действительно ли вам нужен»? статья 10000 раз. Результат:

код время
 // jQuery 2.0
var c = $("#comments .comment");
4649 мс
 // jQuery 2.0
var c = $(".comment");
3437 мс
 // native querySelectorAll
var c = document.querySelectorAll("#comments .comment");
1,362 мс
 // native querySelectorAll
var c = document.querySelectorAll(".comment");
1,168 мс
 // native getElementById / getElementsByClassName
var n = document.getElementById("comments");
var c = n.getElementsByClassName("comment");
107 мс
 // native getElementsByClassName
var c = document.getElementsByClassName("comment");
75 мс

Я не могу требовать строгих лабораторных условий, и это не отражает реального использования, но в этой ситуации нативный JavaScript был в 60 раз быстрее. Это также показывает, что выборка узлов по идентификатору, тегу или классу обычно предпочтительнее, чем querySelectorAll

DOM Manipulation

JQuery предлагает несколько методов для добавления дополнительного контента в DOM, например,

 $("#container").append("<p>more content</p>");

Под поверхностью jQuery использует собственный метод innerHTML, например

 document.getElementById("container").innerHTML += "<p>more content</p>";

Вы также можете использовать методы построения DOM. Это безопаснее, но редко быстрее, чем innerHTML:

 var p = document.createElement("p");
p.appendChild(document.createTextNode("more content");
document.getElementById("container").appendChild(p);

Мы также можем удалить все дочерние узлы в jQuery:

 $("#container").empty();

Собственный эквивалент с использованием innerHTML:

 document.getElementById("container").innerHTML = null;

или небольшая функция:

 var c = document.getElementById("container");
while (c.lastChild) c.removeChild(c.lastChild);

Наконец, мы можем удалить весь элемент из DOM в jQuery:

 $("#container").remove();

или нативный JavaScript:

 var c = document.getElementById("container");
c.parentNode.removeChild(c);

Масштабируемая векторная графика

Базовая библиотека jQuery была разработана для работы с текущим документом. У SVG также есть DOM, но jQuery не предлагает прямого манипулирования этими объектами, потому что обычно необходимо использовать такие методы, как createElementNSgetAttributeNS Его можно заставить работать, и доступны несколько плагинов , но будет эффективнее свернуть свой собственный код или использовать специализированную библиотеку SVG, такую ​​как Raphaël или svg.js.

HTML5 формы

Даже самое простое веб-приложение будет иметь форму или два. Вы должны всегда проверять пользовательские данные на стороне сервера, но в идеале вы должны дополнить их проверкой на стороне клиента для выявления ошибок перед отправкой формы.

Проверка на стороне клиента проста:

  1. Вы запускаете функцию при отправке формы.
  2. Если возникнут какие-либо проблемы, вы прекращаете отправку и выдает ошибку.

Вы можете использовать jQuery. Вы можете использовать собственный JavaScript. Какой из них выбрать? Ни один .

HTML5 имеет встроенную поддержку различных общих типов ввода, таких как электронные письма, телефоны, URL-адреса, числа, время, даты, цвета и настраиваемые поля на основе регулярных выражений. Например, если вы хотите заставить пользователя ввести адрес электронной почты, используйте:

 <input type="email" name="email" required="required" />

Нет необходимости в дополнительном коде JavaScript или jQuery, если вам не требуется немного больше изощренности, например, сравнение двух или более полей или показ пользовательских сообщений об ошибках.

Старые браузеры (включая IE9 и ниже) не понимают новые типы и возвращаются к стандартным текстовым полям ввода. Эти пользователи вернутся к проверке на стороне сервера; не очень хороший опыт, но вы можете применить прокладку или надеяться, что эти люди увидят свет и обновятся.

В моей следующей статье мы рассмотрим манипуляции с нативным классом CSS и анимацию.