Эффективный jquery

36
JavaScript/jQuery Interlabs 18 декабря 2012 1 / 36

Post on 28-Nov-2014

1.296 views

Category:

Technology


1 download

DESCRIPTION

Семинар посвящен эффективному использованию библиотеки jQuery. Рассмотрены часто встречающиеся ошибки при написании JavaScript-сценариев с использованием jQuery и предложен набор рекомендаций, выполнение которых позволяет писать более эффективные и простые в поддержке сценарии. Рассмотренные вопросы: рекомендации по стилю кодирования, эффективное использование селекторов, современный API для работы с событиями, делегирование событий, концепция deferreds, рекомендации по работе с AJAX и DOM.

TRANSCRIPT

Page 1: Эффективный jQuery

JavaScriptjQuery

Interlabs

18 декабря 2012

1 36

Стиль кодирования

bull JavaScript mdash язык с ужасным синтаксисомbull стиль кодирования важенbull иногда критически ошибки интеграция с внешнимиинструментами

bull единый стиль не выработался много разных стандартовbull важно писать единообразно хотя бы в рамках проектаbull наиболее практичный стандарт

Google JavaScript Style Guidehttpgoogle-styleguidegooglecodecomsvntrunkjavascriptguidexml

2 36

Стиль кодирования проблемы

bull различные стили именования функций и переменных

fnCheckCardsForm() mapDivisTouchDevice() is_okDoOrderAdd()

bull пробелы невпопад и if в одну строку

if( num gt 10 ) doAction( num )

bull повторные var

var field = $(rsquoform[name=order] input[name=name]rsquo)var field = $(rsquoform[name=order] input[name=email]rsquo)

bull var внутри блока

Стиль кодирования проблемы

bull фигурная скобка на следующей строке чреватопроблемами с автоподстановкой

for (prop in locs) function setMarkers(locs)

bull пустые анонимные функции

on(rsquoclickrsquo function() myHandler() )

bull избыточные переменные

var check = (item gt 0)$(rsquoformrsquo)attr( disabled check )

bull выполняемый код в виде строки

setTimeout($(rsquotitle-linkfirstrsquo)click() 100)

Стиль кодирования модулиdefine([ весь код в виде AMD-модулейdep1 зависимости модуляdep2 если мало mdash можно в одну строку

] function (dep1 аргументы аналогично зависимостямdep2

) use strict строгий режим

var num = 0 var всегда в начале функции$form неинициализированные переменныеi в конце списка

function send(mode) внутренняя функция

)

5 36

Стиль кодирования функцииИмена функций и переменных mdash camelCase со строчной буквыникакой венгерской нотации исключение только для $

(function () анонимные функции mdash пробел перед ()

именованные функции - нет пробела перед () и внутриfunction countFields(name where)

var count имена переменных mdash camelCase$form jquery-переменые mdash с $

return count пустая строка перед return

)() замыкание через анонимные функции в скобках

6 36

Стиль кодирования mdash управление

if (length gt 0) пробел перед скобкой но не послеupdate() если в if единственное действие

все равно заключаем в скобки

switch (value) case val1 используем отступы

break

смысловые группы разделяем пробеламиcase val2

break

7 36

Самая Главная Проблема

Copy Paste Copy Paste CopyPaste Copy Paste Copy PasteCopy Paste Copy Paste CopyPaste Copy Paste Copy PasteCopy Paste Copy Paste CopyPaste Copy Paste Copy PasteCopy Paste Copy Paste CopyPaste Copy Paste Copy Paste

jQuery

bull самая популярная JavaScript-библиотекаbull постоянно развивается

10 26082006rarr rarr 16 03052011rarr 17 03112011rarr 18 09082012

bull каждая новая версия в большинстве случаевпроизводительнее и удобнее предыдущей

bull переход обычно не создает проблем

Лучше пользоваться свежей версией

9 36

Селекторы

$(lsquojqueryrsquo)

bull один из основных инструментов jQuerybull разные селекторы mdash один и тот же результатbull разница в скорости может быть очень существеннойbull крайне желательно выбирать оптимальныйbull самый быстрый поиск mdash это отсутствие поиска

Эффективное использование селекторов важно

10 36

Некешируемые селекторы плохо

if ($(rsquoapp-foot-descriptionrsquo)length) $(rsquoapp-foot-descriptionrsquo)click(function()

$(rsquoapp-foot-descriptionrsquo)addClass(rsquoapp-foot-description-activersquo)

)

Селектор используется больше одного раза mdashнадо кешировать

Селекторы

Cамые быстрые mdash getElementById()

$(rsquoElement form inputrsquo)

Достаточно быстрые если есть getElementsByClassName()

$(rsquoclassnamersquo)

Медленные полный просмотр

$([attribute=value]) $(hidden)

Селекторы обрабатываются справа налево Для начинающихсяс id mdash встроенная оптимизация

12 36

Селекторы контекстКонтекст DOM Element или Document или jQuery не строка

Эквивалентная запись поиска в контексте$(rsquohiddenrsquo $(rsquolistrsquo))$(rsquolistrsquo)find(rsquohiddenrsquo) самый быстрый вариант

Поиск только внутри элемента с обработчиком$(rsquodivfoorsquo)on(rsquoclickrsquo function()

$(rsquospanrsquo this)addClass(rsquobarrsquo))

find() рекурсивный может быть выгоднее children() и тд

httpjsperfcomjquery-selectors-context213 36

Селекторы chainingbull большинство методов jQuery возвращают объект jQuerybull не нужны отдельные вызовы даже для кешированногоjQuery

bull работает быстрее чем кешированная версия и легчечитается

$(rsquoulfirstrsquo)find(rsquofoorsquo)css(rsquobackground-colorrsquo rsquoredrsquo)

end()find(rsquobarrsquo)css(rsquobackground-colorrsquo rsquogreenrsquo)

end()

httpjsperfcomjquery-chaining

14 36

События проблемы

bull bind() click() live() bull return falsebull лишние врапперы

lsquoon(rsquoclickrsquo function() myHandler() )lsquo

bull перепривязка событий и избыточное количecтвообработчиков

lsquo$(rsquojs-classrsquo)unbind(rsquoclickrsquo)bind(rsquoclickrsquo function() )

jQuery on()off()Единый рекомендуемый API для работы с событиями в позднихверсиях

единичный обработчик$(rsquobuttonrsquo)on(rsquoclickrsquo function(e)

)

делегирование обработки$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo function(e)

)

$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo key value function(e) consoledebug(edatakey)

)16 36

Делегирование событийПовторная привязка событий после изменения DOM

bull усложняет логику требует запуск дополнительного кодапосле изменения

bull создает избыточное количество обработчиков

Правильно mdash делегирование

bull использует event bubblingbull позволяет установить один обработчик событий а не стоbull работает с элементами DOM которые появились позжеустановки обработчика

$(rsquocontainerrsquo)on(rsquoclickrsquo rsquoelementrsquo) function(e)

17 36

jQuery return false

bull epreventDefault() mdash останавливает обработка поумолчанию

bull estopPropagation() mdash останавливает передачуродительским элементам

bull estopImmediatePropagation() mdash прекращаетвыполнение всех обработчиков для этого элемента

return false = epreventDefault() + estopPropagation()

Рекомендуется не использовать return false а использоватьсоответствующие методы

18 36

jQueryDeferred

bull представление (асинхронного) действия как объектаbull состояния из pending в resolved или rejectedbull для каждого финального состояния можно указать наборобработчиков

bull в финальное состояние завершения можно перейти толькоодин раз

bull если объект уже перешел в финальное состояниедобавляемые обработчики выполняются сразу же

bull AJAX-вызовы возвращают deferred

promise = read-only deferred

19 36

jQueryDeferred пример

function countDown(time)

var timer = $Deferred()setTimeout(function() timerresolve() time)return timerpromise()

var test = countdown(5000)

testdone(function() consoledebug(rsquoTime is uprsquo) )

testdone(function() consoledebug(rsquoBangrsquo) )

20 36

jQueryDeferred APIОбработка завершения

done() успешноеfail() неуспешноеthen() любое

Создание$Deferred конструкторpromise() read-only объект

Завершениеresolve() завешениеreject() неуспешное

Прогрессnotify() уведомление

progress() обработка

Комбинирование

$when() комбинирование с синхронизацией

21 36

jQuerywhen()function getData()

return $get(rsquodatarsquo)success(function() consolelog(rsquoajax donersquo)

function showDiv() return $Deferred(function(d)

$(rsquoblockrsquo)fadeIn(1000 dresolve))promise()

$when(getData() showDiv())then(function(ajaxResult)

consolelog(rsquoall donersquo))

22 36

jQueryDeferred итого

Можно получить более читаемый и легко сопровождаемый код

В нашем случае наиболее наиболее возможное применение

bull синхронизация параллельной анимацииbull синхронизация AJAX-вызовов между собой и другимиоперациями

23 36

AJAX избыточно и неудобно

$ajax(url scripthtmdata Object2Parameters( action rsquoformrsquo )dataType rsquojsonrsquosuccess function (res)

)

AJAX рекомендации

bull используем имя метода для указания типа запросаbull не используем dataType mdash правильный Content-Typeдолжен формироваться на стороне сервера

bull не используем собственных функций формированиястроки данных

bull используем deferreds соответственно done() fail()then()

bull определение запроса и добавление обработчиков можноразделить

bull легко синхронизировать запросы и анимацию

25 36

AJAX пример

var update = $post(rsquoupdatersquo id 1 name name )

updatedone(function (response)

)

updatethen(function (response)

donefunction (response)

fail)

26 36

DOM главная проблема

Очень сложная разметкастили в JavaScript

DOM главная проблема

bull не используем CSS-стили в JavaScriptbull не отрабатываем responsive через JavaScriptbull не кодируем данные в классах (есть data() )bull всегда используем классыbull чем проще разметка тем проще по нейнавигация

Очень важно минимизируем CSSминимизируем верстку иначе проблемынеизбежны

28 36

DOM проблемы

bull разметка смешана с кодом сложно поддерживатьbull ресурсоемкое создание элементов

$(rsquobodyrsquo)prepend($(rsquoltdivgtrsquo)addClass(rsquoapp-loading-wrapperrsquo)prepend(

$(rsquoltdivgtrsquo)addClass(rsquoapp-loading-picturersquo))

$(rsquoltdivgtrsquo)addClass(rsquoapp-button-red app-club-button-addrsquo)prepend($(rsquoltinput type=buttongtrsquo)

attr(value rsquoПроверитьrsquo ))

Работа с DOMДобавление новых узлов в документ mdash дорого

bull используем строки добавляем единственным append()bull стараемся не плодить лишние $()bull сводим количество append() к минимумуbull в сложных случаях можно использовать detach()

var $form = $(rsquoformrsquo)$parent = $formparent()

$formdetach()inputseach(function() $formappend(this) )

$parentappend($form)

30 36

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 2: Эффективный jQuery

Стиль кодирования

bull JavaScript mdash язык с ужасным синтаксисомbull стиль кодирования важенbull иногда критически ошибки интеграция с внешнимиинструментами

bull единый стиль не выработался много разных стандартовbull важно писать единообразно хотя бы в рамках проектаbull наиболее практичный стандарт

Google JavaScript Style Guidehttpgoogle-styleguidegooglecodecomsvntrunkjavascriptguidexml

2 36

Стиль кодирования проблемы

bull различные стили именования функций и переменных

fnCheckCardsForm() mapDivisTouchDevice() is_okDoOrderAdd()

bull пробелы невпопад и if в одну строку

if( num gt 10 ) doAction( num )

bull повторные var

var field = $(rsquoform[name=order] input[name=name]rsquo)var field = $(rsquoform[name=order] input[name=email]rsquo)

bull var внутри блока

Стиль кодирования проблемы

bull фигурная скобка на следующей строке чреватопроблемами с автоподстановкой

for (prop in locs) function setMarkers(locs)

bull пустые анонимные функции

on(rsquoclickrsquo function() myHandler() )

bull избыточные переменные

var check = (item gt 0)$(rsquoformrsquo)attr( disabled check )

bull выполняемый код в виде строки

setTimeout($(rsquotitle-linkfirstrsquo)click() 100)

Стиль кодирования модулиdefine([ весь код в виде AMD-модулейdep1 зависимости модуляdep2 если мало mdash можно в одну строку

] function (dep1 аргументы аналогично зависимостямdep2

) use strict строгий режим

var num = 0 var всегда в начале функции$form неинициализированные переменныеi в конце списка

function send(mode) внутренняя функция

)

5 36

Стиль кодирования функцииИмена функций и переменных mdash camelCase со строчной буквыникакой венгерской нотации исключение только для $

(function () анонимные функции mdash пробел перед ()

именованные функции - нет пробела перед () и внутриfunction countFields(name where)

var count имена переменных mdash camelCase$form jquery-переменые mdash с $

return count пустая строка перед return

)() замыкание через анонимные функции в скобках

6 36

Стиль кодирования mdash управление

if (length gt 0) пробел перед скобкой но не послеupdate() если в if единственное действие

все равно заключаем в скобки

switch (value) case val1 используем отступы

break

смысловые группы разделяем пробеламиcase val2

break

7 36

Самая Главная Проблема

Copy Paste Copy Paste CopyPaste Copy Paste Copy PasteCopy Paste Copy Paste CopyPaste Copy Paste Copy PasteCopy Paste Copy Paste CopyPaste Copy Paste Copy PasteCopy Paste Copy Paste CopyPaste Copy Paste Copy Paste

jQuery

bull самая популярная JavaScript-библиотекаbull постоянно развивается

10 26082006rarr rarr 16 03052011rarr 17 03112011rarr 18 09082012

bull каждая новая версия в большинстве случаевпроизводительнее и удобнее предыдущей

bull переход обычно не создает проблем

Лучше пользоваться свежей версией

9 36

Селекторы

$(lsquojqueryrsquo)

bull один из основных инструментов jQuerybull разные селекторы mdash один и тот же результатbull разница в скорости может быть очень существеннойbull крайне желательно выбирать оптимальныйbull самый быстрый поиск mdash это отсутствие поиска

Эффективное использование селекторов важно

10 36

Некешируемые селекторы плохо

if ($(rsquoapp-foot-descriptionrsquo)length) $(rsquoapp-foot-descriptionrsquo)click(function()

$(rsquoapp-foot-descriptionrsquo)addClass(rsquoapp-foot-description-activersquo)

)

Селектор используется больше одного раза mdashнадо кешировать

Селекторы

Cамые быстрые mdash getElementById()

$(rsquoElement form inputrsquo)

Достаточно быстрые если есть getElementsByClassName()

$(rsquoclassnamersquo)

Медленные полный просмотр

$([attribute=value]) $(hidden)

Селекторы обрабатываются справа налево Для начинающихсяс id mdash встроенная оптимизация

12 36

Селекторы контекстКонтекст DOM Element или Document или jQuery не строка

Эквивалентная запись поиска в контексте$(rsquohiddenrsquo $(rsquolistrsquo))$(rsquolistrsquo)find(rsquohiddenrsquo) самый быстрый вариант

Поиск только внутри элемента с обработчиком$(rsquodivfoorsquo)on(rsquoclickrsquo function()

$(rsquospanrsquo this)addClass(rsquobarrsquo))

find() рекурсивный может быть выгоднее children() и тд

httpjsperfcomjquery-selectors-context213 36

Селекторы chainingbull большинство методов jQuery возвращают объект jQuerybull не нужны отдельные вызовы даже для кешированногоjQuery

bull работает быстрее чем кешированная версия и легчечитается

$(rsquoulfirstrsquo)find(rsquofoorsquo)css(rsquobackground-colorrsquo rsquoredrsquo)

end()find(rsquobarrsquo)css(rsquobackground-colorrsquo rsquogreenrsquo)

end()

httpjsperfcomjquery-chaining

14 36

События проблемы

bull bind() click() live() bull return falsebull лишние врапперы

lsquoon(rsquoclickrsquo function() myHandler() )lsquo

bull перепривязка событий и избыточное количecтвообработчиков

lsquo$(rsquojs-classrsquo)unbind(rsquoclickrsquo)bind(rsquoclickrsquo function() )

jQuery on()off()Единый рекомендуемый API для работы с событиями в позднихверсиях

единичный обработчик$(rsquobuttonrsquo)on(rsquoclickrsquo function(e)

)

делегирование обработки$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo function(e)

)

$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo key value function(e) consoledebug(edatakey)

)16 36

Делегирование событийПовторная привязка событий после изменения DOM

bull усложняет логику требует запуск дополнительного кодапосле изменения

bull создает избыточное количество обработчиков

Правильно mdash делегирование

bull использует event bubblingbull позволяет установить один обработчик событий а не стоbull работает с элементами DOM которые появились позжеустановки обработчика

$(rsquocontainerrsquo)on(rsquoclickrsquo rsquoelementrsquo) function(e)

17 36

jQuery return false

bull epreventDefault() mdash останавливает обработка поумолчанию

bull estopPropagation() mdash останавливает передачуродительским элементам

bull estopImmediatePropagation() mdash прекращаетвыполнение всех обработчиков для этого элемента

return false = epreventDefault() + estopPropagation()

Рекомендуется не использовать return false а использоватьсоответствующие методы

18 36

jQueryDeferred

bull представление (асинхронного) действия как объектаbull состояния из pending в resolved или rejectedbull для каждого финального состояния можно указать наборобработчиков

bull в финальное состояние завершения можно перейти толькоодин раз

bull если объект уже перешел в финальное состояниедобавляемые обработчики выполняются сразу же

bull AJAX-вызовы возвращают deferred

promise = read-only deferred

19 36

jQueryDeferred пример

function countDown(time)

var timer = $Deferred()setTimeout(function() timerresolve() time)return timerpromise()

var test = countdown(5000)

testdone(function() consoledebug(rsquoTime is uprsquo) )

testdone(function() consoledebug(rsquoBangrsquo) )

20 36

jQueryDeferred APIОбработка завершения

done() успешноеfail() неуспешноеthen() любое

Создание$Deferred конструкторpromise() read-only объект

Завершениеresolve() завешениеreject() неуспешное

Прогрессnotify() уведомление

progress() обработка

Комбинирование

$when() комбинирование с синхронизацией

21 36

jQuerywhen()function getData()

