Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
jQuery-tutorial-for-beginners-1.0.0.pdf
Скачиваний:
29
Добавлен:
17.02.2016
Размер:
1.82 Mб
Скачать

Оптимизируем выборки

Ну перво-наперво вам следует запомнить, что

результаты поиска не кэшируются, каждый раз, запрашивая элементы по селектору, вы инициируете поиск элементов снова и снова

Взглянув на алгоритм работы Sizzle, сходу напрашиваются несколько советов об оптимизации по работе с выборками:

1. Сохранять результаты поиска (исходя из постулата выше):

// было $("a.button").addClass("active");

/* ... .*/ $("a.button").click(function(){ /* ... .*/ });

// стало

var $button = $("a.button"); $button.addClass("active");

/* ... .*/ $button.click(function(){ /* ... .*/ });

2. Или использовать цепочки вызовов (что по сути аналогично первому правилу):

// было $("a.button").addClass("active");

$("a.button").click(function(){ /* ... .*/ });

// стало $("a.button").addClass("active")

.click(function(){ /* ... .*/ });

3. Использовать context (это такой второй параметр при выборе по селектору):

// было

$(".content a.button"); // стало

$("a.button", ".content"); $(".content").find("a.button",); // чуток быстрее

35

4.Разбивать запрос на более простые составные части используя context, и сохранять промежуточные данные (как следствие из правил №1 и №3)

// было

$(".content a.button"); $(".content h3.title");

// стало

var $content = $(".content") $content.find("a.button"); $content.find("h3.title");

5.Использовать более «съедобные» селекторы дабы помочь querySelectorAll, т.е. если у вас нет уверенности в правильности написания селектора, или сомневаетесь в том, что все браузеры поддерживают необходимый CSS селектор, то лучше разделить «сложный» селектор на несколько более простых:

// было

$(".content div input:disabled");

// стало

$(".content div").find("input:disabled");

6.Не использовать jQuery, а работать с native функциями JavaScript'а

Есть ещё один пункт – выбирать самый быстрый селектор из возможных, но тут без хорошего багажа знаний не обойтись, так что дерзайте, пробуйте и присылайте ваши примеры.

Для наглядности лучше всего взглянуть на сравнительный тест sizzle.html (данный тест был изначально разработан Ильёй Кантором для мастер-класса по JavaScript и jQuery)

Маленькая хитрость от создателей jQuery – запросы по id элемента не доходят до Sizzle, а скармливаются document.getElementById() в качестве параметра:

$("#content") -> document.getElementById("content");

36

Примеры оптимизаций

Выбор по идентификатору элемента – самый быстрый из возможных, старайтесь использовать оный:

// внутри одна регулярочка + getElementById() $("#content")

// а вот так ещё быстрее $(document.getElementById("content"))

//но экономия незначительна

//а удобство использования стремится к нулю

Селектор «div#content» работает на порядок медленнее, нежели поиск лишь по идентификатору – «#content», но и он имеет право на существование в случае, если ваш скрипт используется на нескольких страницах, а логика требует лишь обрабатывать поведение для элемента «div». Данный селектор можно представить в двух вариантах:

// getElementById() + фильтрация $("#content").filter("div");

// оставляем как есть и надеемся на QuerySelectorAll() $("div#content");

Врезультате тестирования получаем следующий расклад:

пример с использованием filter() работает быстрее в браузерах Chrome, Firefox и IE9.0+

оба способа работают наравне в браузерах IE8.0 и мобильном Safari

второй пример работает в два раза быстрее в последних версиях Opera

Выводы делаем сами.

37