SlideShare a Scribd company logo
DOM, jQuery и все 
все все 
На Яндеск.Диске yadi.sk/d/4PUvH1NwAKes2 
На JsFiddle jsfiddle.net/dench/RHtRZ/8/
Среда выполнения 
— JavaScript !== Браузер 
— Браузер в том числе 
— ОС: WebOS, Firefox OS, Chrome OS 
— Сервер: Node.JS, SpiderMonkey, Rhino 
— Офисные приложения: MS Office, OpenOffice 
2
Различные среды 
предоставляют различный API 
для работы с ними
DOM 
— Document Object Model — это API, для чтения и редактирования 
содержимомого HTML и XML-документов 
— Это дерево, узлами которого могут быть элементы, текст, 
комментарии, атрибуты и другие 
4
Что позволяет нам DOM? 
— Получать доступ к узлу или набору узлов 
— Обход дерева 
— Изменять атрибуты узла 
— Добавлять / удалять / клонировать узлы 
— Обрабатывать события на узлах 
5
Простейший DOM 
01. 
02. 
03. 
04. 
05. 
06. 
07. 
08. 
<!DOCTYPE html><html lang="ru"> 
<head><title>DOM</title></head> 
<body> 
<form class="auth" id="auth" data-value="123" action="/"> 
<input type="text" value="" name="login"> 
<input type="password" value="" name="password"> 
<button>Отправить</button> 
</form> 
6
Что такое jQuery? 
— JS-библиотека, призванная сделать код удобнее и более 
кроссбраузерным 
— Главный слоган „Write less, do more“ — «Пиши меньше, получай 
больше» 
— Всё API нацелено сделать код короче, понятнее и исправить 
шороховатости в нативных реализациях 
7
Что такое jQuery? 
— Был разработан и презентован Джоном Резигом в 2006 
— Продолжает развиваться и сейчас 
— Код постоянно претерпевает рефакторинг и оптимизации
Что такое jQuery? 
— Используется практически всеми крупнейшими компаниями (Яндекс, 
Google, Mozilla) 
— Имеет обширное комьюнити и огромное количество plugin`ов 
— Есть расширения для UI и мобильных приложений 
9
Волшебный $ 
— Переменные в JS могут начинаться с букв и некоторых символов 
— jQuery — одна из первых библиотек, начавших использовать $ в 
качестве пространства имен 
— jQuery === $ 
10
Поиск элементов
Поиск элементов 
01. 
02. 
03. 
04. 
05. 
<form class="auth" id="auth" data-value="123" action="/"> 
<input type="text" value="" name="login"> 
<input type="password" value="" name="password"> 
<button>Отправить</button> 
</form> 
12
getElementById 
document.getElementById('auth'); 
<form class="auth" id="auth" data-value="123" action="/"> 
<input type="text" value="" name="login"> 
<input type="password" value="" name="password"> 
<button>Отправить</button> 
</form> 
01. 
02. 
03. 
04. 
05. 
13
getElementById 
$('#auth'); 
<form class="auth" id="auth" data-value="123" action="/"> 
<input type="text" value="" name="login"> 
<input type="password" value="" name="password"> 
<button>Отправить</button> 
</form> 
01. 
02. 
03. 
04. 
05. 
14
querySelector 
document.querySelector('.auth'); 
<form class="auth" id="auth" data-value="123" action="/"> 
<input type="text" value="" name="login"> 
<input type="password" value="" name="password"> 
<button>Отправить</button> 
</form> 
01. 
02. 
03. 
04. 
05. 
15
querySelector 
$('.auth'); 
<form class="auth" id="auth" data-value="123" action="/"> 
<input type="text" value="" name="login"> 
<input type="password" value="" name="password"> 
<button>Отправить</button> 
</form> 
01. 
02. 
03. 
04. 
05. 
16
querySelector 
document.querySelector('[name="login"]'); 
01. 
02. 
03. 
04. 
05. 
<form class="auth" id="auth" data-value="123" action="/"> 
<input type="text" value="" name="login"> 
<input type="password" value="" name="password"> 
<button>Отправить</button> 
</form> 
17
querySelector 
$('[name="login"]'); 
01. 
02. 
03. 
04. 
05. 
<form class="auth" id="auth" data-value="123" action="/"> 
<input type="text" value="" name="login"> 
<input type="password" value="" name="password"> 
<button>Отправить</button> 
</form> 
18
querySelectorAll 
document.querySelectorAll('input,button'); 
01. 
02. 
03. 
04. 
05. 
<form class="auth" id="auth" data-value="123" action="/"> 
<input type="text" value="" name="login"> 
<input type="password" value="" name="password"> 
<button>Отправить</button> 
</form> 
19
NodeList не Array ¶ методов 
forEach, map и т.п. — нет!
Итерирование по результатам 
Вариант №1 
var elems = document.querySelectorAll('input,button'); 
for (var i = 0, l = elems.length; i < l; i++) { 
var elem = elems[i]; 
01. 
02. 
03. 
04. 
} 
21
Итерирование по результатам 
Вариант №2 
var elems = document.querySelectorAll('input,button'); 
var elemsList = Array.prototype.slice.call(elems); 
elemsList.forEach(function(elem) { 
… 
}); 
01. 
02. 
03. 
04. 
05. 
22
querySelectorAll 
$(':input'); 
01. 
02. 
03. 
04. 
05. 
<form class="auth" id="auth" data-value="123" action="/"> 
<input type="text" value="" name="login"> 
<input type="password" value="" name="password"> 
<button>Отправить</button> 
</form> 
23
Все методы поиска 
возвращают коллекции и 
предоставляют методы для 
итерирования по ним
Итерирование по результатам 
01. 
02. 
03. 
$(':input').each(function(){ 
var $item = $(this); 
}); 
25
Для поиска используется 
библиотека Sizzle
Атрибуты и свойства
Атрибуты и свойства 
var form = document.getElementById('auth'); 
var $form = $(form); 
<form class="auth" id="auth" data-value="123" action="/"> 
<input type="text" value="" name="login"> 
<input type="password" value="" name="password"> 
<button>Отправить</button> 
</form> 
01. 
02. 
01. 
02. 
03. 
04. 
05. 
28
*Attribute 
01. 
02. 
03. 
04. 
05. 
form.getAttribute('action'); >> "/" 
form.hasAttribute('method', 'POST'); >> false 
form.setAttribute('method', 'POST'); 
form.hasAttribute('method', 'POST'); >> true 
form.removeAttribute('method'); 
29
*Attribute 
01. 
02. 
03. 
$form.attr('action'); >> "/" 
$form.attr('method', 'POST'); 
$form.removeAttr('method'); 
30
Data-атрибуты 
form.dataset['value']; >> "123" 
form.dataset.hasOwnProperty('value'); >> true 
form.dataset.foo = 'bar'; 
<form class="auth" id="auth" data-value="123" action="/"> 
<input type="text" value="" name="login"> 
<input type="password" value="" name="password"> 
<button>Отправить</button> 
01. 
02. 
03. 
01. 
02. 
03. 
04. 
31
Data-атрибуты 
01. 
02. 
$form.data('value'); >> "123" 
$form.data('foo', 'bar'); 
01. 
02. 
03. 
04. 
05. 
<form class="auth" id="auth" data-value="123" action="/"> 
<input type="text" value="" name="login"> 
<input type="password" value="" name="password"> 
<button>Отправить</button> 
</form> 
32
Атрибуты !== свойства 
01. 
02. 
03. 
form.getAttribute('action'); >> "/" 
form.getAttribute('method'); >> null 
form.getAttribute('id'); >> "auth" 
01. 
02. 
03. 
form.action; >> "http://fiddle.jshell.net/" 
form.method; >> "get" 
form.id; >> "auth" 
33
Атрибуты !== свойства 
01. 
02. 
03. 
$form.attr('action'); >> "/" 
$form.attr('method'); >> undefined 
$form.attr('id'); >> "auth" 
01. 
02. 
03. 
34 
$form.prop('action'); >> "http://fiddle.jshell.net/" 
$form.prop('method'); >> "get" 
$form.prop('id'; >> "auth"
Классы 
01. 
02. 
form.className; >> "auth" 
form.className += " form"; >> "auth form" 
01. 
02. 
03. 
04. 
form.classList.add('foo'); 
form.classList.item(1); >> "form" 
form.classList.contains('foo'); >> true 
form.classList.remove('foo'); 
35
Классы 
01. 
02. 
03. 
$form.addClass('form'); 
$form.hasClass('form'); >> true 
$form.removeClass('form'); 
36
Создание и удаление элементов
createElement + appendChild 
01. 
02. 
03. 
04. 
05. 
06. 
38 
var elem = document.createElement('span'); 
elem.className = 'error'; 
elem.setAttribute('id', 'auth-error'); 
elem.setAttribute('foo', 'bar'); 
elem.textContent = "Введен неверный логин или пароль"; 
document.body.appendChild(elem);
createElement + appendChild 
01. 
02. 
03. 
04. 
05. 
06. 
var $elem = $('<span>', { 
id: "auth-error", 
class: ["error"], 
foo: "bar", 
text: "Введен неверный логин или пароль" 
}).appendTo(document.body); 
39
cloneNode 
01. 
02. 
03. 
04. 
05. 
06. 
07. 
40 
var elem = document.createElement('span'); 
… 
var clone = elem.cloneNode(true) 
clone.id = 'mail-error'; 
clone.textContent = "Не удалось отправить письмо"; 
document.body.appendChild(elem); 
document.body.appendChild(clone);
cloneNode 
01. 
02. 
03. 
04. 
05. 
06. 
var $body = $(document.body); 
var $elem = $('<span>', {…}); 
var $clone = $elem.clone(true) 
.prop('id', 'mail-error') 
.text("Не удалось отправить письмо") 
$body.append($elem).append($clone) 
41
События
Все элементы DOM и jQuery 
могут реагировать на те или 
иные события
Можно навешивать обработчики в HTML 
01. 
02. 
03. 
04. 
05. 
06. 
<form class="auth" id="auth" 
data-value="123" action="/" onsubmit="submitHandler()"> 
<input type="text" value="" name="login"> 
<input type="password" value="" name="password"> 
<button onclick="clickHandler()">Отправить</button> 
</form> 
44
Почему это плохо? 
— Нельзя навешать более одного обработчика на узел 
— JS и HTML становятся тесно связаны 
— Неинтуитивно 
— При изменении HTML необходимо всегда помнить про атрибуты с 
обработчиками 
— Нельзя динамически навешивать обработчики 
45
addEventListener 
01. 
02. 
var form = document.getElementById('auth'); 
form.addEventListener('submit', submitHandler); 
01. 
02. 
03. 
46 
var button = document.querySelector('button'); 
button.addEventListener('click', clickHandler); 
button.addEventListener('click', yetClickHandler);
addEventListener 
var $form = $('#auth'); 
$form.on('submit', submitHandler); 
var $button = $('button'); 
$button.on('click', clickHandler); 
.on('click', yetClickHandler); 
01. 
02. 
01. 
02. 
03. 
47
Существует два подхода 
— Перехват событий (Capturing) 
— Всплывающие события (Bubbling)
Перехват событий (Capturing)
Перехват событий (Capturing)
Перехват событий (Capturing)
Перехват событий (Capturing)
Перехват событий (Capturing)
addEventListener 
01. 
02. 
03. 
54 
var button = document.querySelector('button'); 
button.addEventListener('click', clickHandler, true); 
button.addEventListener('click', yetClickHandler, true);
Всплывающие события (Bubbling)
Всплывающие события (Bubbling)
Всплывающие события (Bubbling)
Всплывающие события (Bubbling)
Всплывающие события (Bubbling)
В jQuery все события 
всплывающие из соображений 
кроссбраузерности
addEventListener 
01. 
02. 
03. 
61 
var button = document.querySelector('button'); 
button.addEventListener('click', clickHandler, false); 
button.addEventListener('click', yetClickHandler, false);
stopPropagation 
01. 
02. 
03. 
04. 
var button = document.querySelector('button'); 
button.addEventListener('click', function(event) { 
event.stopPropagation(); 
}, true); 
62
stopPropagation
stopPropagation
stopPropagation 
01. 
02. 
03. 
04. 
var button = document.querySelector('button'); 
button.addEventListener('click', function(event) { 
event.stopPropagation(); 
}, false); 
65
stopPropagation
stopPropagation
stopImmediatePropagation 
01. 
02. 
03. 
04. 
var button = document.querySelector('button'); 
button.addEventListener('click', function(event) { 
event.stopImmediatePropagation(); 
}, false); 
68
У многих элементов есть 
действия по умолчанию
preventDefault 
01. 
02. 
03. 
04. 
var link = document.querySelector('a'); 
link.addEventListener('click', function(event) { 
console.log(this); 
}, false); 
<a href="http://yandex.ru">Yandex</a> 
70
preventDefault 
01. 
02. 
03. 
04. 
05. 
var link = document.querySelector('a'); 
link.addEventListener('click', function(event) { 
event.preventDefault(); 
console.log(this); 
}, false); 
<a href="http://yandex.ru">Yandex</a> 
71
В jQuery методы также 
доступны у объекта события
В jQuery этого же эффекта 
можно достигнуть, выполнив 
return false в теле 
обработчика
Подключение jQuery на странице 
01. 
02. 
03. 
04. 
05. 
06. 
07. 
08. 
74 
<!DOCTYPE html><html lang="ru"> 
<head><title>jQuery</title></head> 
<body> 
<form class="auth" id="auth" data-value="123" action="/"> 
</form> 
<script src="//yandex.st/jquery/2.0.3/jquery.min.js"> 
</script> 
</body></html>
jQuery tips and tricks 
— Называйте jQuery-переменные, начиная с $ 
— Всегда кэшируйте результаты селекторов 
— Используйте live-события по возможности 
— Посмотрите „30 Days to Learn jQuery“ 
— Используйте map, grep, proxy и другие утилиты 
75
Мы научились 
— Получать доступ к узлу или набору узлов 
— Обход дерева 
— Изменять атрибуты узла 
— Добавлять / удалять / клонировать узлы 
— Обрабатывать события на узлах 
76
Спасибо 
dench@yandex-team.ru 
twitter.com/denchistyakov

More Related Content

What's hot

Frontend весна 2014 лекция 3
Frontend весна 2014 лекция 3Frontend весна 2014 лекция 3
Frontend весна 2014 лекция 3Technopark
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4Technopark
 
Frontend весна 2014 лекция 2
Frontend весна 2014 лекция 2Frontend весна 2014 лекция 2
Frontend весна 2014 лекция 2Technopark
 
Drupal 7 deploy database updates
Drupal 7 deploy database updatesDrupal 7 deploy database updates
Drupal 7 deploy database updates
Anton Ivanov
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4Technopark
 
использование Hibernate java persistence.part 2.
использование Hibernate java persistence.part 2.использование Hibernate java persistence.part 2.
использование Hibernate java persistence.part 2.
Asya Dudnik
 
Tequila - язык для продвинутой генерации JSON
Tequila - язык для продвинутой генерации JSONTequila - язык для продвинутой генерации JSON
Tequila - язык для продвинутой генерации JSONIvan Nemytchenko
 
Ф'Yii'лософия
Ф'Yii'лософияФ'Yii'лософия
Ф'Yii'лософия
Paul Klimov
 
Общая архитектура Yii2
Общая архитектура Yii2Общая архитектура Yii2
Общая архитектура Yii2
Paul Klimov
 
Реалтзация связанных списков в CMS Plone
Реалтзация связанных списков в CMS PloneРеалтзация связанных списков в CMS Plone
Реалтзация связанных списков в CMS Plone
Sergey Greger
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
Vasya Petrov
 
знакомство с Web driver
знакомство с Web driverзнакомство с Web driver
знакомство с Web driverIgor Pozumentov
 
Javascript
JavascriptJavascript
Javascript
Vasya Petrov
 
Yii2
Yii2Yii2
Yii2
Noveo
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
Vasya Petrov
 
Архитектура RESTful API на Pyramid — приемы проектирования Дмитрий Вахрушев
Архитектура RESTful API на Pyramid — приемы проектирования Дмитрий ВахрушевАрхитектура RESTful API на Pyramid — приемы проектирования Дмитрий Вахрушев
Архитектура RESTful API на Pyramid — приемы проектирования Дмитрий Вахрушев
it-people
 
Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2
Paul Klimov
 
YiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляцииYiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляции
Paul Klimov
 
Making Scalable JavaScript Application
Making Scalable JavaScript ApplicationMaking Scalable JavaScript Application
Making Scalable JavaScript ApplicationMikhail Davydov
 

What's hot (20)

Frontend весна 2014 лекция 3
Frontend весна 2014 лекция 3Frontend весна 2014 лекция 3
Frontend весна 2014 лекция 3
 
Web весна 2013 лекция 4
Web весна 2013 лекция 4Web весна 2013 лекция 4
Web весна 2013 лекция 4
 
Frontend весна 2014 лекция 2
Frontend весна 2014 лекция 2Frontend весна 2014 лекция 2
Frontend весна 2014 лекция 2
 
Drupal 7 deploy database updates
Drupal 7 deploy database updatesDrupal 7 deploy database updates
Drupal 7 deploy database updates
 
Web осень 2012 лекция 4
Web осень 2012 лекция 4Web осень 2012 лекция 4
Web осень 2012 лекция 4
 
использование Hibernate java persistence.part 2.
использование Hibernate java persistence.part 2.использование Hibernate java persistence.part 2.
использование Hibernate java persistence.part 2.
 
Tequila - язык для продвинутой генерации JSON
Tequila - язык для продвинутой генерации JSONTequila - язык для продвинутой генерации JSON
Tequila - язык для продвинутой генерации JSON
 
Ф'Yii'лософия
Ф'Yii'лософияФ'Yii'лософия
Ф'Yii'лософия
 
Общая архитектура Yii2
Общая архитектура Yii2Общая архитектура Yii2
Общая архитектура Yii2
 
Jquery
JqueryJquery
Jquery
 
Реалтзация связанных списков в CMS Plone
Реалтзация связанных списков в CMS PloneРеалтзация связанных списков в CMS Plone
Реалтзация связанных списков в CMS Plone
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
знакомство с Web driver
знакомство с Web driverзнакомство с Web driver
знакомство с Web driver
 
Javascript
JavascriptJavascript
Javascript
 
Yii2
Yii2Yii2
Yii2
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Архитектура RESTful API на Pyramid — приемы проектирования Дмитрий Вахрушев
Архитектура RESTful API на Pyramid — приемы проектирования Дмитрий ВахрушевАрхитектура RESTful API на Pyramid — приемы проектирования Дмитрий Вахрушев
Архитектура RESTful API на Pyramid — приемы проектирования Дмитрий Вахрушев
 
Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2
 
YiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляцииYiiConf: Миграции и инсталляции
YiiConf: Миграции и инсталляции
 
Making Scalable JavaScript Application
Making Scalable JavaScript ApplicationMaking Scalable JavaScript Application
Making Scalable JavaScript Application
 

Viewers also liked

Презентация JQuery от Future Colors
Презентация JQuery от Future ColorsПрезентация JQuery от Future Colors
Презентация JQuery от Future Colors
Илья Барышев
 
SMACSS - масштабируемая модульная архитектура css
SMACSS - масштабируемая модульная архитектура cssSMACSS - масштабируемая модульная архитектура css
SMACSS - масштабируемая модульная архитектура css
Ecommerce Solution Provider SysIQ
 
JavaScript
JavaScriptJavaScript
JavaScript
Vasya Petrov
 
Дэвид Флэнаган — Javascript (5 издание)
Дэвид Флэнаган — Javascript (5 издание)Дэвид Флэнаган — Javascript (5 издание)
Дэвид Флэнаган — Javascript (5 издание)
mlatushko
 
Beminar js
Beminar jsBeminar js
Beminar jsYandex
 
Becoming a Better Programmer
Becoming a Better ProgrammerBecoming a Better Programmer
Becoming a Better Programmer
Pete Goodliffe
 
Object Oriented CSS
Object Oriented CSSObject Oriented CSS
Object Oriented CSS
Nicole Sullivan
 
Real world continuous delivery
Real world continuous deliveryReal world continuous delivery
Real world continuous delivery
Seb Rose
 
TDD - Inevitable Challenge for Software Developers (phpkonf15 keynote)
TDD - Inevitable Challenge for Software Developers (phpkonf15 keynote)TDD - Inevitable Challenge for Software Developers (phpkonf15 keynote)
TDD - Inevitable Challenge for Software Developers (phpkonf15 keynote)
Lemi Orhan Ergin
 
How to build a great coding culture
How to build a great coding cultureHow to build a great coding culture
How to build a great coding culture
Mark Halvorson
 
Pair Programming demystified
Pair Programming demystifiedPair Programming demystified
Pair Programming demystified
Daftcode
 
The Programmer
The ProgrammerThe Programmer
The Programmer
Kevlin Henney
 
Paris ML meetup
Paris ML meetupParis ML meetup
Paris ML meetup
Yves Raimond
 
A Beginners Guide to noSQL
A Beginners Guide to noSQLA Beginners Guide to noSQL
A Beginners Guide to noSQL
Mike Crabb
 
Working With Big Data
Working With Big DataWorking With Big Data
Working With Big Data
Seth Familian
 
Creative Traction Methodology - For Early Stage Startups
Creative Traction Methodology - For Early Stage StartupsCreative Traction Methodology - For Early Stage Startups
Creative Traction Methodology - For Early Stage Startups
Tommaso Di Bartolo
 
The Physical Interface
The Physical InterfaceThe Physical Interface
The Physical Interface
Josh Clark
 
Mobile-First SEO - The Marketers Edition #3XEDigital
Mobile-First SEO - The Marketers Edition #3XEDigitalMobile-First SEO - The Marketers Edition #3XEDigital
Mobile-First SEO - The Marketers Edition #3XEDigital
Aleyda Solís
 
Visual Design with Data
Visual Design with DataVisual Design with Data
Visual Design with Data
Seth Familian
 
Build Features, Not Apps
Build Features, Not AppsBuild Features, Not Apps
Build Features, Not Apps
Natasha Murashev
 

Viewers also liked (20)

Презентация JQuery от Future Colors
Презентация JQuery от Future ColorsПрезентация JQuery от Future Colors
Презентация JQuery от Future Colors
 
SMACSS - масштабируемая модульная архитектура css
SMACSS - масштабируемая модульная архитектура cssSMACSS - масштабируемая модульная архитектура css
SMACSS - масштабируемая модульная архитектура css
 
JavaScript
JavaScriptJavaScript
JavaScript
 
Дэвид Флэнаган — Javascript (5 издание)
Дэвид Флэнаган — Javascript (5 издание)Дэвид Флэнаган — Javascript (5 издание)
Дэвид Флэнаган — Javascript (5 издание)
 
Beminar js
Beminar jsBeminar js
Beminar js
 
Becoming a Better Programmer
Becoming a Better ProgrammerBecoming a Better Programmer
Becoming a Better Programmer
 
Object Oriented CSS
Object Oriented CSSObject Oriented CSS
Object Oriented CSS
 
Real world continuous delivery
Real world continuous deliveryReal world continuous delivery
Real world continuous delivery
 
TDD - Inevitable Challenge for Software Developers (phpkonf15 keynote)
TDD - Inevitable Challenge for Software Developers (phpkonf15 keynote)TDD - Inevitable Challenge for Software Developers (phpkonf15 keynote)
TDD - Inevitable Challenge for Software Developers (phpkonf15 keynote)
 
How to build a great coding culture
How to build a great coding cultureHow to build a great coding culture
How to build a great coding culture
 
Pair Programming demystified
Pair Programming demystifiedPair Programming demystified
Pair Programming demystified
 
The Programmer
The ProgrammerThe Programmer
The Programmer
 
Paris ML meetup
Paris ML meetupParis ML meetup
Paris ML meetup
 
A Beginners Guide to noSQL
A Beginners Guide to noSQLA Beginners Guide to noSQL
A Beginners Guide to noSQL
 
Working With Big Data
Working With Big DataWorking With Big Data
Working With Big Data
 
Creative Traction Methodology - For Early Stage Startups
Creative Traction Methodology - For Early Stage StartupsCreative Traction Methodology - For Early Stage Startups
Creative Traction Methodology - For Early Stage Startups
 
The Physical Interface
The Physical InterfaceThe Physical Interface
The Physical Interface
 
Mobile-First SEO - The Marketers Edition #3XEDigital
Mobile-First SEO - The Marketers Edition #3XEDigitalMobile-First SEO - The Marketers Edition #3XEDigital
Mobile-First SEO - The Marketers Edition #3XEDigital
 
Visual Design with Data
Visual Design with DataVisual Design with Data
Visual Design with Data
 
Build Features, Not Apps
Build Features, Not AppsBuild Features, Not Apps
Build Features, Not Apps
 

Similar to DOM & jQuery

Drupal. Forms
Drupal. FormsDrupal. Forms
Drupal. Formstakrin54
 
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_schoolITmozg
 
Jsfwdays 2013-2
Jsfwdays 2013-2Jsfwdays 2013-2
Jsfwdays 2013-2
Pavlo Iuriichuk
 
Web весна 2012 лекция 4
Web весна 2012 лекция 4Web весна 2012 лекция 4
Web весна 2012 лекция 4Technopark
 
Автоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows PhoneАвтоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows Phone
CodeFest
 
QA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшe
QA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшeQA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшe
QA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшe
QAFest
 
SECON'2016. Иовлев Роман, JDI is UI Automation Future
SECON'2016. Иовлев Роман, JDI is UI Automation FutureSECON'2016. Иовлев Роман, JDI is UI Automation Future
SECON'2016. Иовлев Роман, JDI is UI Automation Future
SECON
 
Avito / SPA Meetup 2
Avito / SPA Meetup 2Avito / SPA Meetup 2
My batis
My batisMy batis
Максим Ширшин "SVARX, или Борьба с большими формами"
Максим Ширшин "SVARX, или Борьба с большими формами"Максим Ширшин "SVARX, или Борьба с большими формами"
Максим Ширшин "SVARX, или Борьба с большими формами"
Yandex
 
Take more from Jquery
Take more from JqueryTake more from Jquery
Take more from JqueryMagento Dev
 
Web весна 2012 лекция 9
Web весна 2012 лекция 9Web весна 2012 лекция 9
Web весна 2012 лекция 9Technopark
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать жить
Moscow.pm
 
JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.
Igor Shkulipa
 
Профилирования и оптимизация jQuery-кода
Профилирования и оптимизация jQuery-кодаПрофилирования и оптимизация jQuery-кода
Профилирования и оптимизация jQuery-кодаprivate_face
 
MyBatis на практике
MyBatis на практикеMyBatis на практике
MyBatis на практике
Vitebsk Miniq
 
Профилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кодаПрофилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кодаprivate_face
 
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)Ontico
 

Similar to DOM & jQuery (20)

course js day 4
course js day 4course js day 4
course js day 4
 
Drupal. Forms
Drupal. FormsDrupal. Forms
Drupal. Forms
 
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_school
 
Jsfwdays 2013-2
Jsfwdays 2013-2Jsfwdays 2013-2
Jsfwdays 2013-2
 
Web весна 2012 лекция 4
Web весна 2012 лекция 4Web весна 2012 лекция 4
Web весна 2012 лекция 4
 
Автоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows PhoneАвтоматизация UI тестирования под Windows и Windows Phone
Автоматизация UI тестирования под Windows и Windows Phone
 
QA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшe
QA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшeQA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшe
QA Fes 2016. Алексей Виноградов. Page Objects: лучше проще, да лучшe
 
SECON'2016. Иовлев Роман, JDI is UI Automation Future
SECON'2016. Иовлев Роман, JDI is UI Automation FutureSECON'2016. Иовлев Роман, JDI is UI Automation Future
SECON'2016. Иовлев Роман, JDI is UI Automation Future
 
Avito / SPA Meetup 2
Avito / SPA Meetup 2Avito / SPA Meetup 2
Avito / SPA Meetup 2
 
Ci
CiCi
Ci
 
My batis
My batisMy batis
My batis
 
Максим Ширшин "SVARX, или Борьба с большими формами"
Максим Ширшин "SVARX, или Борьба с большими формами"Максим Ширшин "SVARX, или Борьба с большими формами"
Максим Ширшин "SVARX, или Борьба с большими формами"
 
Take more from Jquery
Take more from JqueryTake more from Jquery
Take more from Jquery
 
Web весна 2012 лекция 9
Web весна 2012 лекция 9Web весна 2012 лекция 9
Web весна 2012 лекция 9
 
Пластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать житьПластилиновый код: как перестать кодить и начать жить
Пластилиновый код: как перестать кодить и начать жить
 
JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.JavaScript Базовый. Занятие 11.
JavaScript Базовый. Занятие 11.
 
Профилирования и оптимизация jQuery-кода
Профилирования и оптимизация jQuery-кодаПрофилирования и оптимизация jQuery-кода
Профилирования и оптимизация jQuery-кода
 
MyBatis на практике
MyBatis на практикеMyBatis на практике
MyBatis на практике
 
Профилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кодаПрофилирование и оптимизация jQuery–кода
Профилирование и оптимизация jQuery–кода
 
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
Профилирование и оптимизация jQuery–кода (Владимир Журавлёв)
 

DOM & jQuery

  • 1. DOM, jQuery и все все все На Яндеск.Диске yadi.sk/d/4PUvH1NwAKes2 На JsFiddle jsfiddle.net/dench/RHtRZ/8/
  • 2. Среда выполнения — JavaScript !== Браузер — Браузер в том числе — ОС: WebOS, Firefox OS, Chrome OS — Сервер: Node.JS, SpiderMonkey, Rhino — Офисные приложения: MS Office, OpenOffice 2
  • 3. Различные среды предоставляют различный API для работы с ними
  • 4. DOM — Document Object Model — это API, для чтения и редактирования содержимомого HTML и XML-документов — Это дерево, узлами которого могут быть элементы, текст, комментарии, атрибуты и другие 4
  • 5. Что позволяет нам DOM? — Получать доступ к узлу или набору узлов — Обход дерева — Изменять атрибуты узла — Добавлять / удалять / клонировать узлы — Обрабатывать события на узлах 5
  • 6. Простейший DOM 01. 02. 03. 04. 05. 06. 07. 08. <!DOCTYPE html><html lang="ru"> <head><title>DOM</title></head> <body> <form class="auth" id="auth" data-value="123" action="/"> <input type="text" value="" name="login"> <input type="password" value="" name="password"> <button>Отправить</button> </form> 6
  • 7. Что такое jQuery? — JS-библиотека, призванная сделать код удобнее и более кроссбраузерным — Главный слоган „Write less, do more“ — «Пиши меньше, получай больше» — Всё API нацелено сделать код короче, понятнее и исправить шороховатости в нативных реализациях 7
  • 8. Что такое jQuery? — Был разработан и презентован Джоном Резигом в 2006 — Продолжает развиваться и сейчас — Код постоянно претерпевает рефакторинг и оптимизации
  • 9. Что такое jQuery? — Используется практически всеми крупнейшими компаниями (Яндекс, Google, Mozilla) — Имеет обширное комьюнити и огромное количество plugin`ов — Есть расширения для UI и мобильных приложений 9
  • 10. Волшебный $ — Переменные в JS могут начинаться с букв и некоторых символов — jQuery — одна из первых библиотек, начавших использовать $ в качестве пространства имен — jQuery === $ 10
  • 12. Поиск элементов 01. 02. 03. 04. 05. <form class="auth" id="auth" data-value="123" action="/"> <input type="text" value="" name="login"> <input type="password" value="" name="password"> <button>Отправить</button> </form> 12
  • 13. getElementById document.getElementById('auth'); <form class="auth" id="auth" data-value="123" action="/"> <input type="text" value="" name="login"> <input type="password" value="" name="password"> <button>Отправить</button> </form> 01. 02. 03. 04. 05. 13
  • 14. getElementById $('#auth'); <form class="auth" id="auth" data-value="123" action="/"> <input type="text" value="" name="login"> <input type="password" value="" name="password"> <button>Отправить</button> </form> 01. 02. 03. 04. 05. 14
  • 15. querySelector document.querySelector('.auth'); <form class="auth" id="auth" data-value="123" action="/"> <input type="text" value="" name="login"> <input type="password" value="" name="password"> <button>Отправить</button> </form> 01. 02. 03. 04. 05. 15
  • 16. querySelector $('.auth'); <form class="auth" id="auth" data-value="123" action="/"> <input type="text" value="" name="login"> <input type="password" value="" name="password"> <button>Отправить</button> </form> 01. 02. 03. 04. 05. 16
  • 17. querySelector document.querySelector('[name="login"]'); 01. 02. 03. 04. 05. <form class="auth" id="auth" data-value="123" action="/"> <input type="text" value="" name="login"> <input type="password" value="" name="password"> <button>Отправить</button> </form> 17
  • 18. querySelector $('[name="login"]'); 01. 02. 03. 04. 05. <form class="auth" id="auth" data-value="123" action="/"> <input type="text" value="" name="login"> <input type="password" value="" name="password"> <button>Отправить</button> </form> 18
  • 19. querySelectorAll document.querySelectorAll('input,button'); 01. 02. 03. 04. 05. <form class="auth" id="auth" data-value="123" action="/"> <input type="text" value="" name="login"> <input type="password" value="" name="password"> <button>Отправить</button> </form> 19
  • 20. NodeList не Array ¶ методов forEach, map и т.п. — нет!
  • 21. Итерирование по результатам Вариант №1 var elems = document.querySelectorAll('input,button'); for (var i = 0, l = elems.length; i < l; i++) { var elem = elems[i]; 01. 02. 03. 04. } 21
  • 22. Итерирование по результатам Вариант №2 var elems = document.querySelectorAll('input,button'); var elemsList = Array.prototype.slice.call(elems); elemsList.forEach(function(elem) { … }); 01. 02. 03. 04. 05. 22
  • 23. querySelectorAll $(':input'); 01. 02. 03. 04. 05. <form class="auth" id="auth" data-value="123" action="/"> <input type="text" value="" name="login"> <input type="password" value="" name="password"> <button>Отправить</button> </form> 23
  • 24. Все методы поиска возвращают коллекции и предоставляют методы для итерирования по ним
  • 25. Итерирование по результатам 01. 02. 03. $(':input').each(function(){ var $item = $(this); }); 25
  • 26. Для поиска используется библиотека Sizzle
  • 28. Атрибуты и свойства var form = document.getElementById('auth'); var $form = $(form); <form class="auth" id="auth" data-value="123" action="/"> <input type="text" value="" name="login"> <input type="password" value="" name="password"> <button>Отправить</button> </form> 01. 02. 01. 02. 03. 04. 05. 28
  • 29. *Attribute 01. 02. 03. 04. 05. form.getAttribute('action'); >> "/" form.hasAttribute('method', 'POST'); >> false form.setAttribute('method', 'POST'); form.hasAttribute('method', 'POST'); >> true form.removeAttribute('method'); 29
  • 30. *Attribute 01. 02. 03. $form.attr('action'); >> "/" $form.attr('method', 'POST'); $form.removeAttr('method'); 30
  • 31. Data-атрибуты form.dataset['value']; >> "123" form.dataset.hasOwnProperty('value'); >> true form.dataset.foo = 'bar'; <form class="auth" id="auth" data-value="123" action="/"> <input type="text" value="" name="login"> <input type="password" value="" name="password"> <button>Отправить</button> 01. 02. 03. 01. 02. 03. 04. 31
  • 32. Data-атрибуты 01. 02. $form.data('value'); >> "123" $form.data('foo', 'bar'); 01. 02. 03. 04. 05. <form class="auth" id="auth" data-value="123" action="/"> <input type="text" value="" name="login"> <input type="password" value="" name="password"> <button>Отправить</button> </form> 32
  • 33. Атрибуты !== свойства 01. 02. 03. form.getAttribute('action'); >> "/" form.getAttribute('method'); >> null form.getAttribute('id'); >> "auth" 01. 02. 03. form.action; >> "http://fiddle.jshell.net/" form.method; >> "get" form.id; >> "auth" 33
  • 34. Атрибуты !== свойства 01. 02. 03. $form.attr('action'); >> "/" $form.attr('method'); >> undefined $form.attr('id'); >> "auth" 01. 02. 03. 34 $form.prop('action'); >> "http://fiddle.jshell.net/" $form.prop('method'); >> "get" $form.prop('id'; >> "auth"
  • 35. Классы 01. 02. form.className; >> "auth" form.className += " form"; >> "auth form" 01. 02. 03. 04. form.classList.add('foo'); form.classList.item(1); >> "form" form.classList.contains('foo'); >> true form.classList.remove('foo'); 35
  • 36. Классы 01. 02. 03. $form.addClass('form'); $form.hasClass('form'); >> true $form.removeClass('form'); 36
  • 38. createElement + appendChild 01. 02. 03. 04. 05. 06. 38 var elem = document.createElement('span'); elem.className = 'error'; elem.setAttribute('id', 'auth-error'); elem.setAttribute('foo', 'bar'); elem.textContent = "Введен неверный логин или пароль"; document.body.appendChild(elem);
  • 39. createElement + appendChild 01. 02. 03. 04. 05. 06. var $elem = $('<span>', { id: "auth-error", class: ["error"], foo: "bar", text: "Введен неверный логин или пароль" }).appendTo(document.body); 39
  • 40. cloneNode 01. 02. 03. 04. 05. 06. 07. 40 var elem = document.createElement('span'); … var clone = elem.cloneNode(true) clone.id = 'mail-error'; clone.textContent = "Не удалось отправить письмо"; document.body.appendChild(elem); document.body.appendChild(clone);
  • 41. cloneNode 01. 02. 03. 04. 05. 06. var $body = $(document.body); var $elem = $('<span>', {…}); var $clone = $elem.clone(true) .prop('id', 'mail-error') .text("Не удалось отправить письмо") $body.append($elem).append($clone) 41
  • 43. Все элементы DOM и jQuery могут реагировать на те или иные события
  • 44. Можно навешивать обработчики в HTML 01. 02. 03. 04. 05. 06. <form class="auth" id="auth" data-value="123" action="/" onsubmit="submitHandler()"> <input type="text" value="" name="login"> <input type="password" value="" name="password"> <button onclick="clickHandler()">Отправить</button> </form> 44
  • 45. Почему это плохо? — Нельзя навешать более одного обработчика на узел — JS и HTML становятся тесно связаны — Неинтуитивно — При изменении HTML необходимо всегда помнить про атрибуты с обработчиками — Нельзя динамически навешивать обработчики 45
  • 46. addEventListener 01. 02. var form = document.getElementById('auth'); form.addEventListener('submit', submitHandler); 01. 02. 03. 46 var button = document.querySelector('button'); button.addEventListener('click', clickHandler); button.addEventListener('click', yetClickHandler);
  • 47. addEventListener var $form = $('#auth'); $form.on('submit', submitHandler); var $button = $('button'); $button.on('click', clickHandler); .on('click', yetClickHandler); 01. 02. 01. 02. 03. 47
  • 48. Существует два подхода — Перехват событий (Capturing) — Всплывающие события (Bubbling)
  • 54. addEventListener 01. 02. 03. 54 var button = document.querySelector('button'); button.addEventListener('click', clickHandler, true); button.addEventListener('click', yetClickHandler, true);
  • 60. В jQuery все события всплывающие из соображений кроссбраузерности
  • 61. addEventListener 01. 02. 03. 61 var button = document.querySelector('button'); button.addEventListener('click', clickHandler, false); button.addEventListener('click', yetClickHandler, false);
  • 62. stopPropagation 01. 02. 03. 04. var button = document.querySelector('button'); button.addEventListener('click', function(event) { event.stopPropagation(); }, true); 62
  • 65. stopPropagation 01. 02. 03. 04. var button = document.querySelector('button'); button.addEventListener('click', function(event) { event.stopPropagation(); }, false); 65
  • 68. stopImmediatePropagation 01. 02. 03. 04. var button = document.querySelector('button'); button.addEventListener('click', function(event) { event.stopImmediatePropagation(); }, false); 68
  • 69. У многих элементов есть действия по умолчанию
  • 70. preventDefault 01. 02. 03. 04. var link = document.querySelector('a'); link.addEventListener('click', function(event) { console.log(this); }, false); <a href="http://yandex.ru">Yandex</a> 70
  • 71. preventDefault 01. 02. 03. 04. 05. var link = document.querySelector('a'); link.addEventListener('click', function(event) { event.preventDefault(); console.log(this); }, false); <a href="http://yandex.ru">Yandex</a> 71
  • 72. В jQuery методы также доступны у объекта события
  • 73. В jQuery этого же эффекта можно достигнуть, выполнив return false в теле обработчика
  • 74. Подключение jQuery на странице 01. 02. 03. 04. 05. 06. 07. 08. 74 <!DOCTYPE html><html lang="ru"> <head><title>jQuery</title></head> <body> <form class="auth" id="auth" data-value="123" action="/"> </form> <script src="//yandex.st/jquery/2.0.3/jquery.min.js"> </script> </body></html>
  • 75. jQuery tips and tricks — Называйте jQuery-переменные, начиная с $ — Всегда кэшируйте результаты селекторов — Используйте live-события по возможности — Посмотрите „30 Days to Learn jQuery“ — Используйте map, grep, proxy и другие утилиты 75
  • 76. Мы научились — Получать доступ к узлу или набору узлов — Обход дерева — Изменять атрибуты узла — Добавлять / удалять / клонировать узлы — Обрабатывать события на узлах 76