return $get(rsquodatarsquo)success(function() consolelog(rsquoajax donersquo)

function showDiv() return $Deferred(function(d)

$(rsquoblockrsquo)fadeIn(1000 dresolve))promise()

$when(getData() showDiv())then(function(ajaxResult)

consolelog(rsquoall donersquo))

22 36

jQueryDeferred итого

Можно получить более читаемый и легко сопровождаемый код

В нашем случае наиболее наиболее возможное применение

bull синхронизация параллельной анимацииbull синхронизация AJAX-вызовов между собой и другимиоперациями

23 36

AJAX избыточно и неудобно

$ajax(url scripthtmdata Object2Parameters( action rsquoformrsquo )dataType rsquojsonrsquosuccess function (res)

)

AJAX рекомендации

bull используем имя метода для указания типа запросаbull не используем dataType mdash правильный Content-Typeдолжен формироваться на стороне сервера

bull не используем собственных функций формированиястроки данных

bull используем deferreds соответственно done() fail()then()

bull определение запроса и добавление обработчиков можноразделить

bull легко синхронизировать запросы и анимацию

25 36

AJAX пример

var update = $post(rsquoupdatersquo id 1 name name )

updatedone(function (response)

)

updatethen(function (response)

donefunction (response)

fail)

26 36

DOM главная проблема

Очень сложная разметкастили в JavaScript

DOM главная проблема

bull не используем CSS-стили в JavaScriptbull не отрабатываем responsive через JavaScriptbull не кодируем данные в классах (есть data() )bull всегда используем классыbull чем проще разметка тем проще по нейнавигация

Очень важно минимизируем CSSминимизируем верстку иначе проблемынеизбежны

28 36

DOM проблемы

bull разметка смешана с кодом сложно поддерживатьbull ресурсоемкое создание элементов

$(rsquobodyrsquo)prepend($(rsquoltdivgtrsquo)addClass(rsquoapp-loading-wrapperrsquo)prepend(

$(rsquoltdivgtrsquo)addClass(rsquoapp-loading-picturersquo))

$(rsquoltdivgtrsquo)addClass(rsquoapp-button-red app-club-button-addrsquo)prepend($(rsquoltinput type=buttongtrsquo)

attr(value rsquoПроверитьrsquo ))

Работа с DOMДобавление новых узлов в документ mdash дорого

bull используем строки добавляем единственным append()bull стараемся не плодить лишние $()bull сводим количество append() к минимумуbull в сложных случаях можно использовать detach()

var $form = $(rsquoformrsquo)$parent = $formparent()

$formdetach()inputseach(function() $formappend(this) )

$parentappend($form)

30 36

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 3: Эффективный jQuery

Стиль кодирования проблемы

bull различные стили именования функций и переменных

fnCheckCardsForm() mapDivisTouchDevice() is_okDoOrderAdd()

bull пробелы невпопад и if в одну строку

if( num gt 10 ) doAction( num )

bull повторные var

var field = $(rsquoform[name=order] input[name=name]rsquo)var field = $(rsquoform[name=order] input[name=email]rsquo)

bull var внутри блока

Стиль кодирования проблемы

bull фигурная скобка на следующей строке чреватопроблемами с автоподстановкой

for (prop in locs) function setMarkers(locs)

bull пустые анонимные функции

on(rsquoclickrsquo function() myHandler() )

bull избыточные переменные

var check = (item gt 0)$(rsquoformrsquo)attr( disabled check )

bull выполняемый код в виде строки

setTimeout($(rsquotitle-linkfirstrsquo)click() 100)

Стиль кодирования модулиdefine([ весь код в виде AMD-модулейdep1 зависимости модуляdep2 если мало mdash можно в одну строку

] function (dep1 аргументы аналогично зависимостямdep2

) use strict строгий режим

var num = 0 var всегда в начале функции$form неинициализированные переменныеi в конце списка

function send(mode) внутренняя функция

)

5 36

Стиль кодирования функцииИмена функций и переменных mdash camelCase со строчной буквыникакой венгерской нотации исключение только для $

(function () анонимные функции mdash пробел перед ()

именованные функции - нет пробела перед () и внутриfunction countFields(name where)

var count имена переменных mdash camelCase$form jquery-переменые mdash с $

return count пустая строка перед return

)() замыкание через анонимные функции в скобках

6 36

Стиль кодирования mdash управление

if (length gt 0) пробел перед скобкой но не послеupdate() если в if единственное действие

все равно заключаем в скобки

switch (value) case val1 используем отступы

break

смысловые группы разделяем пробеламиcase val2

break

7 36

Самая Главная Проблема

Copy Paste Copy Paste CopyPaste Copy Paste Copy PasteCopy Paste Copy Paste CopyPaste Copy Paste Copy PasteCopy Paste Copy Paste CopyPaste Copy Paste Copy PasteCopy Paste Copy Paste CopyPaste Copy Paste Copy Paste

jQuery

bull самая популярная JavaScript-библиотекаbull постоянно развивается

10 26082006rarr rarr 16 03052011rarr 17 03112011rarr 18 09082012

bull каждая новая версия в большинстве случаевпроизводительнее и удобнее предыдущей

bull переход обычно не создает проблем

Лучше пользоваться свежей версией

9 36

Селекторы

$(lsquojqueryrsquo)

bull один из основных инструментов jQuerybull разные селекторы mdash один и тот же результатbull разница в скорости может быть очень существеннойbull крайне желательно выбирать оптимальныйbull самый быстрый поиск mdash это отсутствие поиска

Эффективное использование селекторов важно

10 36

Некешируемые селекторы плохо

if ($(rsquoapp-foot-descriptionrsquo)length) $(rsquoapp-foot-descriptionrsquo)click(function()

$(rsquoapp-foot-descriptionrsquo)addClass(rsquoapp-foot-description-activersquo)

)

Селектор используется больше одного раза mdashнадо кешировать

Селекторы

Cамые быстрые mdash getElementById()

$(rsquoElement form inputrsquo)

Достаточно быстрые если есть getElementsByClassName()

$(rsquoclassnamersquo)

Медленные полный просмотр

$([attribute=value]) $(hidden)

Селекторы обрабатываются справа налево Для начинающихсяс id mdash встроенная оптимизация

12 36

Селекторы контекстКонтекст DOM Element или Document или jQuery не строка

Эквивалентная запись поиска в контексте$(rsquohiddenrsquo $(rsquolistrsquo))$(rsquolistrsquo)find(rsquohiddenrsquo) самый быстрый вариант

Поиск только внутри элемента с обработчиком$(rsquodivfoorsquo)on(rsquoclickrsquo function()

$(rsquospanrsquo this)addClass(rsquobarrsquo))

find() рекурсивный может быть выгоднее children() и тд

httpjsperfcomjquery-selectors-context213 36

Селекторы chainingbull большинство методов jQuery возвращают объект jQuerybull не нужны отдельные вызовы даже для кешированногоjQuery

bull работает быстрее чем кешированная версия и легчечитается

$(rsquoulfirstrsquo)find(rsquofoorsquo)css(rsquobackground-colorrsquo rsquoredrsquo)

end()find(rsquobarrsquo)css(rsquobackground-colorrsquo rsquogreenrsquo)

end()

httpjsperfcomjquery-chaining

14 36

События проблемы

bull bind() click() live() bull return falsebull лишние врапперы

lsquoon(rsquoclickrsquo function() myHandler() )lsquo

bull перепривязка событий и избыточное количecтвообработчиков

lsquo$(rsquojs-classrsquo)unbind(rsquoclickrsquo)bind(rsquoclickrsquo function() )

jQuery on()off()Единый рекомендуемый API для работы с событиями в позднихверсиях

единичный обработчик$(rsquobuttonrsquo)on(rsquoclickrsquo function(e)

)

делегирование обработки$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo function(e)

)

$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo key value function(e) consoledebug(edatakey)

)16 36

Делегирование событийПовторная привязка событий после изменения DOM

bull усложняет логику требует запуск дополнительного кодапосле изменения

bull создает избыточное количество обработчиков

Правильно mdash делегирование

bull использует event bubblingbull позволяет установить один обработчик событий а не стоbull работает с элементами DOM которые появились позжеустановки обработчика

$(rsquocontainerrsquo)on(rsquoclickrsquo rsquoelementrsquo) function(e)

17 36

jQuery return false

bull epreventDefault() mdash останавливает обработка поумолчанию

bull estopPropagation() mdash останавливает передачуродительским элементам

bull estopImmediatePropagation() mdash прекращаетвыполнение всех обработчиков для этого элемента

return false = epreventDefault() + estopPropagation()

Рекомендуется не использовать return false а использоватьсоответствующие методы

18 36

jQueryDeferred

bull представление (асинхронного) действия как объектаbull состояния из pending в resolved или rejectedbull для каждого финального состояния можно указать наборобработчиков

bull в финальное состояние завершения можно перейти толькоодин раз

bull если объект уже перешел в финальное состояниедобавляемые обработчики выполняются сразу же

bull AJAX-вызовы возвращают deferred

promise = read-only deferred

19 36

jQueryDeferred пример

function countDown(time)

var timer = $Deferred()setTimeout(function() timerresolve() time)return timerpromise()

var test = countdown(5000)

testdone(function() consoledebug(rsquoTime is uprsquo) )

testdone(function() consoledebug(rsquoBangrsquo) )

20 36

jQueryDeferred APIОбработка завершения

done() успешноеfail() неуспешноеthen() любое

Создание$Deferred конструкторpromise() read-only объект

Завершениеresolve() завешениеreject() неуспешное

Прогрессnotify() уведомление

progress() обработка

Комбинирование

$when() комбинирование с синхронизацией

21 36

jQuerywhen()function getData()

return $get(rsquodatarsquo)success(function() consolelog(rsquoajax donersquo)

function showDiv() return $Deferred(function(d)

$(rsquoblockrsquo)fadeIn(1000 dresolve))promise()

$when(getData() showDiv())then(function(ajaxResult)

consolelog(rsquoall donersquo))

22 36

jQueryDeferred итого

Можно получить более читаемый и легко сопровождаемый код

В нашем случае наиболее наиболее возможное применение

bull синхронизация параллельной анимацииbull синхронизация AJAX-вызовов между собой и другимиоперациями

23 36

AJAX избыточно и неудобно

$ajax(url scripthtmdata Object2Parameters( action rsquoformrsquo )dataType rsquojsonrsquosuccess function (res)

)

AJAX рекомендации

bull используем имя метода для указания типа запросаbull не используем dataType mdash правильный Content-Typeдолжен формироваться на стороне сервера

bull не используем собственных функций формированиястроки данных

bull используем deferreds соответственно done() fail()then()

bull определение запроса и добавление обработчиков можноразделить

bull легко синхронизировать запросы и анимацию

25 36

AJAX пример

var update = $post(rsquoupdatersquo id 1 name name )

updatedone(function (response)

)

updatethen(function (response)

donefunction (response)

fail)

26 36

DOM главная проблема

Очень сложная разметкастили в JavaScript

DOM главная проблема

bull не используем CSS-стили в JavaScriptbull не отрабатываем responsive через JavaScriptbull не кодируем данные в классах (есть data() )bull всегда используем классыbull чем проще разметка тем проще по нейнавигация

Очень важно минимизируем CSSминимизируем верстку иначе проблемынеизбежны

28 36

DOM проблемы

bull разметка смешана с кодом сложно поддерживатьbull ресурсоемкое создание элементов

$(rsquobodyrsquo)prepend($(rsquoltdivgtrsquo)addClass(rsquoapp-loading-wrapperrsquo)prepend(

$(rsquoltdivgtrsquo)addClass(rsquoapp-loading-picturersquo))

$(rsquoltdivgtrsquo)addClass(rsquoapp-button-red app-club-button-addrsquo)prepend($(rsquoltinput type=buttongtrsquo)

attr(value rsquoПроверитьrsquo ))

Работа с DOMДобавление новых узлов в документ mdash дорого

bull используем строки добавляем единственным append()bull стараемся не плодить лишние $()bull сводим количество append() к минимумуbull в сложных случаях можно использовать detach()

var $form = $(rsquoformrsquo)$parent = $formparent()

$formdetach()inputseach(function() $formappend(this) )

$parentappend($form)

30 36

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 4: Эффективный jQuery

Стиль кодирования проблемы

bull фигурная скобка на следующей строке чреватопроблемами с автоподстановкой

for (prop in locs) function setMarkers(locs)

bull пустые анонимные функции

on(rsquoclickrsquo function() myHandler() )

bull избыточные переменные

var check = (item gt 0)$(rsquoformrsquo)attr( disabled check )

bull выполняемый код в виде строки

setTimeout($(rsquotitle-linkfirstrsquo)click() 100)

Стиль кодирования модулиdefine([ весь код в виде AMD-модулейdep1 зависимости модуляdep2 если мало mdash можно в одну строку

] function (dep1 аргументы аналогично зависимостямdep2

) use strict строгий режим

var num = 0 var всегда в начале функции$form неинициализированные переменныеi в конце списка

function send(mode) внутренняя функция

)

5 36

Стиль кодирования функцииИмена функций и переменных mdash camelCase со строчной буквыникакой венгерской нотации исключение только для $

(function () анонимные функции mdash пробел перед ()

именованные функции - нет пробела перед () и внутриfunction countFields(name where)

var count имена переменных mdash camelCase$form jquery-переменые mdash с $

return count пустая строка перед return

)() замыкание через анонимные функции в скобках

6 36

Стиль кодирования mdash управление

if (length gt 0) пробел перед скобкой но не послеupdate() если в if единственное действие

все равно заключаем в скобки

switch (value) case val1 используем отступы

break

смысловые группы разделяем пробеламиcase val2

break

7 36

Самая Главная Проблема

Copy Paste Copy Paste CopyPaste Copy Paste Copy PasteCopy Paste Copy Paste CopyPaste Copy Paste Copy PasteCopy Paste Copy Paste CopyPaste Copy Paste Copy PasteCopy Paste Copy Paste CopyPaste Copy Paste Copy Paste

jQuery

bull самая популярная JavaScript-библиотекаbull постоянно развивается

10 26082006rarr rarr 16 03052011rarr 17 03112011rarr 18 09082012

bull каждая новая версия в большинстве случаевпроизводительнее и удобнее предыдущей

bull переход обычно не создает проблем

Лучше пользоваться свежей версией

9 36

Селекторы

$(lsquojqueryrsquo)

bull один из основных инструментов jQuerybull разные селекторы mdash один и тот же результатbull разница в скорости может быть очень существеннойbull крайне желательно выбирать оптимальныйbull самый быстрый поиск mdash это отсутствие поиска

Эффективное использование селекторов важно

10 36

Некешируемые селекторы плохо

if ($(rsquoapp-foot-descriptionrsquo)length) $(rsquoapp-foot-descriptionrsquo)click(function()

$(rsquoapp-foot-descriptionrsquo)addClass(rsquoapp-foot-description-activersquo)

)

Селектор используется больше одного раза mdashнадо кешировать

Селекторы

Cамые быстрые mdash getElementById()

$(rsquoElement form inputrsquo)

Достаточно быстрые если есть getElementsByClassName()

$(rsquoclassnamersquo)

Медленные полный просмотр

$([attribute=value]) $(hidden)

Селекторы обрабатываются справа налево Для начинающихсяс id mdash встроенная оптимизация

12 36

Селекторы контекстКонтекст DOM Element или Document или jQuery не строка

Эквивалентная запись поиска в контексте$(rsquohiddenrsquo $(rsquolistrsquo))$(rsquolistrsquo)find(rsquohiddenrsquo) самый быстрый вариант

Поиск только внутри элемента с обработчиком$(rsquodivfoorsquo)on(rsquoclickrsquo function()

$(rsquospanrsquo this)addClass(rsquobarrsquo))

find() рекурсивный может быть выгоднее children() и тд

httpjsperfcomjquery-selectors-context213 36

Селекторы chainingbull большинство методов jQuery возвращают объект jQuerybull не нужны отдельные вызовы даже для кешированногоjQuery

bull работает быстрее чем кешированная версия и легчечитается

$(rsquoulfirstrsquo)find(rsquofoorsquo)css(rsquobackground-colorrsquo rsquoredrsquo)

end()find(rsquobarrsquo)css(rsquobackground-colorrsquo rsquogreenrsquo)

end()

httpjsperfcomjquery-chaining

14 36

События проблемы

bull bind() click() live() bull return falsebull лишние врапперы

lsquoon(rsquoclickrsquo function() myHandler() )lsquo

bull перепривязка событий и избыточное количecтвообработчиков

lsquo$(rsquojs-classrsquo)unbind(rsquoclickrsquo)bind(rsquoclickrsquo function() )

jQuery on()off()Единый рекомендуемый API для работы с событиями в позднихверсиях

единичный обработчик$(rsquobuttonrsquo)on(rsquoclickrsquo function(e)

)

делегирование обработки$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo function(e)

)

$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo key value function(e) consoledebug(edatakey)

)16 36

Делегирование событийПовторная привязка событий после изменения DOM

bull усложняет логику требует запуск дополнительного кодапосле изменения

bull создает избыточное количество обработчиков

Правильно mdash делегирование

bull использует event bubblingbull позволяет установить один обработчик событий а не стоbull работает с элементами DOM которые появились позжеустановки обработчика

$(rsquocontainerrsquo)on(rsquoclickrsquo rsquoelementrsquo) function(e)

17 36

jQuery return false

bull epreventDefault() mdash останавливает обработка поумолчанию

bull estopPropagation() mdash останавливает передачуродительским элементам

bull estopImmediatePropagation() mdash прекращаетвыполнение всех обработчиков для этого элемента

return false = epreventDefault() + estopPropagation()

Рекомендуется не использовать return false а использоватьсоответствующие методы

18 36

jQueryDeferred

bull представление (асинхронного) действия как объектаbull состояния из pending в resolved или rejectedbull для каждого финального состояния можно указать наборобработчиков

bull в финальное состояние завершения можно перейти толькоодин раз

bull если объект уже перешел в финальное состояниедобавляемые обработчики выполняются сразу же

bull AJAX-вызовы возвращают deferred

promise = read-only deferred

19 36

jQueryDeferred пример

function countDown(time)

var timer = $Deferred()setTimeout(function() timerresolve() time)return timerpromise()

var test = countdown(5000)

testdone(function() consoledebug(rsquoTime is uprsquo) )

testdone(function() consoledebug(rsquoBangrsquo) )

20 36

jQueryDeferred APIОбработка завершения

done() успешноеfail() неуспешноеthen() любое

Создание$Deferred конструкторpromise() read-only объект

Завершениеresolve() завешениеreject() неуспешное

Прогрессnotify() уведомление

progress() обработка

Комбинирование

$when() комбинирование с синхронизацией

21 36

jQuerywhen()function getData()

return $get(rsquodatarsquo)success(function() consolelog(rsquoajax donersquo)

function showDiv() return $Deferred(function(d)

$(rsquoblockrsquo)fadeIn(1000 dresolve))promise()

$when(getData() showDiv())then(function(ajaxResult)

consolelog(rsquoall donersquo))

22 36

jQueryDeferred итого

Можно получить более читаемый и легко сопровождаемый код

В нашем случае наиболее наиболее возможное применение

bull синхронизация параллельной анимацииbull синхронизация AJAX-вызовов между собой и другимиоперациями

23 36

AJAX избыточно и неудобно

$ajax(url scripthtmdata Object2Parameters( action rsquoformrsquo )dataType rsquojsonrsquosuccess function (res)

)

AJAX рекомендации

bull используем имя метода для указания типа запросаbull не используем dataType mdash правильный Content-Typeдолжен формироваться на стороне сервера

bull не используем собственных функций формированиястроки данных

bull используем deferreds соответственно done() fail()then()

bull определение запроса и добавление обработчиков можноразделить

bull легко синхронизировать запросы и анимацию

25 36

AJAX пример

var update = $post(rsquoupdatersquo id 1 name name )

updatedone(function (response)

)

updatethen(function (response)

donefunction (response)

fail)

26 36

DOM главная проблема

Очень сложная разметкастили в JavaScript

DOM главная проблема

bull не используем CSS-стили в JavaScriptbull не отрабатываем responsive через JavaScriptbull не кодируем данные в классах (есть data() )bull всегда используем классыbull чем проще разметка тем проще по нейнавигация

Очень важно минимизируем CSSминимизируем верстку иначе проблемынеизбежны

28 36

DOM проблемы

bull разметка смешана с кодом сложно поддерживатьbull ресурсоемкое создание элементов

$(rsquobodyrsquo)prepend($(rsquoltdivgtrsquo)addClass(rsquoapp-loading-wrapperrsquo)prepend(

$(rsquoltdivgtrsquo)addClass(rsquoapp-loading-picturersquo))

$(rsquoltdivgtrsquo)addClass(rsquoapp-button-red app-club-button-addrsquo)prepend($(rsquoltinput type=buttongtrsquo)

attr(value rsquoПроверитьrsquo ))

Работа с DOMДобавление новых узлов в документ mdash дорого

bull используем строки добавляем единственным append()bull стараемся не плодить лишние $()bull сводим количество append() к минимумуbull в сложных случаях можно использовать detach()

var $form = $(rsquoformrsquo)$parent = $formparent()

$formdetach()inputseach(function() $formappend(this) )

$parentappend($form)

30 36

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 5: Эффективный jQuery

Стиль кодирования модулиdefine([ весь код в виде AMD-модулейdep1 зависимости модуляdep2 если мало mdash можно в одну строку

] function (dep1 аргументы аналогично зависимостямdep2

) use strict строгий режим

var num = 0 var всегда в начале функции$form неинициализированные переменныеi в конце списка

function send(mode) внутренняя функция

)

5 36

Стиль кодирования функцииИмена функций и переменных mdash camelCase со строчной буквыникакой венгерской нотации исключение только для $

(function () анонимные функции mdash пробел перед ()

именованные функции - нет пробела перед () и внутриfunction countFields(name where)

var count имена переменных mdash camelCase$form jquery-переменые mdash с $

return count пустая строка перед return

)() замыкание через анонимные функции в скобках

6 36

Стиль кодирования mdash управление

if (length gt 0) пробел перед скобкой но не послеupdate() если в if единственное действие

все равно заключаем в скобки

switch (value) case val1 используем отступы

break

смысловые группы разделяем пробеламиcase val2

break

7 36

Самая Главная Проблема

Copy Paste Copy Paste CopyPaste Copy Paste Copy PasteCopy Paste Copy Paste CopyPaste Copy Paste Copy PasteCopy Paste Copy Paste CopyPaste Copy Paste Copy PasteCopy Paste Copy Paste CopyPaste Copy Paste Copy Paste

jQuery

bull самая популярная JavaScript-библиотекаbull постоянно развивается

10 26082006rarr rarr 16 03052011rarr 17 03112011rarr 18 09082012

bull каждая новая версия в большинстве случаевпроизводительнее и удобнее предыдущей

bull переход обычно не создает проблем

Лучше пользоваться свежей версией

9 36

Селекторы

$(lsquojqueryrsquo)

bull один из основных инструментов jQuerybull разные селекторы mdash один и тот же результатbull разница в скорости может быть очень существеннойbull крайне желательно выбирать оптимальныйbull самый быстрый поиск mdash это отсутствие поиска

Эффективное использование селекторов важно

10 36

Некешируемые селекторы плохо

if ($(rsquoapp-foot-descriptionrsquo)length) $(rsquoapp-foot-descriptionrsquo)click(function()

$(rsquoapp-foot-descriptionrsquo)addClass(rsquoapp-foot-description-activersquo)

)

Селектор используется больше одного раза mdashнадо кешировать

Селекторы

Cамые быстрые mdash getElementById()

$(rsquoElement form inputrsquo)

Достаточно быстрые если есть getElementsByClassName()

$(rsquoclassnamersquo)

Медленные полный просмотр

$([attribute=value]) $(hidden)

Селекторы обрабатываются справа налево Для начинающихсяс id mdash встроенная оптимизация

12 36

Селекторы контекстКонтекст DOM Element или Document или jQuery не строка

Эквивалентная запись поиска в контексте$(rsquohiddenrsquo $(rsquolistrsquo))$(rsquolistrsquo)find(rsquohiddenrsquo) самый быстрый вариант

Поиск только внутри элемента с обработчиком$(rsquodivfoorsquo)on(rsquoclickrsquo function()

$(rsquospanrsquo this)addClass(rsquobarrsquo))

find() рекурсивный может быть выгоднее children() и тд

httpjsperfcomjquery-selectors-context213 36

Селекторы chainingbull большинство методов jQuery возвращают объект jQuerybull не нужны отдельные вызовы даже для кешированногоjQuery

bull работает быстрее чем кешированная версия и легчечитается

$(rsquoulfirstrsquo)find(rsquofoorsquo)css(rsquobackground-colorrsquo rsquoredrsquo)

end()find(rsquobarrsquo)css(rsquobackground-colorrsquo rsquogreenrsquo)

end()

httpjsperfcomjquery-chaining

14 36

События проблемы

bull bind() click() live() bull return falsebull лишние врапперы

lsquoon(rsquoclickrsquo function() myHandler() )lsquo

bull перепривязка событий и избыточное количecтвообработчиков

lsquo$(rsquojs-classrsquo)unbind(rsquoclickrsquo)bind(rsquoclickrsquo function() )

jQuery on()off()Единый рекомендуемый API для работы с событиями в позднихверсиях

единичный обработчик$(rsquobuttonrsquo)on(rsquoclickrsquo function(e)

)

делегирование обработки$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo function(e)

)

$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo key value function(e) consoledebug(edatakey)

)16 36

Делегирование событийПовторная привязка событий после изменения DOM

bull усложняет логику требует запуск дополнительного кодапосле изменения

bull создает избыточное количество обработчиков

Правильно mdash делегирование

bull использует event bubblingbull позволяет установить один обработчик событий а не стоbull работает с элементами DOM которые появились позжеустановки обработчика

$(rsquocontainerrsquo)on(rsquoclickrsquo rsquoelementrsquo) function(e)

17 36

jQuery return false

bull epreventDefault() mdash останавливает обработка поумолчанию

bull estopPropagation() mdash останавливает передачуродительским элементам

bull estopImmediatePropagation() mdash прекращаетвыполнение всех обработчиков для этого элемента

return false = epreventDefault() + estopPropagation()

Рекомендуется не использовать return false а использоватьсоответствующие методы

18 36

jQueryDeferred

bull представление (асинхронного) действия как объектаbull состояния из pending в resolved или rejectedbull для каждого финального состояния можно указать наборобработчиков

bull в финальное состояние завершения можно перейти толькоодин раз

bull если объект уже перешел в финальное состояниедобавляемые обработчики выполняются сразу же

bull AJAX-вызовы возвращают deferred

promise = read-only deferred

19 36

jQueryDeferred пример

function countDown(time)

var timer = $Deferred()setTimeout(function() timerresolve() time)return timerpromise()

var test = countdown(5000)

testdone(function() consoledebug(rsquoTime is uprsquo) )

testdone(function() consoledebug(rsquoBangrsquo) )

20 36

jQueryDeferred APIОбработка завершения

done() успешноеfail() неуспешноеthen() любое

Создание$Deferred конструкторpromise() read-only объект

Завершениеresolve() завешениеreject() неуспешное

Прогрессnotify() уведомление

progress() обработка

Комбинирование

$when() комбинирование с синхронизацией

21 36

jQuerywhen()function getData()

return $get(rsquodatarsquo)success(function() consolelog(rsquoajax donersquo)

function showDiv() return $Deferred(function(d)

$(rsquoblockrsquo)fadeIn(1000 dresolve))promise()

$when(getData() showDiv())then(function(ajaxResult)

consolelog(rsquoall donersquo))

22 36

jQueryDeferred итого

Можно получить более читаемый и легко сопровождаемый код

В нашем случае наиболее наиболее возможное применение

bull синхронизация параллельной анимацииbull синхронизация AJAX-вызовов между собой и другимиоперациями

23 36

AJAX избыточно и неудобно

$ajax(url scripthtmdata Object2Parameters( action rsquoformrsquo )dataType rsquojsonrsquosuccess function (res)

)

AJAX рекомендации

bull используем имя метода для указания типа запросаbull не используем dataType mdash правильный Content-Typeдолжен формироваться на стороне сервера

bull не используем собственных функций формированиястроки данных

bull используем deferreds соответственно done() fail()then()

bull определение запроса и добавление обработчиков можноразделить

bull легко синхронизировать запросы и анимацию

25 36

AJAX пример

var update = $post(rsquoupdatersquo id 1 name name )

updatedone(function (response)

)

updatethen(function (response)

donefunction (response)

fail)

26 36

DOM главная проблема

Очень сложная разметкастили в JavaScript

DOM главная проблема

bull не используем CSS-стили в JavaScriptbull не отрабатываем responsive через JavaScriptbull не кодируем данные в классах (есть data() )bull всегда используем классыbull чем проще разметка тем проще по нейнавигация

Очень важно минимизируем CSSминимизируем верстку иначе проблемынеизбежны

28 36

DOM проблемы

bull разметка смешана с кодом сложно поддерживатьbull ресурсоемкое создание элементов

$(rsquobodyrsquo)prepend($(rsquoltdivgtrsquo)addClass(rsquoapp-loading-wrapperrsquo)prepend(

$(rsquoltdivgtrsquo)addClass(rsquoapp-loading-picturersquo))

$(rsquoltdivgtrsquo)addClass(rsquoapp-button-red app-club-button-addrsquo)prepend($(rsquoltinput type=buttongtrsquo)

attr(value rsquoПроверитьrsquo ))

Работа с DOMДобавление новых узлов в документ mdash дорого

bull используем строки добавляем единственным append()bull стараемся не плодить лишние $()bull сводим количество append() к минимумуbull в сложных случаях можно использовать detach()

var $form = $(rsquoformrsquo)$parent = $formparent()

$formdetach()inputseach(function() $formappend(this) )

$parentappend($form)

30 36

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 6: Эффективный jQuery

Стиль кодирования функцииИмена функций и переменных mdash camelCase со строчной буквыникакой венгерской нотации исключение только для $

(function () анонимные функции mdash пробел перед ()

именованные функции - нет пробела перед () и внутриfunction countFields(name where)

var count имена переменных mdash camelCase$form jquery-переменые mdash с $

return count пустая строка перед return

)() замыкание через анонимные функции в скобках

6 36

Стиль кодирования mdash управление

if (length gt 0) пробел перед скобкой но не послеupdate() если в if единственное действие

все равно заключаем в скобки

switch (value) case val1 используем отступы

break

смысловые группы разделяем пробеламиcase val2

break

7 36

Самая Главная Проблема

Copy Paste Copy Paste CopyPaste Copy Paste Copy PasteCopy Paste Copy Paste CopyPaste Copy Paste Copy PasteCopy Paste Copy Paste CopyPaste Copy Paste Copy PasteCopy Paste Copy Paste CopyPaste Copy Paste Copy Paste

jQuery

bull самая популярная JavaScript-библиотекаbull постоянно развивается

10 26082006rarr rarr 16 03052011rarr 17 03112011rarr 18 09082012

bull каждая новая версия в большинстве случаевпроизводительнее и удобнее предыдущей

bull переход обычно не создает проблем

Лучше пользоваться свежей версией

9 36

Селекторы

$(lsquojqueryrsquo)

bull один из основных инструментов jQuerybull разные селекторы mdash один и тот же результатbull разница в скорости может быть очень существеннойbull крайне желательно выбирать оптимальныйbull самый быстрый поиск mdash это отсутствие поиска

Эффективное использование селекторов важно

10 36

Некешируемые селекторы плохо

if ($(rsquoapp-foot-descriptionrsquo)length) $(rsquoapp-foot-descriptionrsquo)click(function()

$(rsquoapp-foot-descriptionrsquo)addClass(rsquoapp-foot-description-activersquo)

)

Селектор используется больше одного раза mdashнадо кешировать

Селекторы

Cамые быстрые mdash getElementById()

$(rsquoElement form inputrsquo)

Достаточно быстрые если есть getElementsByClassName()

$(rsquoclassnamersquo)

Медленные полный просмотр

$([attribute=value]) $(hidden)

Селекторы обрабатываются справа налево Для начинающихсяс id mdash встроенная оптимизация

12 36

Селекторы контекстКонтекст DOM Element или Document или jQuery не строка

Эквивалентная запись поиска в контексте$(rsquohiddenrsquo $(rsquolistrsquo))$(rsquolistrsquo)find(rsquohiddenrsquo) самый быстрый вариант

Поиск только внутри элемента с обработчиком$(rsquodivfoorsquo)on(rsquoclickrsquo function()

$(rsquospanrsquo this)addClass(rsquobarrsquo))

find() рекурсивный может быть выгоднее children() и тд

httpjsperfcomjquery-selectors-context213 36

Селекторы chainingbull большинство методов jQuery возвращают объект jQuerybull не нужны отдельные вызовы даже для кешированногоjQuery

bull работает быстрее чем кешированная версия и легчечитается

$(rsquoulfirstrsquo)find(rsquofoorsquo)css(rsquobackground-colorrsquo rsquoredrsquo)

end()find(rsquobarrsquo)css(rsquobackground-colorrsquo rsquogreenrsquo)

end()

httpjsperfcomjquery-chaining

14 36

События проблемы

bull bind() click() live() bull return falsebull лишние врапперы

lsquoon(rsquoclickrsquo function() myHandler() )lsquo

bull перепривязка событий и избыточное количecтвообработчиков

lsquo$(rsquojs-classrsquo)unbind(rsquoclickrsquo)bind(rsquoclickrsquo function() )

jQuery on()off()Единый рекомендуемый API для работы с событиями в позднихверсиях

единичный обработчик$(rsquobuttonrsquo)on(rsquoclickrsquo function(e)

)

делегирование обработки$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo function(e)

)

$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo key value function(e) consoledebug(edatakey)

)16 36

Делегирование событийПовторная привязка событий после изменения DOM

bull усложняет логику требует запуск дополнительного кодапосле изменения

bull создает избыточное количество обработчиков

Правильно mdash делегирование

bull использует event bubblingbull позволяет установить один обработчик событий а не стоbull работает с элементами DOM которые появились позжеустановки обработчика

$(rsquocontainerrsquo)on(rsquoclickrsquo rsquoelementrsquo) function(e)

17 36

jQuery return false

bull epreventDefault() mdash останавливает обработка поумолчанию

bull estopPropagation() mdash останавливает передачуродительским элементам

bull estopImmediatePropagation() mdash прекращаетвыполнение всех обработчиков для этого элемента

return false = epreventDefault() + estopPropagation()

Рекомендуется не использовать return false а использоватьсоответствующие методы

18 36

jQueryDeferred

bull представление (асинхронного) действия как объектаbull состояния из pending в resolved или rejectedbull для каждого финального состояния можно указать наборобработчиков

bull в финальное состояние завершения можно перейти толькоодин раз

bull если объект уже перешел в финальное состояниедобавляемые обработчики выполняются сразу же

bull AJAX-вызовы возвращают deferred

promise = read-only deferred

19 36

jQueryDeferred пример

function countDown(time)

var timer = $Deferred()setTimeout(function() timerresolve() time)return timerpromise()

var test = countdown(5000)

testdone(function() consoledebug(rsquoTime is uprsquo) )

testdone(function() consoledebug(rsquoBangrsquo) )

20 36

jQueryDeferred APIОбработка завершения

done() успешноеfail() неуспешноеthen() любое

Создание$Deferred конструкторpromise() read-only объект

Завершениеresolve() завешениеreject() неуспешное

Прогрессnotify() уведомление

progress() обработка

Комбинирование

$when() комбинирование с синхронизацией

21 36

jQuerywhen()function getData()

return $get(rsquodatarsquo)success(function() consolelog(rsquoajax donersquo)

function showDiv() return $Deferred(function(d)

$(rsquoblockrsquo)fadeIn(1000 dresolve))promise()

$when(getData() showDiv())then(function(ajaxResult)

consolelog(rsquoall donersquo))

22 36

jQueryDeferred итого

Можно получить более читаемый и легко сопровождаемый код

В нашем случае наиболее наиболее возможное применение

bull синхронизация параллельной анимацииbull синхронизация AJAX-вызовов между собой и другимиоперациями

23 36

AJAX избыточно и неудобно

$ajax(url scripthtmdata Object2Parameters( action rsquoformrsquo )dataType rsquojsonrsquosuccess function (res)

)

AJAX рекомендации

bull используем имя метода для указания типа запросаbull не используем dataType mdash правильный Content-Typeдолжен формироваться на стороне сервера

bull не используем собственных функций формированиястроки данных

bull используем deferreds соответственно done() fail()then()

bull определение запроса и добавление обработчиков можноразделить

bull легко синхронизировать запросы и анимацию

25 36

AJAX пример

var update = $post(rsquoupdatersquo id 1 name name )

updatedone(function (response)

)

updatethen(function (response)

donefunction (response)

fail)

26 36

DOM главная проблема

Очень сложная разметкастили в JavaScript

DOM главная проблема

bull не используем CSS-стили в JavaScriptbull не отрабатываем responsive через JavaScriptbull не кодируем данные в классах (есть data() )bull всегда используем классыbull чем проще разметка тем проще по нейнавигация

Очень важно минимизируем CSSминимизируем верстку иначе проблемынеизбежны

28 36

DOM проблемы

bull разметка смешана с кодом сложно поддерживатьbull ресурсоемкое создание элементов

$(rsquobodyrsquo)prepend($(rsquoltdivgtrsquo)addClass(rsquoapp-loading-wrapperrsquo)prepend(

$(rsquoltdivgtrsquo)addClass(rsquoapp-loading-picturersquo))

$(rsquoltdivgtrsquo)addClass(rsquoapp-button-red app-club-button-addrsquo)prepend($(rsquoltinput type=buttongtrsquo)

attr(value rsquoПроверитьrsquo ))

Работа с DOMДобавление новых узлов в документ mdash дорого

bull используем строки добавляем единственным append()bull стараемся не плодить лишние $()bull сводим количество append() к минимумуbull в сложных случаях можно использовать detach()

var $form = $(rsquoformrsquo)$parent = $formparent()

$formdetach()inputseach(function() $formappend(this) )

$parentappend($form)

30 36

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 7: Эффективный jQuery

Стиль кодирования mdash управление

if (length gt 0) пробел перед скобкой но не послеupdate() если в if единственное действие

все равно заключаем в скобки

switch (value) case val1 используем отступы

break

смысловые группы разделяем пробеламиcase val2

break

7 36

Самая Главная Проблема

Copy Paste Copy Paste CopyPaste Copy Paste Copy PasteCopy Paste Copy Paste CopyPaste Copy Paste Copy PasteCopy Paste Copy Paste CopyPaste Copy Paste Copy PasteCopy Paste Copy Paste CopyPaste Copy Paste Copy Paste

jQuery

bull самая популярная JavaScript-библиотекаbull постоянно развивается

10 26082006rarr rarr 16 03052011rarr 17 03112011rarr 18 09082012

bull каждая новая версия в большинстве случаевпроизводительнее и удобнее предыдущей

bull переход обычно не создает проблем

Лучше пользоваться свежей версией

9 36

Селекторы

$(lsquojqueryrsquo)

bull один из основных инструментов jQuerybull разные селекторы mdash один и тот же результатbull разница в скорости может быть очень существеннойbull крайне желательно выбирать оптимальныйbull самый быстрый поиск mdash это отсутствие поиска

Эффективное использование селекторов важно

10 36

Некешируемые селекторы плохо

if ($(rsquoapp-foot-descriptionrsquo)length) $(rsquoapp-foot-descriptionrsquo)click(function()

$(rsquoapp-foot-descriptionrsquo)addClass(rsquoapp-foot-description-activersquo)

)

Селектор используется больше одного раза mdashнадо кешировать

Селекторы

Cамые быстрые mdash getElementById()

$(rsquoElement form inputrsquo)

Достаточно быстрые если есть getElementsByClassName()

$(rsquoclassnamersquo)

Медленные полный просмотр

$([attribute=value]) $(hidden)

Селекторы обрабатываются справа налево Для начинающихсяс id mdash встроенная оптимизация

12 36

Селекторы контекстКонтекст DOM Element или Document или jQuery не строка

Эквивалентная запись поиска в контексте$(rsquohiddenrsquo $(rsquolistrsquo))$(rsquolistrsquo)find(rsquohiddenrsquo) самый быстрый вариант

Поиск только внутри элемента с обработчиком$(rsquodivfoorsquo)on(rsquoclickrsquo function()

$(rsquospanrsquo this)addClass(rsquobarrsquo))

find() рекурсивный может быть выгоднее children() и тд

httpjsperfcomjquery-selectors-context213 36

Селекторы chainingbull большинство методов jQuery возвращают объект jQuerybull не нужны отдельные вызовы даже для кешированногоjQuery

bull работает быстрее чем кешированная версия и легчечитается

$(rsquoulfirstrsquo)find(rsquofoorsquo)css(rsquobackground-colorrsquo rsquoredrsquo)

end()find(rsquobarrsquo)css(rsquobackground-colorrsquo rsquogreenrsquo)

end()

httpjsperfcomjquery-chaining

14 36

События проблемы

bull bind() click() live() bull return falsebull лишние врапперы

lsquoon(rsquoclickrsquo function() myHandler() )lsquo

bull перепривязка событий и избыточное количecтвообработчиков

lsquo$(rsquojs-classrsquo)unbind(rsquoclickrsquo)bind(rsquoclickrsquo function() )

jQuery on()off()Единый рекомендуемый API для работы с событиями в позднихверсиях

единичный обработчик$(rsquobuttonrsquo)on(rsquoclickrsquo function(e)

)

делегирование обработки$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo function(e)

)

$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo key value function(e) consoledebug(edatakey)

)16 36

Делегирование событийПовторная привязка событий после изменения DOM

bull усложняет логику требует запуск дополнительного кодапосле изменения

bull создает избыточное количество обработчиков

Правильно mdash делегирование

bull использует event bubblingbull позволяет установить один обработчик событий а не стоbull работает с элементами DOM которые появились позжеустановки обработчика

$(rsquocontainerrsquo)on(rsquoclickrsquo rsquoelementrsquo) function(e)

17 36

jQuery return false

bull epreventDefault() mdash останавливает обработка поумолчанию

bull estopPropagation() mdash останавливает передачуродительским элементам

bull estopImmediatePropagation() mdash прекращаетвыполнение всех обработчиков для этого элемента

return false = epreventDefault() + estopPropagation()

Рекомендуется не использовать return false а использоватьсоответствующие методы

18 36

jQueryDeferred

bull представление (асинхронного) действия как объектаbull состояния из pending в resolved или rejectedbull для каждого финального состояния можно указать наборобработчиков

bull в финальное состояние завершения можно перейти толькоодин раз

bull если объект уже перешел в финальное состояниедобавляемые обработчики выполняются сразу же

bull AJAX-вызовы возвращают deferred

promise = read-only deferred

19 36

jQueryDeferred пример

function countDown(time)

var timer = $Deferred()setTimeout(function() timerresolve() time)return timerpromise()

var test = countdown(5000)

testdone(function() consoledebug(rsquoTime is uprsquo) )

testdone(function() consoledebug(rsquoBangrsquo) )

20 36

jQueryDeferred APIОбработка завершения

done() успешноеfail() неуспешноеthen() любое

Создание$Deferred конструкторpromise() read-only объект

Завершениеresolve() завешениеreject() неуспешное

Прогрессnotify() уведомление

progress() обработка

Комбинирование

$when() комбинирование с синхронизацией

21 36

jQuerywhen()function getData()

return $get(rsquodatarsquo)success(function() consolelog(rsquoajax donersquo)

function showDiv() return $Deferred(function(d)

$(rsquoblockrsquo)fadeIn(1000 dresolve))promise()

$when(getData() showDiv())then(function(ajaxResult)

consolelog(rsquoall donersquo))

22 36

jQueryDeferred итого

Можно получить более читаемый и легко сопровождаемый код

В нашем случае наиболее наиболее возможное применение

bull синхронизация параллельной анимацииbull синхронизация AJAX-вызовов между собой и другимиоперациями

23 36

AJAX избыточно и неудобно

$ajax(url scripthtmdata Object2Parameters( action rsquoformrsquo )dataType rsquojsonrsquosuccess function (res)

)

AJAX рекомендации

bull используем имя метода для указания типа запросаbull не используем dataType mdash правильный Content-Typeдолжен формироваться на стороне сервера

bull не используем собственных функций формированиястроки данных

bull используем deferreds соответственно done() fail()then()

bull определение запроса и добавление обработчиков можноразделить

bull легко синхронизировать запросы и анимацию

25 36

AJAX пример

var update = $post(rsquoupdatersquo id 1 name name )

updatedone(function (response)

)

updatethen(function (response)

donefunction (response)

fail)

26 36

DOM главная проблема

Очень сложная разметкастили в JavaScript

DOM главная проблема

bull не используем CSS-стили в JavaScriptbull не отрабатываем responsive через JavaScriptbull не кодируем данные в классах (есть data() )bull всегда используем классыbull чем проще разметка тем проще по нейнавигация

Очень важно минимизируем CSSминимизируем верстку иначе проблемынеизбежны

28 36

DOM проблемы

bull разметка смешана с кодом сложно поддерживатьbull ресурсоемкое создание элементов

$(rsquobodyrsquo)prepend($(rsquoltdivgtrsquo)addClass(rsquoapp-loading-wrapperrsquo)prepend(

$(rsquoltdivgtrsquo)addClass(rsquoapp-loading-picturersquo))

$(rsquoltdivgtrsquo)addClass(rsquoapp-button-red app-club-button-addrsquo)prepend($(rsquoltinput type=buttongtrsquo)

attr(value rsquoПроверитьrsquo ))

Работа с DOMДобавление новых узлов в документ mdash дорого

bull используем строки добавляем единственным append()bull стараемся не плодить лишние $()bull сводим количество append() к минимумуbull в сложных случаях можно использовать detach()

var $form = $(rsquoformrsquo)$parent = $formparent()

$formdetach()inputseach(function() $formappend(this) )

$parentappend($form)

30 36

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 8: Эффективный jQuery

Самая Главная Проблема

Copy Paste Copy Paste CopyPaste Copy Paste Copy PasteCopy Paste Copy Paste CopyPaste Copy Paste Copy PasteCopy Paste Copy Paste CopyPaste Copy Paste Copy PasteCopy Paste Copy Paste CopyPaste Copy Paste Copy Paste

jQuery

bull самая популярная JavaScript-библиотекаbull постоянно развивается

10 26082006rarr rarr 16 03052011rarr 17 03112011rarr 18 09082012

bull каждая новая версия в большинстве случаевпроизводительнее и удобнее предыдущей

bull переход обычно не создает проблем

Лучше пользоваться свежей версией

9 36

Селекторы

$(lsquojqueryrsquo)

bull один из основных инструментов jQuerybull разные селекторы mdash один и тот же результатbull разница в скорости может быть очень существеннойbull крайне желательно выбирать оптимальныйbull самый быстрый поиск mdash это отсутствие поиска

Эффективное использование селекторов важно

10 36

Некешируемые селекторы плохо

if ($(rsquoapp-foot-descriptionrsquo)length) $(rsquoapp-foot-descriptionrsquo)click(function()

$(rsquoapp-foot-descriptionrsquo)addClass(rsquoapp-foot-description-activersquo)

)

Селектор используется больше одного раза mdashнадо кешировать

Селекторы

Cамые быстрые mdash getElementById()

$(rsquoElement form inputrsquo)

Достаточно быстрые если есть getElementsByClassName()

$(rsquoclassnamersquo)

Медленные полный просмотр

$([attribute=value]) $(hidden)

Селекторы обрабатываются справа налево Для начинающихсяс id mdash встроенная оптимизация

12 36

Селекторы контекстКонтекст DOM Element или Document или jQuery не строка

Эквивалентная запись поиска в контексте$(rsquohiddenrsquo $(rsquolistrsquo))$(rsquolistrsquo)find(rsquohiddenrsquo) самый быстрый вариант

Поиск только внутри элемента с обработчиком$(rsquodivfoorsquo)on(rsquoclickrsquo function()

$(rsquospanrsquo this)addClass(rsquobarrsquo))

find() рекурсивный может быть выгоднее children() и тд

httpjsperfcomjquery-selectors-context213 36

Селекторы chainingbull большинство методов jQuery возвращают объект jQuerybull не нужны отдельные вызовы даже для кешированногоjQuery

bull работает быстрее чем кешированная версия и легчечитается

$(rsquoulfirstrsquo)find(rsquofoorsquo)css(rsquobackground-colorrsquo rsquoredrsquo)

end()find(rsquobarrsquo)css(rsquobackground-colorrsquo rsquogreenrsquo)

end()

httpjsperfcomjquery-chaining

14 36

События проблемы

bull bind() click() live() bull return falsebull лишние врапперы

lsquoon(rsquoclickrsquo function() myHandler() )lsquo

bull перепривязка событий и избыточное количecтвообработчиков

lsquo$(rsquojs-classrsquo)unbind(rsquoclickrsquo)bind(rsquoclickrsquo function() )

jQuery on()off()Единый рекомендуемый API для работы с событиями в позднихверсиях

единичный обработчик$(rsquobuttonrsquo)on(rsquoclickrsquo function(e)

)

делегирование обработки$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo function(e)

)

$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo key value function(e) consoledebug(edatakey)

)16 36

Делегирование событийПовторная привязка событий после изменения DOM

bull усложняет логику требует запуск дополнительного кодапосле изменения

bull создает избыточное количество обработчиков

Правильно mdash делегирование

bull использует event bubblingbull позволяет установить один обработчик событий а не стоbull работает с элементами DOM которые появились позжеустановки обработчика

$(rsquocontainerrsquo)on(rsquoclickrsquo rsquoelementrsquo) function(e)

17 36

jQuery return false

bull epreventDefault() mdash останавливает обработка поумолчанию

bull estopPropagation() mdash останавливает передачуродительским элементам

bull estopImmediatePropagation() mdash прекращаетвыполнение всех обработчиков для этого элемента

return false = epreventDefault() + estopPropagation()

Рекомендуется не использовать return false а использоватьсоответствующие методы

18 36

jQueryDeferred

bull представление (асинхронного) действия как объектаbull состояния из pending в resolved или rejectedbull для каждого финального состояния можно указать наборобработчиков

bull в финальное состояние завершения можно перейти толькоодин раз

bull если объект уже перешел в финальное состояниедобавляемые обработчики выполняются сразу же

bull AJAX-вызовы возвращают deferred

promise = read-only deferred

19 36

jQueryDeferred пример

function countDown(time)

var timer = $Deferred()setTimeout(function() timerresolve() time)return timerpromise()

var test = countdown(5000)

testdone(function() consoledebug(rsquoTime is uprsquo) )

testdone(function() consoledebug(rsquoBangrsquo) )

20 36

jQueryDeferred APIОбработка завершения

done() успешноеfail() неуспешноеthen() любое

Создание$Deferred конструкторpromise() read-only объект

Завершениеresolve() завешениеreject() неуспешное

Прогрессnotify() уведомление

progress() обработка

Комбинирование

$when() комбинирование с синхронизацией

21 36

jQuerywhen()function getData()

return $get(rsquodatarsquo)success(function() consolelog(rsquoajax donersquo)

function showDiv() return $Deferred(function(d)

$(rsquoblockrsquo)fadeIn(1000 dresolve))promise()

$when(getData() showDiv())then(function(ajaxResult)

consolelog(rsquoall donersquo))

22 36

jQueryDeferred итого

Можно получить более читаемый и легко сопровождаемый код

В нашем случае наиболее наиболее возможное применение

bull синхронизация параллельной анимацииbull синхронизация AJAX-вызовов между собой и другимиоперациями

23 36

AJAX избыточно и неудобно

$ajax(url scripthtmdata Object2Parameters( action rsquoformrsquo )dataType rsquojsonrsquosuccess function (res)

)

AJAX рекомендации

bull используем имя метода для указания типа запросаbull не используем dataType mdash правильный Content-Typeдолжен формироваться на стороне сервера

bull не используем собственных функций формированиястроки данных

bull используем deferreds соответственно done() fail()then()

bull определение запроса и добавление обработчиков можноразделить

bull легко синхронизировать запросы и анимацию

25 36

AJAX пример

var update = $post(rsquoupdatersquo id 1 name name )

updatedone(function (response)

)

updatethen(function (response)

donefunction (response)

fail)

26 36

DOM главная проблема

Очень сложная разметкастили в JavaScript

DOM главная проблема

bull не используем CSS-стили в JavaScriptbull не отрабатываем responsive через JavaScriptbull не кодируем данные в классах (есть data() )bull всегда используем классыbull чем проще разметка тем проще по нейнавигация

Очень важно минимизируем CSSминимизируем верстку иначе проблемынеизбежны

28 36

DOM проблемы

bull разметка смешана с кодом сложно поддерживатьbull ресурсоемкое создание элементов

$(rsquobodyrsquo)prepend($(rsquoltdivgtrsquo)addClass(rsquoapp-loading-wrapperrsquo)prepend(

$(rsquoltdivgtrsquo)addClass(rsquoapp-loading-picturersquo))

$(rsquoltdivgtrsquo)addClass(rsquoapp-button-red app-club-button-addrsquo)prepend($(rsquoltinput type=buttongtrsquo)

attr(value rsquoПроверитьrsquo ))

Работа с DOMДобавление новых узлов в документ mdash дорого

bull используем строки добавляем единственным append()bull стараемся не плодить лишние $()bull сводим количество append() к минимумуbull в сложных случаях можно использовать detach()

var $form = $(rsquoformrsquo)$parent = $formparent()

$formdetach()inputseach(function() $formappend(this) )

$parentappend($form)

30 36

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 9: Эффективный jQuery

jQuery

bull самая популярная JavaScript-библиотекаbull постоянно развивается

10 26082006rarr rarr 16 03052011rarr 17 03112011rarr 18 09082012

bull каждая новая версия в большинстве случаевпроизводительнее и удобнее предыдущей

bull переход обычно не создает проблем

Лучше пользоваться свежей версией

9 36

Селекторы

$(lsquojqueryrsquo)

bull один из основных инструментов jQuerybull разные селекторы mdash один и тот же результатbull разница в скорости может быть очень существеннойbull крайне желательно выбирать оптимальныйbull самый быстрый поиск mdash это отсутствие поиска

Эффективное использование селекторов важно

10 36

Некешируемые селекторы плохо

if ($(rsquoapp-foot-descriptionrsquo)length) $(rsquoapp-foot-descriptionrsquo)click(function()

$(rsquoapp-foot-descriptionrsquo)addClass(rsquoapp-foot-description-activersquo)

)

Селектор используется больше одного раза mdashнадо кешировать

Селекторы

Cамые быстрые mdash getElementById()

$(rsquoElement form inputrsquo)

Достаточно быстрые если есть getElementsByClassName()

$(rsquoclassnamersquo)

Медленные полный просмотр

$([attribute=value]) $(hidden)

Селекторы обрабатываются справа налево Для начинающихсяс id mdash встроенная оптимизация

12 36

Селекторы контекстКонтекст DOM Element или Document или jQuery не строка

Эквивалентная запись поиска в контексте$(rsquohiddenrsquo $(rsquolistrsquo))$(rsquolistrsquo)find(rsquohiddenrsquo) самый быстрый вариант

Поиск только внутри элемента с обработчиком$(rsquodivfoorsquo)on(rsquoclickrsquo function()

$(rsquospanrsquo this)addClass(rsquobarrsquo))

find() рекурсивный может быть выгоднее children() и тд

httpjsperfcomjquery-selectors-context213 36

Селекторы chainingbull большинство методов jQuery возвращают объект jQuerybull не нужны отдельные вызовы даже для кешированногоjQuery

bull работает быстрее чем кешированная версия и легчечитается

$(rsquoulfirstrsquo)find(rsquofoorsquo)css(rsquobackground-colorrsquo rsquoredrsquo)

end()find(rsquobarrsquo)css(rsquobackground-colorrsquo rsquogreenrsquo)

end()

httpjsperfcomjquery-chaining

14 36

События проблемы

bull bind() click() live() bull return falsebull лишние врапперы

lsquoon(rsquoclickrsquo function() myHandler() )lsquo

bull перепривязка событий и избыточное количecтвообработчиков

lsquo$(rsquojs-classrsquo)unbind(rsquoclickrsquo)bind(rsquoclickrsquo function() )

jQuery on()off()Единый рекомендуемый API для работы с событиями в позднихверсиях

единичный обработчик$(rsquobuttonrsquo)on(rsquoclickrsquo function(e)

)

делегирование обработки$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo function(e)

)

$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo key value function(e) consoledebug(edatakey)

)16 36

Делегирование событийПовторная привязка событий после изменения DOM

bull усложняет логику требует запуск дополнительного кодапосле изменения

bull создает избыточное количество обработчиков

Правильно mdash делегирование

bull использует event bubblingbull позволяет установить один обработчик событий а не стоbull работает с элементами DOM которые появились позжеустановки обработчика

$(rsquocontainerrsquo)on(rsquoclickrsquo rsquoelementrsquo) function(e)

17 36

jQuery return false

bull epreventDefault() mdash останавливает обработка поумолчанию

bull estopPropagation() mdash останавливает передачуродительским элементам

bull estopImmediatePropagation() mdash прекращаетвыполнение всех обработчиков для этого элемента

return false = epreventDefault() + estopPropagation()

Рекомендуется не использовать return false а использоватьсоответствующие методы

18 36

jQueryDeferred

bull представление (асинхронного) действия как объектаbull состояния из pending в resolved или rejectedbull для каждого финального состояния можно указать наборобработчиков

bull в финальное состояние завершения можно перейти толькоодин раз

bull если объект уже перешел в финальное состояниедобавляемые обработчики выполняются сразу же

bull AJAX-вызовы возвращают deferred

promise = read-only deferred

19 36

jQueryDeferred пример

function countDown(time)

var timer = $Deferred()setTimeout(function() timerresolve() time)return timerpromise()

var test = countdown(5000)

testdone(function() consoledebug(rsquoTime is uprsquo) )

testdone(function() consoledebug(rsquoBangrsquo) )

20 36

jQueryDeferred APIОбработка завершения

done() успешноеfail() неуспешноеthen() любое

Создание$Deferred конструкторpromise() read-only объект

Завершениеresolve() завешениеreject() неуспешное

Прогрессnotify() уведомление

progress() обработка

Комбинирование

$when() комбинирование с синхронизацией

21 36

jQuerywhen()function getData()

return $get(rsquodatarsquo)success(function() consolelog(rsquoajax donersquo)

function showDiv() return $Deferred(function(d)

$(rsquoblockrsquo)fadeIn(1000 dresolve))promise()

$when(getData() showDiv())then(function(ajaxResult)

consolelog(rsquoall donersquo))

22 36

jQueryDeferred итого

Можно получить более читаемый и легко сопровождаемый код

В нашем случае наиболее наиболее возможное применение

bull синхронизация параллельной анимацииbull синхронизация AJAX-вызовов между собой и другимиоперациями

23 36

AJAX избыточно и неудобно

$ajax(url scripthtmdata Object2Parameters( action rsquoformrsquo )dataType rsquojsonrsquosuccess function (res)

)

AJAX рекомендации

bull используем имя метода для указания типа запросаbull не используем dataType mdash правильный Content-Typeдолжен формироваться на стороне сервера

bull не используем собственных функций формированиястроки данных

bull используем deferreds соответственно done() fail()then()

bull определение запроса и добавление обработчиков можноразделить

bull легко синхронизировать запросы и анимацию

25 36

AJAX пример

var update = $post(rsquoupdatersquo id 1 name name )

updatedone(function (response)

)

updatethen(function (response)

donefunction (response)

fail)

26 36

DOM главная проблема

Очень сложная разметкастили в JavaScript

DOM главная проблема

bull не используем CSS-стили в JavaScriptbull не отрабатываем responsive через JavaScriptbull не кодируем данные в классах (есть data() )bull всегда используем классыbull чем проще разметка тем проще по нейнавигация

Очень важно минимизируем CSSминимизируем верстку иначе проблемынеизбежны

28 36

DOM проблемы

bull разметка смешана с кодом сложно поддерживатьbull ресурсоемкое создание элементов

$(rsquobodyrsquo)prepend($(rsquoltdivgtrsquo)addClass(rsquoapp-loading-wrapperrsquo)prepend(

$(rsquoltdivgtrsquo)addClass(rsquoapp-loading-picturersquo))

$(rsquoltdivgtrsquo)addClass(rsquoapp-button-red app-club-button-addrsquo)prepend($(rsquoltinput type=buttongtrsquo)

attr(value rsquoПроверитьrsquo ))

Работа с DOMДобавление новых узлов в документ mdash дорого

bull используем строки добавляем единственным append()bull стараемся не плодить лишние $()bull сводим количество append() к минимумуbull в сложных случаях можно использовать detach()

var $form = $(rsquoformrsquo)$parent = $formparent()

$formdetach()inputseach(function() $formappend(this) )

$parentappend($form)

30 36

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 10: Эффективный jQuery

Селекторы

$(lsquojqueryrsquo)

bull один из основных инструментов jQuerybull разные селекторы mdash один и тот же результатbull разница в скорости может быть очень существеннойbull крайне желательно выбирать оптимальныйbull самый быстрый поиск mdash это отсутствие поиска

Эффективное использование селекторов важно

10 36

Некешируемые селекторы плохо

if ($(rsquoapp-foot-descriptionrsquo)length) $(rsquoapp-foot-descriptionrsquo)click(function()

$(rsquoapp-foot-descriptionrsquo)addClass(rsquoapp-foot-description-activersquo)

)

Селектор используется больше одного раза mdashнадо кешировать

Селекторы

Cамые быстрые mdash getElementById()

$(rsquoElement form inputrsquo)

Достаточно быстрые если есть getElementsByClassName()

$(rsquoclassnamersquo)

Медленные полный просмотр

$([attribute=value]) $(hidden)

Селекторы обрабатываются справа налево Для начинающихсяс id mdash встроенная оптимизация

12 36

Селекторы контекстКонтекст DOM Element или Document или jQuery не строка

Эквивалентная запись поиска в контексте$(rsquohiddenrsquo $(rsquolistrsquo))$(rsquolistrsquo)find(rsquohiddenrsquo) самый быстрый вариант

Поиск только внутри элемента с обработчиком$(rsquodivfoorsquo)on(rsquoclickrsquo function()

$(rsquospanrsquo this)addClass(rsquobarrsquo))

find() рекурсивный может быть выгоднее children() и тд

httpjsperfcomjquery-selectors-context213 36

Селекторы chainingbull большинство методов jQuery возвращают объект jQuerybull не нужны отдельные вызовы даже для кешированногоjQuery

bull работает быстрее чем кешированная версия и легчечитается

$(rsquoulfirstrsquo)find(rsquofoorsquo)css(rsquobackground-colorrsquo rsquoredrsquo)

end()find(rsquobarrsquo)css(rsquobackground-colorrsquo rsquogreenrsquo)

end()

httpjsperfcomjquery-chaining

14 36

События проблемы

bull bind() click() live() bull return falsebull лишние врапперы

lsquoon(rsquoclickrsquo function() myHandler() )lsquo

bull перепривязка событий и избыточное количecтвообработчиков

lsquo$(rsquojs-classrsquo)unbind(rsquoclickrsquo)bind(rsquoclickrsquo function() )

jQuery on()off()Единый рекомендуемый API для работы с событиями в позднихверсиях

единичный обработчик$(rsquobuttonrsquo)on(rsquoclickrsquo function(e)

)

делегирование обработки$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo function(e)

)

$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo key value function(e) consoledebug(edatakey)

)16 36

Делегирование событийПовторная привязка событий после изменения DOM

bull усложняет логику требует запуск дополнительного кодапосле изменения

bull создает избыточное количество обработчиков

Правильно mdash делегирование

bull использует event bubblingbull позволяет установить один обработчик событий а не стоbull работает с элементами DOM которые появились позжеустановки обработчика

$(rsquocontainerrsquo)on(rsquoclickrsquo rsquoelementrsquo) function(e)

17 36

jQuery return false

bull epreventDefault() mdash останавливает обработка поумолчанию

bull estopPropagation() mdash останавливает передачуродительским элементам

bull estopImmediatePropagation() mdash прекращаетвыполнение всех обработчиков для этого элемента

return false = epreventDefault() + estopPropagation()

Рекомендуется не использовать return false а использоватьсоответствующие методы

18 36

jQueryDeferred

bull представление (асинхронного) действия как объектаbull состояния из pending в resolved или rejectedbull для каждого финального состояния можно указать наборобработчиков

bull в финальное состояние завершения можно перейти толькоодин раз

bull если объект уже перешел в финальное состояниедобавляемые обработчики выполняются сразу же

bull AJAX-вызовы возвращают deferred

promise = read-only deferred

19 36

jQueryDeferred пример

function countDown(time)

var timer = $Deferred()setTimeout(function() timerresolve() time)return timerpromise()

var test = countdown(5000)

testdone(function() consoledebug(rsquoTime is uprsquo) )

testdone(function() consoledebug(rsquoBangrsquo) )

20 36

jQueryDeferred APIОбработка завершения

done() успешноеfail() неуспешноеthen() любое

Создание$Deferred конструкторpromise() read-only объект

Завершениеresolve() завешениеreject() неуспешное

Прогрессnotify() уведомление

progress() обработка

Комбинирование

$when() комбинирование с синхронизацией

21 36

jQuerywhen()function getData()

return $get(rsquodatarsquo)success(function() consolelog(rsquoajax donersquo)

function showDiv() return $Deferred(function(d)

$(rsquoblockrsquo)fadeIn(1000 dresolve))promise()

$when(getData() showDiv())then(function(ajaxResult)

consolelog(rsquoall donersquo))

22 36

jQueryDeferred итого

Можно получить более читаемый и легко сопровождаемый код

В нашем случае наиболее наиболее возможное применение

bull синхронизация параллельной анимацииbull синхронизация AJAX-вызовов между собой и другимиоперациями

23 36

AJAX избыточно и неудобно

$ajax(url scripthtmdata Object2Parameters( action rsquoformrsquo )dataType rsquojsonrsquosuccess function (res)

)

AJAX рекомендации

bull используем имя метода для указания типа запросаbull не используем dataType mdash правильный Content-Typeдолжен формироваться на стороне сервера

bull не используем собственных функций формированиястроки данных

bull используем deferreds соответственно done() fail()then()

bull определение запроса и добавление обработчиков можноразделить

bull легко синхронизировать запросы и анимацию

25 36

AJAX пример

var update = $post(rsquoupdatersquo id 1 name name )

updatedone(function (response)

)

updatethen(function (response)

donefunction (response)

fail)

26 36

DOM главная проблема

Очень сложная разметкастили в JavaScript

DOM главная проблема

bull не используем CSS-стили в JavaScriptbull не отрабатываем responsive через JavaScriptbull не кодируем данные в классах (есть data() )bull всегда используем классыbull чем проще разметка тем проще по нейнавигация

Очень важно минимизируем CSSминимизируем верстку иначе проблемынеизбежны

28 36

DOM проблемы

bull разметка смешана с кодом сложно поддерживатьbull ресурсоемкое создание элементов

$(rsquobodyrsquo)prepend($(rsquoltdivgtrsquo)addClass(rsquoapp-loading-wrapperrsquo)prepend(

$(rsquoltdivgtrsquo)addClass(rsquoapp-loading-picturersquo))

$(rsquoltdivgtrsquo)addClass(rsquoapp-button-red app-club-button-addrsquo)prepend($(rsquoltinput type=buttongtrsquo)

attr(value rsquoПроверитьrsquo ))

Работа с DOMДобавление новых узлов в документ mdash дорого

bull используем строки добавляем единственным append()bull стараемся не плодить лишние $()bull сводим количество append() к минимумуbull в сложных случаях можно использовать detach()

var $form = $(rsquoformrsquo)$parent = $formparent()

$formdetach()inputseach(function() $formappend(this) )

$parentappend($form)

30 36

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 11: Эффективный jQuery

Некешируемые селекторы плохо

if ($(rsquoapp-foot-descriptionrsquo)length) $(rsquoapp-foot-descriptionrsquo)click(function()

$(rsquoapp-foot-descriptionrsquo)addClass(rsquoapp-foot-description-activersquo)

)

Селектор используется больше одного раза mdashнадо кешировать

Селекторы

Cамые быстрые mdash getElementById()

$(rsquoElement form inputrsquo)

Достаточно быстрые если есть getElementsByClassName()

$(rsquoclassnamersquo)

Медленные полный просмотр

$([attribute=value]) $(hidden)

Селекторы обрабатываются справа налево Для начинающихсяс id mdash встроенная оптимизация

12 36

Селекторы контекстКонтекст DOM Element или Document или jQuery не строка

Эквивалентная запись поиска в контексте$(rsquohiddenrsquo $(rsquolistrsquo))$(rsquolistrsquo)find(rsquohiddenrsquo) самый быстрый вариант

Поиск только внутри элемента с обработчиком$(rsquodivfoorsquo)on(rsquoclickrsquo function()

$(rsquospanrsquo this)addClass(rsquobarrsquo))

find() рекурсивный может быть выгоднее children() и тд

httpjsperfcomjquery-selectors-context213 36

Селекторы chainingbull большинство методов jQuery возвращают объект jQuerybull не нужны отдельные вызовы даже для кешированногоjQuery

bull работает быстрее чем кешированная версия и легчечитается

$(rsquoulfirstrsquo)find(rsquofoorsquo)css(rsquobackground-colorrsquo rsquoredrsquo)

end()find(rsquobarrsquo)css(rsquobackground-colorrsquo rsquogreenrsquo)

end()

httpjsperfcomjquery-chaining

14 36

События проблемы

bull bind() click() live() bull return falsebull лишние врапперы

lsquoon(rsquoclickrsquo function() myHandler() )lsquo

bull перепривязка событий и избыточное количecтвообработчиков

lsquo$(rsquojs-classrsquo)unbind(rsquoclickrsquo)bind(rsquoclickrsquo function() )

jQuery on()off()Единый рекомендуемый API для работы с событиями в позднихверсиях

единичный обработчик$(rsquobuttonrsquo)on(rsquoclickrsquo function(e)

)

делегирование обработки$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo function(e)

)

$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo key value function(e) consoledebug(edatakey)

)16 36

Делегирование событийПовторная привязка событий после изменения DOM

bull усложняет логику требует запуск дополнительного кодапосле изменения

bull создает избыточное количество обработчиков

Правильно mdash делегирование

bull использует event bubblingbull позволяет установить один обработчик событий а не стоbull работает с элементами DOM которые появились позжеустановки обработчика

$(rsquocontainerrsquo)on(rsquoclickrsquo rsquoelementrsquo) function(e)

17 36

jQuery return false

bull epreventDefault() mdash останавливает обработка поумолчанию

bull estopPropagation() mdash останавливает передачуродительским элементам

bull estopImmediatePropagation() mdash прекращаетвыполнение всех обработчиков для этого элемента

return false = epreventDefault() + estopPropagation()

Рекомендуется не использовать return false а использоватьсоответствующие методы

18 36

jQueryDeferred

bull представление (асинхронного) действия как объектаbull состояния из pending в resolved или rejectedbull для каждого финального состояния можно указать наборобработчиков

bull в финальное состояние завершения можно перейти толькоодин раз

bull если объект уже перешел в финальное состояниедобавляемые обработчики выполняются сразу же

bull AJAX-вызовы возвращают deferred

promise = read-only deferred

19 36

jQueryDeferred пример

function countDown(time)

var timer = $Deferred()setTimeout(function() timerresolve() time)return timerpromise()

var test = countdown(5000)

testdone(function() consoledebug(rsquoTime is uprsquo) )

testdone(function() consoledebug(rsquoBangrsquo) )

20 36

jQueryDeferred APIОбработка завершения

done() успешноеfail() неуспешноеthen() любое

Создание$Deferred конструкторpromise() read-only объект

Завершениеresolve() завешениеreject() неуспешное

Прогрессnotify() уведомление

progress() обработка

Комбинирование

$when() комбинирование с синхронизацией

21 36

jQuerywhen()function getData()

return $get(rsquodatarsquo)success(function() consolelog(rsquoajax donersquo)

function showDiv() return $Deferred(function(d)

$(rsquoblockrsquo)fadeIn(1000 dresolve))promise()

$when(getData() showDiv())then(function(ajaxResult)

consolelog(rsquoall donersquo))

22 36

jQueryDeferred итого

Можно получить более читаемый и легко сопровождаемый код

В нашем случае наиболее наиболее возможное применение

bull синхронизация параллельной анимацииbull синхронизация AJAX-вызовов между собой и другимиоперациями

23 36

AJAX избыточно и неудобно

$ajax(url scripthtmdata Object2Parameters( action rsquoformrsquo )dataType rsquojsonrsquosuccess function (res)

)

AJAX рекомендации

bull используем имя метода для указания типа запросаbull не используем dataType mdash правильный Content-Typeдолжен формироваться на стороне сервера

bull не используем собственных функций формированиястроки данных

bull используем deferreds соответственно done() fail()then()

bull определение запроса и добавление обработчиков можноразделить

bull легко синхронизировать запросы и анимацию

25 36

AJAX пример

var update = $post(rsquoupdatersquo id 1 name name )

updatedone(function (response)

)

updatethen(function (response)

donefunction (response)

fail)

26 36

DOM главная проблема

Очень сложная разметкастили в JavaScript

DOM главная проблема

bull не используем CSS-стили в JavaScriptbull не отрабатываем responsive через JavaScriptbull не кодируем данные в классах (есть data() )bull всегда используем классыbull чем проще разметка тем проще по нейнавигация

Очень важно минимизируем CSSминимизируем верстку иначе проблемынеизбежны

28 36

DOM проблемы

bull разметка смешана с кодом сложно поддерживатьbull ресурсоемкое создание элементов

$(rsquobodyrsquo)prepend($(rsquoltdivgtrsquo)addClass(rsquoapp-loading-wrapperrsquo)prepend(

$(rsquoltdivgtrsquo)addClass(rsquoapp-loading-picturersquo))

$(rsquoltdivgtrsquo)addClass(rsquoapp-button-red app-club-button-addrsquo)prepend($(rsquoltinput type=buttongtrsquo)

attr(value rsquoПроверитьrsquo ))

Работа с DOMДобавление новых узлов в документ mdash дорого

bull используем строки добавляем единственным append()bull стараемся не плодить лишние $()bull сводим количество append() к минимумуbull в сложных случаях можно использовать detach()

var $form = $(rsquoformrsquo)$parent = $formparent()

$formdetach()inputseach(function() $formappend(this) )

$parentappend($form)

30 36

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 12: Эффективный jQuery

Селекторы

Cамые быстрые mdash getElementById()

$(rsquoElement form inputrsquo)

Достаточно быстрые если есть getElementsByClassName()

$(rsquoclassnamersquo)

Медленные полный просмотр

$([attribute=value]) $(hidden)

Селекторы обрабатываются справа налево Для начинающихсяс id mdash встроенная оптимизация

12 36

Селекторы контекстКонтекст DOM Element или Document или jQuery не строка

Эквивалентная запись поиска в контексте$(rsquohiddenrsquo $(rsquolistrsquo))$(rsquolistrsquo)find(rsquohiddenrsquo) самый быстрый вариант

Поиск только внутри элемента с обработчиком$(rsquodivfoorsquo)on(rsquoclickrsquo function()

$(rsquospanrsquo this)addClass(rsquobarrsquo))

find() рекурсивный может быть выгоднее children() и тд

httpjsperfcomjquery-selectors-context213 36

Селекторы chainingbull большинство методов jQuery возвращают объект jQuerybull не нужны отдельные вызовы даже для кешированногоjQuery

bull работает быстрее чем кешированная версия и легчечитается

$(rsquoulfirstrsquo)find(rsquofoorsquo)css(rsquobackground-colorrsquo rsquoredrsquo)

end()find(rsquobarrsquo)css(rsquobackground-colorrsquo rsquogreenrsquo)

end()

httpjsperfcomjquery-chaining

14 36

События проблемы

bull bind() click() live() bull return falsebull лишние врапперы

lsquoon(rsquoclickrsquo function() myHandler() )lsquo

bull перепривязка событий и избыточное количecтвообработчиков

lsquo$(rsquojs-classrsquo)unbind(rsquoclickrsquo)bind(rsquoclickrsquo function() )

jQuery on()off()Единый рекомендуемый API для работы с событиями в позднихверсиях

единичный обработчик$(rsquobuttonrsquo)on(rsquoclickrsquo function(e)

)

делегирование обработки$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo function(e)

)

$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo key value function(e) consoledebug(edatakey)

)16 36

Делегирование событийПовторная привязка событий после изменения DOM

bull усложняет логику требует запуск дополнительного кодапосле изменения

bull создает избыточное количество обработчиков

Правильно mdash делегирование

bull использует event bubblingbull позволяет установить один обработчик событий а не стоbull работает с элементами DOM которые появились позжеустановки обработчика

$(rsquocontainerrsquo)on(rsquoclickrsquo rsquoelementrsquo) function(e)

17 36

jQuery return false

bull epreventDefault() mdash останавливает обработка поумолчанию

bull estopPropagation() mdash останавливает передачуродительским элементам

bull estopImmediatePropagation() mdash прекращаетвыполнение всех обработчиков для этого элемента

return false = epreventDefault() + estopPropagation()

Рекомендуется не использовать return false а использоватьсоответствующие методы

18 36

jQueryDeferred

bull представление (асинхронного) действия как объектаbull состояния из pending в resolved или rejectedbull для каждого финального состояния можно указать наборобработчиков

bull в финальное состояние завершения можно перейти толькоодин раз

bull если объект уже перешел в финальное состояниедобавляемые обработчики выполняются сразу же

bull AJAX-вызовы возвращают deferred

promise = read-only deferred

19 36

jQueryDeferred пример

function countDown(time)

var timer = $Deferred()setTimeout(function() timerresolve() time)return timerpromise()

var test = countdown(5000)

testdone(function() consoledebug(rsquoTime is uprsquo) )

testdone(function() consoledebug(rsquoBangrsquo) )

20 36

jQueryDeferred APIОбработка завершения

done() успешноеfail() неуспешноеthen() любое

Создание$Deferred конструкторpromise() read-only объект

Завершениеresolve() завешениеreject() неуспешное

Прогрессnotify() уведомление

progress() обработка

Комбинирование

$when() комбинирование с синхронизацией

21 36

jQuerywhen()function getData()

return $get(rsquodatarsquo)success(function() consolelog(rsquoajax donersquo)

function showDiv() return $Deferred(function(d)

$(rsquoblockrsquo)fadeIn(1000 dresolve))promise()

$when(getData() showDiv())then(function(ajaxResult)

consolelog(rsquoall donersquo))

22 36

jQueryDeferred итого

Можно получить более читаемый и легко сопровождаемый код

В нашем случае наиболее наиболее возможное применение

bull синхронизация параллельной анимацииbull синхронизация AJAX-вызовов между собой и другимиоперациями

23 36

AJAX избыточно и неудобно

$ajax(url scripthtmdata Object2Parameters( action rsquoformrsquo )dataType rsquojsonrsquosuccess function (res)

)

AJAX рекомендации

bull используем имя метода для указания типа запросаbull не используем dataType mdash правильный Content-Typeдолжен формироваться на стороне сервера

bull не используем собственных функций формированиястроки данных

bull используем deferreds соответственно done() fail()then()

bull определение запроса и добавление обработчиков можноразделить

bull легко синхронизировать запросы и анимацию

25 36

AJAX пример

var update = $post(rsquoupdatersquo id 1 name name )

updatedone(function (response)

)

updatethen(function (response)

donefunction (response)

fail)

26 36

DOM главная проблема

Очень сложная разметкастили в JavaScript

DOM главная проблема

bull не используем CSS-стили в JavaScriptbull не отрабатываем responsive через JavaScriptbull не кодируем данные в классах (есть data() )bull всегда используем классыbull чем проще разметка тем проще по нейнавигация

Очень важно минимизируем CSSминимизируем верстку иначе проблемынеизбежны

28 36

DOM проблемы

bull разметка смешана с кодом сложно поддерживатьbull ресурсоемкое создание элементов

$(rsquobodyrsquo)prepend($(rsquoltdivgtrsquo)addClass(rsquoapp-loading-wrapperrsquo)prepend(

$(rsquoltdivgtrsquo)addClass(rsquoapp-loading-picturersquo))

$(rsquoltdivgtrsquo)addClass(rsquoapp-button-red app-club-button-addrsquo)prepend($(rsquoltinput type=buttongtrsquo)

attr(value rsquoПроверитьrsquo ))

Работа с DOMДобавление новых узлов в документ mdash дорого

bull используем строки добавляем единственным append()bull стараемся не плодить лишние $()bull сводим количество append() к минимумуbull в сложных случаях можно использовать detach()

var $form = $(rsquoformrsquo)$parent = $formparent()

$formdetach()inputseach(function() $formappend(this) )

$parentappend($form)

30 36

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 13: Эффективный jQuery

Селекторы контекстКонтекст DOM Element или Document или jQuery не строка

Эквивалентная запись поиска в контексте$(rsquohiddenrsquo $(rsquolistrsquo))$(rsquolistrsquo)find(rsquohiddenrsquo) самый быстрый вариант

Поиск только внутри элемента с обработчиком$(rsquodivfoorsquo)on(rsquoclickrsquo function()

$(rsquospanrsquo this)addClass(rsquobarrsquo))

find() рекурсивный может быть выгоднее children() и тд

httpjsperfcomjquery-selectors-context213 36

Селекторы chainingbull большинство методов jQuery возвращают объект jQuerybull не нужны отдельные вызовы даже для кешированногоjQuery

bull работает быстрее чем кешированная версия и легчечитается

$(rsquoulfirstrsquo)find(rsquofoorsquo)css(rsquobackground-colorrsquo rsquoredrsquo)

end()find(rsquobarrsquo)css(rsquobackground-colorrsquo rsquogreenrsquo)

end()

httpjsperfcomjquery-chaining

14 36

События проблемы

bull bind() click() live() bull return falsebull лишние врапперы

lsquoon(rsquoclickrsquo function() myHandler() )lsquo

bull перепривязка событий и избыточное количecтвообработчиков

lsquo$(rsquojs-classrsquo)unbind(rsquoclickrsquo)bind(rsquoclickrsquo function() )

jQuery on()off()Единый рекомендуемый API для работы с событиями в позднихверсиях

единичный обработчик$(rsquobuttonrsquo)on(rsquoclickrsquo function(e)

)

делегирование обработки$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo function(e)

)

$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo key value function(e) consoledebug(edatakey)

)16 36

Делегирование событийПовторная привязка событий после изменения DOM

bull усложняет логику требует запуск дополнительного кодапосле изменения

bull создает избыточное количество обработчиков

Правильно mdash делегирование

bull использует event bubblingbull позволяет установить один обработчик событий а не стоbull работает с элементами DOM которые появились позжеустановки обработчика

$(rsquocontainerrsquo)on(rsquoclickrsquo rsquoelementrsquo) function(e)

17 36

jQuery return false

bull epreventDefault() mdash останавливает обработка поумолчанию

bull estopPropagation() mdash останавливает передачуродительским элементам

bull estopImmediatePropagation() mdash прекращаетвыполнение всех обработчиков для этого элемента

return false = epreventDefault() + estopPropagation()

Рекомендуется не использовать return false а использоватьсоответствующие методы

18 36

jQueryDeferred

bull представление (асинхронного) действия как объектаbull состояния из pending в resolved или rejectedbull для каждого финального состояния можно указать наборобработчиков

bull в финальное состояние завершения можно перейти толькоодин раз

bull если объект уже перешел в финальное состояниедобавляемые обработчики выполняются сразу же

bull AJAX-вызовы возвращают deferred

promise = read-only deferred

19 36

jQueryDeferred пример

function countDown(time)

var timer = $Deferred()setTimeout(function() timerresolve() time)return timerpromise()

var test = countdown(5000)

testdone(function() consoledebug(rsquoTime is uprsquo) )

testdone(function() consoledebug(rsquoBangrsquo) )

20 36

jQueryDeferred APIОбработка завершения

done() успешноеfail() неуспешноеthen() любое

Создание$Deferred конструкторpromise() read-only объект

Завершениеresolve() завешениеreject() неуспешное

Прогрессnotify() уведомление

progress() обработка

Комбинирование

$when() комбинирование с синхронизацией

21 36

jQuerywhen()function getData()

return $get(rsquodatarsquo)success(function() consolelog(rsquoajax donersquo)

function showDiv() return $Deferred(function(d)

$(rsquoblockrsquo)fadeIn(1000 dresolve))promise()

$when(getData() showDiv())then(function(ajaxResult)

consolelog(rsquoall donersquo))

22 36

jQueryDeferred итого

Можно получить более читаемый и легко сопровождаемый код

В нашем случае наиболее наиболее возможное применение

bull синхронизация параллельной анимацииbull синхронизация AJAX-вызовов между собой и другимиоперациями

23 36

AJAX избыточно и неудобно

$ajax(url scripthtmdata Object2Parameters( action rsquoformrsquo )dataType rsquojsonrsquosuccess function (res)

)

AJAX рекомендации

bull используем имя метода для указания типа запросаbull не используем dataType mdash правильный Content-Typeдолжен формироваться на стороне сервера

bull не используем собственных функций формированиястроки данных

bull используем deferreds соответственно done() fail()then()

bull определение запроса и добавление обработчиков можноразделить

bull легко синхронизировать запросы и анимацию

25 36

AJAX пример

var update = $post(rsquoupdatersquo id 1 name name )

updatedone(function (response)

)

updatethen(function (response)

donefunction (response)

fail)

26 36

DOM главная проблема

Очень сложная разметкастили в JavaScript

DOM главная проблема

bull не используем CSS-стили в JavaScriptbull не отрабатываем responsive через JavaScriptbull не кодируем данные в классах (есть data() )bull всегда используем классыbull чем проще разметка тем проще по нейнавигация

Очень важно минимизируем CSSминимизируем верстку иначе проблемынеизбежны

28 36

DOM проблемы

bull разметка смешана с кодом сложно поддерживатьbull ресурсоемкое создание элементов

$(rsquobodyrsquo)prepend($(rsquoltdivgtrsquo)addClass(rsquoapp-loading-wrapperrsquo)prepend(

$(rsquoltdivgtrsquo)addClass(rsquoapp-loading-picturersquo))

$(rsquoltdivgtrsquo)addClass(rsquoapp-button-red app-club-button-addrsquo)prepend($(rsquoltinput type=buttongtrsquo)

attr(value rsquoПроверитьrsquo ))

Работа с DOMДобавление новых узлов в документ mdash дорого

bull используем строки добавляем единственным append()bull стараемся не плодить лишние $()bull сводим количество append() к минимумуbull в сложных случаях можно использовать detach()

var $form = $(rsquoformrsquo)$parent = $formparent()

$formdetach()inputseach(function() $formappend(this) )

$parentappend($form)

30 36

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 14: Эффективный jQuery

Селекторы chainingbull большинство методов jQuery возвращают объект jQuerybull не нужны отдельные вызовы даже для кешированногоjQuery

bull работает быстрее чем кешированная версия и легчечитается

$(rsquoulfirstrsquo)find(rsquofoorsquo)css(rsquobackground-colorrsquo rsquoredrsquo)

end()find(rsquobarrsquo)css(rsquobackground-colorrsquo rsquogreenrsquo)

end()

httpjsperfcomjquery-chaining

14 36

События проблемы

bull bind() click() live() bull return falsebull лишние врапперы

lsquoon(rsquoclickrsquo function() myHandler() )lsquo

bull перепривязка событий и избыточное количecтвообработчиков

lsquo$(rsquojs-classrsquo)unbind(rsquoclickrsquo)bind(rsquoclickrsquo function() )

jQuery on()off()Единый рекомендуемый API для работы с событиями в позднихверсиях

единичный обработчик$(rsquobuttonrsquo)on(rsquoclickrsquo function(e)

)

делегирование обработки$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo function(e)

)

$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo key value function(e) consoledebug(edatakey)

)16 36

Делегирование событийПовторная привязка событий после изменения DOM

bull усложняет логику требует запуск дополнительного кодапосле изменения

bull создает избыточное количество обработчиков

Правильно mdash делегирование

bull использует event bubblingbull позволяет установить один обработчик событий а не стоbull работает с элементами DOM которые появились позжеустановки обработчика

$(rsquocontainerrsquo)on(rsquoclickrsquo rsquoelementrsquo) function(e)

17 36

jQuery return false

bull epreventDefault() mdash останавливает обработка поумолчанию

bull estopPropagation() mdash останавливает передачуродительским элементам

bull estopImmediatePropagation() mdash прекращаетвыполнение всех обработчиков для этого элемента

return false = epreventDefault() + estopPropagation()

Рекомендуется не использовать return false а использоватьсоответствующие методы

18 36

jQueryDeferred

bull представление (асинхронного) действия как объектаbull состояния из pending в resolved или rejectedbull для каждого финального состояния можно указать наборобработчиков

bull в финальное состояние завершения можно перейти толькоодин раз

bull если объект уже перешел в финальное состояниедобавляемые обработчики выполняются сразу же

bull AJAX-вызовы возвращают deferred

promise = read-only deferred

19 36

jQueryDeferred пример

function countDown(time)

var timer = $Deferred()setTimeout(function() timerresolve() time)return timerpromise()

var test = countdown(5000)

testdone(function() consoledebug(rsquoTime is uprsquo) )

testdone(function() consoledebug(rsquoBangrsquo) )

20 36

jQueryDeferred APIОбработка завершения

done() успешноеfail() неуспешноеthen() любое

Создание$Deferred конструкторpromise() read-only объект

Завершениеresolve() завешениеreject() неуспешное

Прогрессnotify() уведомление

progress() обработка

Комбинирование

$when() комбинирование с синхронизацией

21 36

jQuerywhen()function getData()

return $get(rsquodatarsquo)success(function() consolelog(rsquoajax donersquo)

function showDiv() return $Deferred(function(d)

$(rsquoblockrsquo)fadeIn(1000 dresolve))promise()

$when(getData() showDiv())then(function(ajaxResult)

consolelog(rsquoall donersquo))

22 36

jQueryDeferred итого

Можно получить более читаемый и легко сопровождаемый код

В нашем случае наиболее наиболее возможное применение

bull синхронизация параллельной анимацииbull синхронизация AJAX-вызовов между собой и другимиоперациями

23 36

AJAX избыточно и неудобно

$ajax(url scripthtmdata Object2Parameters( action rsquoformrsquo )dataType rsquojsonrsquosuccess function (res)

)

AJAX рекомендации

bull используем имя метода для указания типа запросаbull не используем dataType mdash правильный Content-Typeдолжен формироваться на стороне сервера

bull не используем собственных функций формированиястроки данных

bull используем deferreds соответственно done() fail()then()

bull определение запроса и добавление обработчиков можноразделить

bull легко синхронизировать запросы и анимацию

25 36

AJAX пример

var update = $post(rsquoupdatersquo id 1 name name )

updatedone(function (response)

)

updatethen(function (response)

donefunction (response)

fail)

26 36

DOM главная проблема

Очень сложная разметкастили в JavaScript

DOM главная проблема

bull не используем CSS-стили в JavaScriptbull не отрабатываем responsive через JavaScriptbull не кодируем данные в классах (есть data() )bull всегда используем классыbull чем проще разметка тем проще по нейнавигация

Очень важно минимизируем CSSминимизируем верстку иначе проблемынеизбежны

28 36

DOM проблемы

bull разметка смешана с кодом сложно поддерживатьbull ресурсоемкое создание элементов

$(rsquobodyrsquo)prepend($(rsquoltdivgtrsquo)addClass(rsquoapp-loading-wrapperrsquo)prepend(

$(rsquoltdivgtrsquo)addClass(rsquoapp-loading-picturersquo))

$(rsquoltdivgtrsquo)addClass(rsquoapp-button-red app-club-button-addrsquo)prepend($(rsquoltinput type=buttongtrsquo)

attr(value rsquoПроверитьrsquo ))

Работа с DOMДобавление новых узлов в документ mdash дорого

bull используем строки добавляем единственным append()bull стараемся не плодить лишние $()bull сводим количество append() к минимумуbull в сложных случаях можно использовать detach()

var $form = $(rsquoformrsquo)$parent = $formparent()

$formdetach()inputseach(function() $formappend(this) )

$parentappend($form)

30 36

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 15: Эффективный jQuery

События проблемы

bull bind() click() live() bull return falsebull лишние врапперы

lsquoon(rsquoclickrsquo function() myHandler() )lsquo

bull перепривязка событий и избыточное количecтвообработчиков

lsquo$(rsquojs-classrsquo)unbind(rsquoclickrsquo)bind(rsquoclickrsquo function() )

jQuery on()off()Единый рекомендуемый API для работы с событиями в позднихверсиях

единичный обработчик$(rsquobuttonrsquo)on(rsquoclickrsquo function(e)

)

делегирование обработки$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo function(e)

)

$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo key value function(e) consoledebug(edatakey)

)16 36

Делегирование событийПовторная привязка событий после изменения DOM

bull усложняет логику требует запуск дополнительного кодапосле изменения

bull создает избыточное количество обработчиков

Правильно mdash делегирование

bull использует event bubblingbull позволяет установить один обработчик событий а не стоbull работает с элементами DOM которые появились позжеустановки обработчика

$(rsquocontainerrsquo)on(rsquoclickrsquo rsquoelementrsquo) function(e)

17 36

jQuery return false

bull epreventDefault() mdash останавливает обработка поумолчанию

bull estopPropagation() mdash останавливает передачуродительским элементам

bull estopImmediatePropagation() mdash прекращаетвыполнение всех обработчиков для этого элемента

return false = epreventDefault() + estopPropagation()

Рекомендуется не использовать return false а использоватьсоответствующие методы

18 36

jQueryDeferred

bull представление (асинхронного) действия как объектаbull состояния из pending в resolved или rejectedbull для каждого финального состояния можно указать наборобработчиков

bull в финальное состояние завершения можно перейти толькоодин раз

bull если объект уже перешел в финальное состояниедобавляемые обработчики выполняются сразу же

bull AJAX-вызовы возвращают deferred

promise = read-only deferred

19 36

jQueryDeferred пример

function countDown(time)

var timer = $Deferred()setTimeout(function() timerresolve() time)return timerpromise()

var test = countdown(5000)

testdone(function() consoledebug(rsquoTime is uprsquo) )

testdone(function() consoledebug(rsquoBangrsquo) )

20 36

jQueryDeferred APIОбработка завершения

done() успешноеfail() неуспешноеthen() любое

Создание$Deferred конструкторpromise() read-only объект

Завершениеresolve() завешениеreject() неуспешное

Прогрессnotify() уведомление

progress() обработка

Комбинирование

$when() комбинирование с синхронизацией

21 36

jQuerywhen()function getData()

return $get(rsquodatarsquo)success(function() consolelog(rsquoajax donersquo)

function showDiv() return $Deferred(function(d)

$(rsquoblockrsquo)fadeIn(1000 dresolve))promise()

$when(getData() showDiv())then(function(ajaxResult)

consolelog(rsquoall donersquo))

22 36

jQueryDeferred итого

Можно получить более читаемый и легко сопровождаемый код

В нашем случае наиболее наиболее возможное применение

bull синхронизация параллельной анимацииbull синхронизация AJAX-вызовов между собой и другимиоперациями

23 36

AJAX избыточно и неудобно

$ajax(url scripthtmdata Object2Parameters( action rsquoformrsquo )dataType rsquojsonrsquosuccess function (res)

)

AJAX рекомендации

bull используем имя метода для указания типа запросаbull не используем dataType mdash правильный Content-Typeдолжен формироваться на стороне сервера

bull не используем собственных функций формированиястроки данных

bull используем deferreds соответственно done() fail()then()

bull определение запроса и добавление обработчиков можноразделить

bull легко синхронизировать запросы и анимацию

25 36

AJAX пример

var update = $post(rsquoupdatersquo id 1 name name )

updatedone(function (response)

)

updatethen(function (response)

donefunction (response)

fail)

26 36

DOM главная проблема

Очень сложная разметкастили в JavaScript

DOM главная проблема

bull не используем CSS-стили в JavaScriptbull не отрабатываем responsive через JavaScriptbull не кодируем данные в классах (есть data() )bull всегда используем классыbull чем проще разметка тем проще по нейнавигация

Очень важно минимизируем CSSминимизируем верстку иначе проблемынеизбежны

28 36

DOM проблемы

bull разметка смешана с кодом сложно поддерживатьbull ресурсоемкое создание элементов

$(rsquobodyrsquo)prepend($(rsquoltdivgtrsquo)addClass(rsquoapp-loading-wrapperrsquo)prepend(

$(rsquoltdivgtrsquo)addClass(rsquoapp-loading-picturersquo))

$(rsquoltdivgtrsquo)addClass(rsquoapp-button-red app-club-button-addrsquo)prepend($(rsquoltinput type=buttongtrsquo)

attr(value rsquoПроверитьrsquo ))

Работа с DOMДобавление новых узлов в документ mdash дорого

bull используем строки добавляем единственным append()bull стараемся не плодить лишние $()bull сводим количество append() к минимумуbull в сложных случаях можно использовать detach()

var $form = $(rsquoformrsquo)$parent = $formparent()

$formdetach()inputseach(function() $formappend(this) )

$parentappend($form)

30 36

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 16: Эффективный jQuery

jQuery on()off()Единый рекомендуемый API для работы с событиями в позднихверсиях

единичный обработчик$(rsquobuttonrsquo)on(rsquoclickrsquo function(e)

)

делегирование обработки$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo function(e)

)

$(rsquotoolbarrsquo)on(rsquoclickrsquo rsquoarsquo key value function(e) consoledebug(edatakey)

)16 36

Делегирование событийПовторная привязка событий после изменения DOM

bull усложняет логику требует запуск дополнительного кодапосле изменения

bull создает избыточное количество обработчиков

Правильно mdash делегирование

bull использует event bubblingbull позволяет установить один обработчик событий а не стоbull работает с элементами DOM которые появились позжеустановки обработчика

$(rsquocontainerrsquo)on(rsquoclickrsquo rsquoelementrsquo) function(e)

17 36

jQuery return false

bull epreventDefault() mdash останавливает обработка поумолчанию

bull estopPropagation() mdash останавливает передачуродительским элементам

bull estopImmediatePropagation() mdash прекращаетвыполнение всех обработчиков для этого элемента

return false = epreventDefault() + estopPropagation()

Рекомендуется не использовать return false а использоватьсоответствующие методы

18 36

jQueryDeferred

bull представление (асинхронного) действия как объектаbull состояния из pending в resolved или rejectedbull для каждого финального состояния можно указать наборобработчиков

bull в финальное состояние завершения можно перейти толькоодин раз

bull если объект уже перешел в финальное состояниедобавляемые обработчики выполняются сразу же

bull AJAX-вызовы возвращают deferred

promise = read-only deferred

19 36

jQueryDeferred пример

function countDown(time)

var timer = $Deferred()setTimeout(function() timerresolve() time)return timerpromise()

var test = countdown(5000)

testdone(function() consoledebug(rsquoTime is uprsquo) )

testdone(function() consoledebug(rsquoBangrsquo) )

20 36

jQueryDeferred APIОбработка завершения

done() успешноеfail() неуспешноеthen() любое

Создание$Deferred конструкторpromise() read-only объект

Завершениеresolve() завешениеreject() неуспешное

Прогрессnotify() уведомление

progress() обработка

Комбинирование

$when() комбинирование с синхронизацией

21 36

jQuerywhen()function getData()

return $get(rsquodatarsquo)success(function() consolelog(rsquoajax donersquo)

function showDiv() return $Deferred(function(d)

$(rsquoblockrsquo)fadeIn(1000 dresolve))promise()

$when(getData() showDiv())then(function(ajaxResult)

consolelog(rsquoall donersquo))

22 36

jQueryDeferred итого

Можно получить более читаемый и легко сопровождаемый код

В нашем случае наиболее наиболее возможное применение

bull синхронизация параллельной анимацииbull синхронизация AJAX-вызовов между собой и другимиоперациями

23 36

AJAX избыточно и неудобно

$ajax(url scripthtmdata Object2Parameters( action rsquoformrsquo )dataType rsquojsonrsquosuccess function (res)

)

AJAX рекомендации

bull используем имя метода для указания типа запросаbull не используем dataType mdash правильный Content-Typeдолжен формироваться на стороне сервера

bull не используем собственных функций формированиястроки данных

bull используем deferreds соответственно done() fail()then()

bull определение запроса и добавление обработчиков можноразделить

bull легко синхронизировать запросы и анимацию

25 36

AJAX пример

var update = $post(rsquoupdatersquo id 1 name name )

updatedone(function (response)

)

updatethen(function (response)

donefunction (response)

fail)

26 36

DOM главная проблема

Очень сложная разметкастили в JavaScript

DOM главная проблема

bull не используем CSS-стили в JavaScriptbull не отрабатываем responsive через JavaScriptbull не кодируем данные в классах (есть data() )bull всегда используем классыbull чем проще разметка тем проще по нейнавигация

Очень важно минимизируем CSSминимизируем верстку иначе проблемынеизбежны

28 36

DOM проблемы

bull разметка смешана с кодом сложно поддерживатьbull ресурсоемкое создание элементов

$(rsquobodyrsquo)prepend($(rsquoltdivgtrsquo)addClass(rsquoapp-loading-wrapperrsquo)prepend(

$(rsquoltdivgtrsquo)addClass(rsquoapp-loading-picturersquo))

$(rsquoltdivgtrsquo)addClass(rsquoapp-button-red app-club-button-addrsquo)prepend($(rsquoltinput type=buttongtrsquo)

attr(value rsquoПроверитьrsquo ))

Работа с DOMДобавление новых узлов в документ mdash дорого

bull используем строки добавляем единственным append()bull стараемся не плодить лишние $()bull сводим количество append() к минимумуbull в сложных случаях можно использовать detach()

var $form = $(rsquoformrsquo)$parent = $formparent()

$formdetach()inputseach(function() $formappend(this) )

$parentappend($form)

30 36

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 17: Эффективный jQuery

Делегирование событийПовторная привязка событий после изменения DOM

bull усложняет логику требует запуск дополнительного кодапосле изменения

bull создает избыточное количество обработчиков

Правильно mdash делегирование

bull использует event bubblingbull позволяет установить один обработчик событий а не стоbull работает с элементами DOM которые появились позжеустановки обработчика

$(rsquocontainerrsquo)on(rsquoclickrsquo rsquoelementrsquo) function(e)

17 36

jQuery return false

bull epreventDefault() mdash останавливает обработка поумолчанию

bull estopPropagation() mdash останавливает передачуродительским элементам

bull estopImmediatePropagation() mdash прекращаетвыполнение всех обработчиков для этого элемента

return false = epreventDefault() + estopPropagation()

Рекомендуется не использовать return false а использоватьсоответствующие методы

18 36

jQueryDeferred

bull представление (асинхронного) действия как объектаbull состояния из pending в resolved или rejectedbull для каждого финального состояния можно указать наборобработчиков

bull в финальное состояние завершения можно перейти толькоодин раз

bull если объект уже перешел в финальное состояниедобавляемые обработчики выполняются сразу же

bull AJAX-вызовы возвращают deferred

promise = read-only deferred

19 36

jQueryDeferred пример

function countDown(time)

var timer = $Deferred()setTimeout(function() timerresolve() time)return timerpromise()

var test = countdown(5000)

testdone(function() consoledebug(rsquoTime is uprsquo) )

testdone(function() consoledebug(rsquoBangrsquo) )

20 36

jQueryDeferred APIОбработка завершения

done() успешноеfail() неуспешноеthen() любое

Создание$Deferred конструкторpromise() read-only объект

Завершениеresolve() завешениеreject() неуспешное

Прогрессnotify() уведомление

progress() обработка

Комбинирование

$when() комбинирование с синхронизацией

21 36

jQuerywhen()function getData()

return $get(rsquodatarsquo)success(function() consolelog(rsquoajax donersquo)

function showDiv() return $Deferred(function(d)

$(rsquoblockrsquo)fadeIn(1000 dresolve))promise()

$when(getData() showDiv())then(function(ajaxResult)

consolelog(rsquoall donersquo))

22 36

jQueryDeferred итого

Можно получить более читаемый и легко сопровождаемый код

В нашем случае наиболее наиболее возможное применение

bull синхронизация параллельной анимацииbull синхронизация AJAX-вызовов между собой и другимиоперациями

23 36

AJAX избыточно и неудобно

$ajax(url scripthtmdata Object2Parameters( action rsquoformrsquo )dataType rsquojsonrsquosuccess function (res)

)

AJAX рекомендации

bull используем имя метода для указания типа запросаbull не используем dataType mdash правильный Content-Typeдолжен формироваться на стороне сервера

bull не используем собственных функций формированиястроки данных

bull используем deferreds соответственно done() fail()then()

bull определение запроса и добавление обработчиков можноразделить

bull легко синхронизировать запросы и анимацию

25 36

AJAX пример

var update = $post(rsquoupdatersquo id 1 name name )

updatedone(function (response)

)

updatethen(function (response)

donefunction (response)

fail)

26 36

DOM главная проблема

Очень сложная разметкастили в JavaScript

DOM главная проблема

bull не используем CSS-стили в JavaScriptbull не отрабатываем responsive через JavaScriptbull не кодируем данные в классах (есть data() )bull всегда используем классыbull чем проще разметка тем проще по нейнавигация

Очень важно минимизируем CSSминимизируем верстку иначе проблемынеизбежны

28 36

DOM проблемы

bull разметка смешана с кодом сложно поддерживатьbull ресурсоемкое создание элементов

$(rsquobodyrsquo)prepend($(rsquoltdivgtrsquo)addClass(rsquoapp-loading-wrapperrsquo)prepend(

$(rsquoltdivgtrsquo)addClass(rsquoapp-loading-picturersquo))

$(rsquoltdivgtrsquo)addClass(rsquoapp-button-red app-club-button-addrsquo)prepend($(rsquoltinput type=buttongtrsquo)

attr(value rsquoПроверитьrsquo ))

Работа с DOMДобавление новых узлов в документ mdash дорого

bull используем строки добавляем единственным append()bull стараемся не плодить лишние $()bull сводим количество append() к минимумуbull в сложных случаях можно использовать detach()

var $form = $(rsquoformrsquo)$parent = $formparent()

$formdetach()inputseach(function() $formappend(this) )

$parentappend($form)

30 36

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 18: Эффективный jQuery

jQuery return false

bull epreventDefault() mdash останавливает обработка поумолчанию

bull estopPropagation() mdash останавливает передачуродительским элементам

bull estopImmediatePropagation() mdash прекращаетвыполнение всех обработчиков для этого элемента

return false = epreventDefault() + estopPropagation()

Рекомендуется не использовать return false а использоватьсоответствующие методы

18 36

jQueryDeferred

bull представление (асинхронного) действия как объектаbull состояния из pending в resolved или rejectedbull для каждого финального состояния можно указать наборобработчиков

bull в финальное состояние завершения можно перейти толькоодин раз

bull если объект уже перешел в финальное состояниедобавляемые обработчики выполняются сразу же

bull AJAX-вызовы возвращают deferred

promise = read-only deferred

19 36

jQueryDeferred пример

function countDown(time)

var timer = $Deferred()setTimeout(function() timerresolve() time)return timerpromise()

var test = countdown(5000)

testdone(function() consoledebug(rsquoTime is uprsquo) )

testdone(function() consoledebug(rsquoBangrsquo) )

20 36

jQueryDeferred APIОбработка завершения

done() успешноеfail() неуспешноеthen() любое

Создание$Deferred конструкторpromise() read-only объект

Завершениеresolve() завешениеreject() неуспешное

Прогрессnotify() уведомление

progress() обработка

Комбинирование

$when() комбинирование с синхронизацией

21 36

jQuerywhen()function getData()

return $get(rsquodatarsquo)success(function() consolelog(rsquoajax donersquo)

function showDiv() return $Deferred(function(d)

$(rsquoblockrsquo)fadeIn(1000 dresolve))promise()

$when(getData() showDiv())then(function(ajaxResult)

consolelog(rsquoall donersquo))

22 36

jQueryDeferred итого

Можно получить более читаемый и легко сопровождаемый код

В нашем случае наиболее наиболее возможное применение

bull синхронизация параллельной анимацииbull синхронизация AJAX-вызовов между собой и другимиоперациями

23 36

AJAX избыточно и неудобно

$ajax(url scripthtmdata Object2Parameters( action rsquoformrsquo )dataType rsquojsonrsquosuccess function (res)

)

AJAX рекомендации

bull используем имя метода для указания типа запросаbull не используем dataType mdash правильный Content-Typeдолжен формироваться на стороне сервера

bull не используем собственных функций формированиястроки данных

bull используем deferreds соответственно done() fail()then()

bull определение запроса и добавление обработчиков можноразделить

bull легко синхронизировать запросы и анимацию

25 36

AJAX пример

var update = $post(rsquoupdatersquo id 1 name name )

updatedone(function (response)

)

updatethen(function (response)

donefunction (response)

fail)

26 36

DOM главная проблема

Очень сложная разметкастили в JavaScript

DOM главная проблема

bull не используем CSS-стили в JavaScriptbull не отрабатываем responsive через JavaScriptbull не кодируем данные в классах (есть data() )bull всегда используем классыbull чем проще разметка тем проще по нейнавигация

Очень важно минимизируем CSSминимизируем верстку иначе проблемынеизбежны

28 36

DOM проблемы

bull разметка смешана с кодом сложно поддерживатьbull ресурсоемкое создание элементов

$(rsquobodyrsquo)prepend($(rsquoltdivgtrsquo)addClass(rsquoapp-loading-wrapperrsquo)prepend(

$(rsquoltdivgtrsquo)addClass(rsquoapp-loading-picturersquo))

$(rsquoltdivgtrsquo)addClass(rsquoapp-button-red app-club-button-addrsquo)prepend($(rsquoltinput type=buttongtrsquo)

attr(value rsquoПроверитьrsquo ))

Работа с DOMДобавление новых узлов в документ mdash дорого

bull используем строки добавляем единственным append()bull стараемся не плодить лишние $()bull сводим количество append() к минимумуbull в сложных случаях можно использовать detach()

var $form = $(rsquoformrsquo)$parent = $formparent()

$formdetach()inputseach(function() $formappend(this) )

$parentappend($form)

30 36

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 19: Эффективный jQuery

jQueryDeferred

bull представление (асинхронного) действия как объектаbull состояния из pending в resolved или rejectedbull для каждого финального состояния можно указать наборобработчиков

bull в финальное состояние завершения можно перейти толькоодин раз

bull если объект уже перешел в финальное состояниедобавляемые обработчики выполняются сразу же

bull AJAX-вызовы возвращают deferred

promise = read-only deferred

19 36

jQueryDeferred пример

function countDown(time)

var timer = $Deferred()setTimeout(function() timerresolve() time)return timerpromise()

var test = countdown(5000)

testdone(function() consoledebug(rsquoTime is uprsquo) )

testdone(function() consoledebug(rsquoBangrsquo) )

20 36

jQueryDeferred APIОбработка завершения

done() успешноеfail() неуспешноеthen() любое

Создание$Deferred конструкторpromise() read-only объект

Завершениеresolve() завешениеreject() неуспешное

Прогрессnotify() уведомление

progress() обработка

Комбинирование

$when() комбинирование с синхронизацией

21 36

jQuerywhen()function getData()

return $get(rsquodatarsquo)success(function() consolelog(rsquoajax donersquo)

function showDiv() return $Deferred(function(d)

$(rsquoblockrsquo)fadeIn(1000 dresolve))promise()

$when(getData() showDiv())then(function(ajaxResult)

consolelog(rsquoall donersquo))

22 36

jQueryDeferred итого

Можно получить более читаемый и легко сопровождаемый код

В нашем случае наиболее наиболее возможное применение

bull синхронизация параллельной анимацииbull синхронизация AJAX-вызовов между собой и другимиоперациями

23 36

AJAX избыточно и неудобно

$ajax(url scripthtmdata Object2Parameters( action rsquoformrsquo )dataType rsquojsonrsquosuccess function (res)

)

AJAX рекомендации

bull используем имя метода для указания типа запросаbull не используем dataType mdash правильный Content-Typeдолжен формироваться на стороне сервера

bull не используем собственных функций формированиястроки данных

bull используем deferreds соответственно done() fail()then()

bull определение запроса и добавление обработчиков можноразделить

bull легко синхронизировать запросы и анимацию

25 36

AJAX пример

var update = $post(rsquoupdatersquo id 1 name name )

updatedone(function (response)

)

updatethen(function (response)

donefunction (response)

fail)

26 36

DOM главная проблема

Очень сложная разметкастили в JavaScript

DOM главная проблема

bull не используем CSS-стили в JavaScriptbull не отрабатываем responsive через JavaScriptbull не кодируем данные в классах (есть data() )bull всегда используем классыbull чем проще разметка тем проще по нейнавигация

Очень важно минимизируем CSSминимизируем верстку иначе проблемынеизбежны

28 36

DOM проблемы

bull разметка смешана с кодом сложно поддерживатьbull ресурсоемкое создание элементов

$(rsquobodyrsquo)prepend($(rsquoltdivgtrsquo)addClass(rsquoapp-loading-wrapperrsquo)prepend(

$(rsquoltdivgtrsquo)addClass(rsquoapp-loading-picturersquo))

$(rsquoltdivgtrsquo)addClass(rsquoapp-button-red app-club-button-addrsquo)prepend($(rsquoltinput type=buttongtrsquo)

attr(value rsquoПроверитьrsquo ))

Работа с DOMДобавление новых узлов в документ mdash дорого

bull используем строки добавляем единственным append()bull стараемся не плодить лишние $()bull сводим количество append() к минимумуbull в сложных случаях можно использовать detach()

var $form = $(rsquoformrsquo)$parent = $formparent()

$formdetach()inputseach(function() $formappend(this) )

$parentappend($form)

30 36

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 20: Эффективный jQuery

jQueryDeferred пример

function countDown(time)

var timer = $Deferred()setTimeout(function() timerresolve() time)return timerpromise()

var test = countdown(5000)

testdone(function() consoledebug(rsquoTime is uprsquo) )

testdone(function() consoledebug(rsquoBangrsquo) )

20 36

jQueryDeferred APIОбработка завершения

done() успешноеfail() неуспешноеthen() любое

Создание$Deferred конструкторpromise() read-only объект

Завершениеresolve() завешениеreject() неуспешное

Прогрессnotify() уведомление

progress() обработка

Комбинирование

$when() комбинирование с синхронизацией

21 36

jQuerywhen()function getData()

return $get(rsquodatarsquo)success(function() consolelog(rsquoajax donersquo)

function showDiv() return $Deferred(function(d)

$(rsquoblockrsquo)fadeIn(1000 dresolve))promise()

$when(getData() showDiv())then(function(ajaxResult)

consolelog(rsquoall donersquo))

22 36

jQueryDeferred итого

Можно получить более читаемый и легко сопровождаемый код

В нашем случае наиболее наиболее возможное применение

bull синхронизация параллельной анимацииbull синхронизация AJAX-вызовов между собой и другимиоперациями

23 36

AJAX избыточно и неудобно

$ajax(url scripthtmdata Object2Parameters( action rsquoformrsquo )dataType rsquojsonrsquosuccess function (res)

)

AJAX рекомендации

bull используем имя метода для указания типа запросаbull не используем dataType mdash правильный Content-Typeдолжен формироваться на стороне сервера

bull не используем собственных функций формированиястроки данных

bull используем deferreds соответственно done() fail()then()

bull определение запроса и добавление обработчиков можноразделить

bull легко синхронизировать запросы и анимацию

25 36

AJAX пример

var update = $post(rsquoupdatersquo id 1 name name )

updatedone(function (response)

)

updatethen(function (response)

donefunction (response)

fail)

26 36

DOM главная проблема

Очень сложная разметкастили в JavaScript

DOM главная проблема

bull не используем CSS-стили в JavaScriptbull не отрабатываем responsive через JavaScriptbull не кодируем данные в классах (есть data() )bull всегда используем классыbull чем проще разметка тем проще по нейнавигация

Очень важно минимизируем CSSминимизируем верстку иначе проблемынеизбежны

28 36

DOM проблемы

bull разметка смешана с кодом сложно поддерживатьbull ресурсоемкое создание элементов

$(rsquobodyrsquo)prepend($(rsquoltdivgtrsquo)addClass(rsquoapp-loading-wrapperrsquo)prepend(

$(rsquoltdivgtrsquo)addClass(rsquoapp-loading-picturersquo))

$(rsquoltdivgtrsquo)addClass(rsquoapp-button-red app-club-button-addrsquo)prepend($(rsquoltinput type=buttongtrsquo)

attr(value rsquoПроверитьrsquo ))

Работа с DOMДобавление новых узлов в документ mdash дорого

bull используем строки добавляем единственным append()bull стараемся не плодить лишние $()bull сводим количество append() к минимумуbull в сложных случаях можно использовать detach()

var $form = $(rsquoformrsquo)$parent = $formparent()

$formdetach()inputseach(function() $formappend(this) )

$parentappend($form)

30 36

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 21: Эффективный jQuery

jQueryDeferred APIОбработка завершения

done() успешноеfail() неуспешноеthen() любое

Создание$Deferred конструкторpromise() read-only объект

Завершениеresolve() завешениеreject() неуспешное

Прогрессnotify() уведомление

progress() обработка

Комбинирование

$when() комбинирование с синхронизацией

21 36

jQuerywhen()function getData()

return $get(rsquodatarsquo)success(function() consolelog(rsquoajax donersquo)

function showDiv() return $Deferred(function(d)

$(rsquoblockrsquo)fadeIn(1000 dresolve))promise()

$when(getData() showDiv())then(function(ajaxResult)

consolelog(rsquoall donersquo))

22 36

jQueryDeferred итого

Можно получить более читаемый и легко сопровождаемый код

В нашем случае наиболее наиболее возможное применение

bull синхронизация параллельной анимацииbull синхронизация AJAX-вызовов между собой и другимиоперациями

23 36

AJAX избыточно и неудобно

$ajax(url scripthtmdata Object2Parameters( action rsquoformrsquo )dataType rsquojsonrsquosuccess function (res)

)

AJAX рекомендации

bull используем имя метода для указания типа запросаbull не используем dataType mdash правильный Content-Typeдолжен формироваться на стороне сервера

bull не используем собственных функций формированиястроки данных

bull используем deferreds соответственно done() fail()then()

bull определение запроса и добавление обработчиков можноразделить

bull легко синхронизировать запросы и анимацию

25 36

AJAX пример

var update = $post(rsquoupdatersquo id 1 name name )

updatedone(function (response)

)

updatethen(function (response)

donefunction (response)

fail)

26 36

DOM главная проблема

Очень сложная разметкастили в JavaScript

DOM главная проблема

bull не используем CSS-стили в JavaScriptbull не отрабатываем responsive через JavaScriptbull не кодируем данные в классах (есть data() )bull всегда используем классыbull чем проще разметка тем проще по нейнавигация

Очень важно минимизируем CSSминимизируем верстку иначе проблемынеизбежны

28 36

DOM проблемы

bull разметка смешана с кодом сложно поддерживатьbull ресурсоемкое создание элементов

$(rsquobodyrsquo)prepend($(rsquoltdivgtrsquo)addClass(rsquoapp-loading-wrapperrsquo)prepend(

$(rsquoltdivgtrsquo)addClass(rsquoapp-loading-picturersquo))

$(rsquoltdivgtrsquo)addClass(rsquoapp-button-red app-club-button-addrsquo)prepend($(rsquoltinput type=buttongtrsquo)

attr(value rsquoПроверитьrsquo ))

Работа с DOMДобавление новых узлов в документ mdash дорого

bull используем строки добавляем единственным append()bull стараемся не плодить лишние $()bull сводим количество append() к минимумуbull в сложных случаях можно использовать detach()

var $form = $(rsquoformrsquo)$parent = $formparent()

$formdetach()inputseach(function() $formappend(this) )

$parentappend($form)

30 36

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 22: Эффективный jQuery

jQuerywhen()function getData()

return $get(rsquodatarsquo)success(function() consolelog(rsquoajax donersquo)

function showDiv() return $Deferred(function(d)

$(rsquoblockrsquo)fadeIn(1000 dresolve))promise()

$when(getData() showDiv())then(function(ajaxResult)

consolelog(rsquoall donersquo))

22 36

jQueryDeferred итого

Можно получить более читаемый и легко сопровождаемый код

В нашем случае наиболее наиболее возможное применение

bull синхронизация параллельной анимацииbull синхронизация AJAX-вызовов между собой и другимиоперациями

23 36

AJAX избыточно и неудобно

$ajax(url scripthtmdata Object2Parameters( action rsquoformrsquo )dataType rsquojsonrsquosuccess function (res)

)

AJAX рекомендации

bull используем имя метода для указания типа запросаbull не используем dataType mdash правильный Content-Typeдолжен формироваться на стороне сервера

bull не используем собственных функций формированиястроки данных

bull используем deferreds соответственно done() fail()then()

bull определение запроса и добавление обработчиков можноразделить

bull легко синхронизировать запросы и анимацию

25 36

AJAX пример

var update = $post(rsquoupdatersquo id 1 name name )

updatedone(function (response)

)

updatethen(function (response)

donefunction (response)

fail)

26 36

DOM главная проблема

Очень сложная разметкастили в JavaScript

DOM главная проблема

bull не используем CSS-стили в JavaScriptbull не отрабатываем responsive через JavaScriptbull не кодируем данные в классах (есть data() )bull всегда используем классыbull чем проще разметка тем проще по нейнавигация

Очень важно минимизируем CSSминимизируем верстку иначе проблемынеизбежны

28 36

DOM проблемы

bull разметка смешана с кодом сложно поддерживатьbull ресурсоемкое создание элементов

$(rsquobodyrsquo)prepend($(rsquoltdivgtrsquo)addClass(rsquoapp-loading-wrapperrsquo)prepend(

$(rsquoltdivgtrsquo)addClass(rsquoapp-loading-picturersquo))

$(rsquoltdivgtrsquo)addClass(rsquoapp-button-red app-club-button-addrsquo)prepend($(rsquoltinput type=buttongtrsquo)

attr(value rsquoПроверитьrsquo ))

Работа с DOMДобавление новых узлов в документ mdash дорого

bull используем строки добавляем единственным append()bull стараемся не плодить лишние $()bull сводим количество append() к минимумуbull в сложных случаях можно использовать detach()

var $form = $(rsquoformrsquo)$parent = $formparent()

$formdetach()inputseach(function() $formappend(this) )

$parentappend($form)

30 36

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 23: Эффективный jQuery

jQueryDeferred итого

Можно получить более читаемый и легко сопровождаемый код

В нашем случае наиболее наиболее возможное применение

bull синхронизация параллельной анимацииbull синхронизация AJAX-вызовов между собой и другимиоперациями

23 36

AJAX избыточно и неудобно

$ajax(url scripthtmdata Object2Parameters( action rsquoformrsquo )dataType rsquojsonrsquosuccess function (res)

)

AJAX рекомендации

bull используем имя метода для указания типа запросаbull не используем dataType mdash правильный Content-Typeдолжен формироваться на стороне сервера

bull не используем собственных функций формированиястроки данных

bull используем deferreds соответственно done() fail()then()

bull определение запроса и добавление обработчиков можноразделить

bull легко синхронизировать запросы и анимацию

25 36

AJAX пример

var update = $post(rsquoupdatersquo id 1 name name )

updatedone(function (response)

)

updatethen(function (response)

donefunction (response)

fail)

26 36

DOM главная проблема

Очень сложная разметкастили в JavaScript

DOM главная проблема

bull не используем CSS-стили в JavaScriptbull не отрабатываем responsive через JavaScriptbull не кодируем данные в классах (есть data() )bull всегда используем классыbull чем проще разметка тем проще по нейнавигация

Очень важно минимизируем CSSминимизируем верстку иначе проблемынеизбежны

28 36

DOM проблемы

bull разметка смешана с кодом сложно поддерживатьbull ресурсоемкое создание элементов

$(rsquobodyrsquo)prepend($(rsquoltdivgtrsquo)addClass(rsquoapp-loading-wrapperrsquo)prepend(

$(rsquoltdivgtrsquo)addClass(rsquoapp-loading-picturersquo))

$(rsquoltdivgtrsquo)addClass(rsquoapp-button-red app-club-button-addrsquo)prepend($(rsquoltinput type=buttongtrsquo)

attr(value rsquoПроверитьrsquo ))

Работа с DOMДобавление новых узлов в документ mdash дорого

bull используем строки добавляем единственным append()bull стараемся не плодить лишние $()bull сводим количество append() к минимумуbull в сложных случаях можно использовать detach()

var $form = $(rsquoformrsquo)$parent = $formparent()

$formdetach()inputseach(function() $formappend(this) )

$parentappend($form)

30 36

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 24: Эффективный jQuery

AJAX избыточно и неудобно

$ajax(url scripthtmdata Object2Parameters( action rsquoformrsquo )dataType rsquojsonrsquosuccess function (res)

)

AJAX рекомендации

bull используем имя метода для указания типа запросаbull не используем dataType mdash правильный Content-Typeдолжен формироваться на стороне сервера

bull не используем собственных функций формированиястроки данных

bull используем deferreds соответственно done() fail()then()

bull определение запроса и добавление обработчиков можноразделить

bull легко синхронизировать запросы и анимацию

25 36

AJAX пример

var update = $post(rsquoupdatersquo id 1 name name )

updatedone(function (response)

)

updatethen(function (response)

donefunction (response)

fail)

26 36

DOM главная проблема

Очень сложная разметкастили в JavaScript

DOM главная проблема

bull не используем CSS-стили в JavaScriptbull не отрабатываем responsive через JavaScriptbull не кодируем данные в классах (есть data() )bull всегда используем классыbull чем проще разметка тем проще по нейнавигация

Очень важно минимизируем CSSминимизируем верстку иначе проблемынеизбежны

28 36

DOM проблемы

bull разметка смешана с кодом сложно поддерживатьbull ресурсоемкое создание элементов

$(rsquobodyrsquo)prepend($(rsquoltdivgtrsquo)addClass(rsquoapp-loading-wrapperrsquo)prepend(

$(rsquoltdivgtrsquo)addClass(rsquoapp-loading-picturersquo))

$(rsquoltdivgtrsquo)addClass(rsquoapp-button-red app-club-button-addrsquo)prepend($(rsquoltinput type=buttongtrsquo)

attr(value rsquoПроверитьrsquo ))

Работа с DOMДобавление новых узлов в документ mdash дорого

bull используем строки добавляем единственным append()bull стараемся не плодить лишние $()bull сводим количество append() к минимумуbull в сложных случаях можно использовать detach()

var $form = $(rsquoformrsquo)$parent = $formparent()

$formdetach()inputseach(function() $formappend(this) )

$parentappend($form)

30 36

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 25: Эффективный jQuery

AJAX рекомендации

bull используем имя метода для указания типа запросаbull не используем dataType mdash правильный Content-Typeдолжен формироваться на стороне сервера

bull не используем собственных функций формированиястроки данных

bull используем deferreds соответственно done() fail()then()

bull определение запроса и добавление обработчиков можноразделить

bull легко синхронизировать запросы и анимацию

25 36

AJAX пример

var update = $post(rsquoupdatersquo id 1 name name )

updatedone(function (response)

)

updatethen(function (response)

donefunction (response)

fail)

26 36

DOM главная проблема

Очень сложная разметкастили в JavaScript

DOM главная проблема

bull не используем CSS-стили в JavaScriptbull не отрабатываем responsive через JavaScriptbull не кодируем данные в классах (есть data() )bull всегда используем классыbull чем проще разметка тем проще по нейнавигация

Очень важно минимизируем CSSминимизируем верстку иначе проблемынеизбежны

28 36

DOM проблемы

bull разметка смешана с кодом сложно поддерживатьbull ресурсоемкое создание элементов

$(rsquobodyrsquo)prepend($(rsquoltdivgtrsquo)addClass(rsquoapp-loading-wrapperrsquo)prepend(

$(rsquoltdivgtrsquo)addClass(rsquoapp-loading-picturersquo))

$(rsquoltdivgtrsquo)addClass(rsquoapp-button-red app-club-button-addrsquo)prepend($(rsquoltinput type=buttongtrsquo)

attr(value rsquoПроверитьrsquo ))

Работа с DOMДобавление новых узлов в документ mdash дорого

bull используем строки добавляем единственным append()bull стараемся не плодить лишние $()bull сводим количество append() к минимумуbull в сложных случаях можно использовать detach()

var $form = $(rsquoformrsquo)$parent = $formparent()

$formdetach()inputseach(function() $formappend(this) )

$parentappend($form)

30 36

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 26: Эффективный jQuery

AJAX пример

var update = $post(rsquoupdatersquo id 1 name name )

updatedone(function (response)

)

updatethen(function (response)

donefunction (response)

fail)

26 36

DOM главная проблема

Очень сложная разметкастили в JavaScript

DOM главная проблема

bull не используем CSS-стили в JavaScriptbull не отрабатываем responsive через JavaScriptbull не кодируем данные в классах (есть data() )bull всегда используем классыbull чем проще разметка тем проще по нейнавигация

Очень важно минимизируем CSSминимизируем верстку иначе проблемынеизбежны

28 36

DOM проблемы

bull разметка смешана с кодом сложно поддерживатьbull ресурсоемкое создание элементов

$(rsquobodyrsquo)prepend($(rsquoltdivgtrsquo)addClass(rsquoapp-loading-wrapperrsquo)prepend(

$(rsquoltdivgtrsquo)addClass(rsquoapp-loading-picturersquo))

$(rsquoltdivgtrsquo)addClass(rsquoapp-button-red app-club-button-addrsquo)prepend($(rsquoltinput type=buttongtrsquo)

attr(value rsquoПроверитьrsquo ))

Работа с DOMДобавление новых узлов в документ mdash дорого

bull используем строки добавляем единственным append()bull стараемся не плодить лишние $()bull сводим количество append() к минимумуbull в сложных случаях можно использовать detach()

var $form = $(rsquoformrsquo)$parent = $formparent()

$formdetach()inputseach(function() $formappend(this) )

$parentappend($form)

30 36

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 27: Эффективный jQuery

DOM главная проблема

Очень сложная разметкастили в JavaScript

DOM главная проблема

bull не используем CSS-стили в JavaScriptbull не отрабатываем responsive через JavaScriptbull не кодируем данные в классах (есть data() )bull всегда используем классыbull чем проще разметка тем проще по нейнавигация

Очень важно минимизируем CSSминимизируем верстку иначе проблемынеизбежны

28 36

DOM проблемы

bull разметка смешана с кодом сложно поддерживатьbull ресурсоемкое создание элементов

$(rsquobodyrsquo)prepend($(rsquoltdivgtrsquo)addClass(rsquoapp-loading-wrapperrsquo)prepend(

$(rsquoltdivgtrsquo)addClass(rsquoapp-loading-picturersquo))

$(rsquoltdivgtrsquo)addClass(rsquoapp-button-red app-club-button-addrsquo)prepend($(rsquoltinput type=buttongtrsquo)

attr(value rsquoПроверитьrsquo ))

Работа с DOMДобавление новых узлов в документ mdash дорого

bull используем строки добавляем единственным append()bull стараемся не плодить лишние $()bull сводим количество append() к минимумуbull в сложных случаях можно использовать detach()

var $form = $(rsquoformrsquo)$parent = $formparent()

$formdetach()inputseach(function() $formappend(this) )

$parentappend($form)

30 36

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 28: Эффективный jQuery

DOM главная проблема

bull не используем CSS-стили в JavaScriptbull не отрабатываем responsive через JavaScriptbull не кодируем данные в классах (есть data() )bull всегда используем классыbull чем проще разметка тем проще по нейнавигация

Очень важно минимизируем CSSминимизируем верстку иначе проблемынеизбежны

28 36

DOM проблемы

bull разметка смешана с кодом сложно поддерживатьbull ресурсоемкое создание элементов

$(rsquobodyrsquo)prepend($(rsquoltdivgtrsquo)addClass(rsquoapp-loading-wrapperrsquo)prepend(

$(rsquoltdivgtrsquo)addClass(rsquoapp-loading-picturersquo))

$(rsquoltdivgtrsquo)addClass(rsquoapp-button-red app-club-button-addrsquo)prepend($(rsquoltinput type=buttongtrsquo)

attr(value rsquoПроверитьrsquo ))

Работа с DOMДобавление новых узлов в документ mdash дорого

bull используем строки добавляем единственным append()bull стараемся не плодить лишние $()bull сводим количество append() к минимумуbull в сложных случаях можно использовать detach()

var $form = $(rsquoformrsquo)$parent = $formparent()

$formdetach()inputseach(function() $formappend(this) )

$parentappend($form)

30 36

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 29: Эффективный jQuery

DOM проблемы

bull разметка смешана с кодом сложно поддерживатьbull ресурсоемкое создание элементов

$(rsquobodyrsquo)prepend($(rsquoltdivgtrsquo)addClass(rsquoapp-loading-wrapperrsquo)prepend(

$(rsquoltdivgtrsquo)addClass(rsquoapp-loading-picturersquo))

$(rsquoltdivgtrsquo)addClass(rsquoapp-button-red app-club-button-addrsquo)prepend($(rsquoltinput type=buttongtrsquo)

attr(value rsquoПроверитьrsquo ))

Работа с DOMДобавление новых узлов в документ mdash дорого

bull используем строки добавляем единственным append()bull стараемся не плодить лишние $()bull сводим количество append() к минимумуbull в сложных случаях можно использовать detach()

var $form = $(rsquoformrsquo)$parent = $formparent()

$formdetach()inputseach(function() $formappend(this) )

$parentappend($form)

30 36

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 30: Эффективный jQuery

Работа с DOMДобавление новых узлов в документ mdash дорого

bull используем строки добавляем единственным append()bull стараемся не плодить лишние $()bull сводим количество append() к минимумуbull в сложных случаях можно использовать detach()

var $form = $(rsquoformrsquo)$parent = $formparent()

$formdetach()inputseach(function() $formappend(this) )

$parentappend($form)

30 36

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 31: Эффективный jQuery

Циклы проблема

Циклы где достаточно селекторов громоздко частомедленнее

$(rsquoapp-s-showcasersquo)each(function() if ($(this)is(rsquovisiblersquo))

$(this)addClass(rsquoapp-s-showcase--activersquo)

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 32: Эффективный jQuery

Циклы

bull стараемся избегатьbull желательно обходиться селекторамиbull иногда циклы действительно нужны

$(rsquoapp-s-showcasenot(visible)rsquo)addClass(rsquoapp-s-showcase--activersquo)

32 36

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 33: Эффективный jQuery

Валидация форм проблемаbull много кода с большим количеством повторенийbull много избыточных вызовов jQuerybull обработка ошибок в виде alert()

function checkForm(f) var fieldfield = $(rsquoform input[name=fio]rsquo)if (fieldval()match(+))

field = $(rsquoform input[name=address]rsquo)if (fieldval()match(+))

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 34: Эффективный jQuery

Валидация формПрограммам минимум

bull применяем jQuery к форме потом find()bull однотипный код реализуем в виде цикла по объектуконфигурации

Предпочтительнее mdash использовать jQuery plugin

bull Validation1 самый распространенныйbull TinyValidation2 можно конфигурировать с помощьюdata-атрибутов

1httpdocsjquerycomPluginsValidation]2httpsgithubcomnicholasbsjquery-tiny-validation

34 36

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 35: Эффективный jQuery

Прочее

bull если нужны данные mdash храним в data() а не парсимкаждый раз разметку

bull иногда можно отказаться от избыточного $()

$(this)attr(rsquoidrsquo) thisid

bull $data(rsquoelemrsquo key value) быстрее чем$(rsquoelemrsquo)data(key value) для одного узла

bull вообще у многих методов вида $fnmethod() естьаналоги $method() для единственного узла

35 36

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36

Page 36: Эффективный jQuery

Ссылки

bull jQuery proven performance tips tricks3

bull Your jQuery Now With 67 Less Suck4

bull Popular performance test cases5

bull jQuery Anti-Patterns for Performance amp Compression6

3httpwwwslidesharenetAddyOsmanijquery-proven-performance-tips-tricks

4http24waysorg2011your-jquery-now-with-less-suck5httpjsperfcompopular6httpwwwslidesharenetpaulirishperfcompression

36 36