16
Ненавязчивый Ненавязчивый “Unobtrusive” “Unobtrusive” JavaScript JavaScript Сергеев Алексей Сергеев Алексей «Открытые Веб-Технологии» «Открытые Веб-Технологии» [email protected] [email protected]

ненавязчивый Java Script алексей сергеев

Embed Size (px)

Citation preview

Page 1: ненавязчивый Java Script   алексей сергеев

НенавязчивыйНенавязчивый“Unobtrusive”“Unobtrusive”JavaScriptJavaScript

Сергеев АлексейСергеев Алексей«Открытые Веб-Технологии»«Открытые Веб-Технологии»[email protected]@openwebtech.ru

Page 2: ненавязчивый Java Script   алексей сергеев

www.rit2007.ru

Progressive EnhancementProgressive Enhancement

Всё содержание сайта доступно в любом браузере

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

Семантическая верстка Представление отделено от содержания за

счёт внешнего CSS Поведение отделено от содержания за счёт

«Unobtrusive» JavaScript

Page 3: ненавязчивый Java Script   алексей сергеев

www.rit2007.ru

Ненавязчивый Ненавязчивый JavaScriptJavaScript

Главные принципы: весь JS-код находится во внешнем файле обработчики событий добавляются после

загрузки страницы с помощью специальных функций

стили добавляются за счёт атрибутов class и id, а не за счёт прямого указания значений внутри JavaScript-функций

Page 4: ненавязчивый Java Script   алексей сергеев

www.rit2007.ru

Пример реализацииПример реализации

Переход по ссылке,

требующей

авторизацию

Page 5: ненавязчивый Java Script   алексей сергеев

www.rit2007.ru

Поиск необходимого элементаПоиск необходимого элемента

getElementById

getElementsByTagName

button = document.getElementById('submitter');

links = document.getElementsByTagName('a');

Page 6: ненавязчивый Java Script   алексей сергеев

www.rit2007.ru

Поиск необходимого элементаПоиск необходимого элемента

<ul id="menu"> <li><a href="/about">О компании</a></li> <li><a href=“/products">Продукция</a></li> <li><a href="/contacts">Контакты</a></li></ul>

function getMenuLinks(){ var parentObj = document.getElementById('menu'); var menuLinks = parentObj.getElementsByTagName('a'); return menuLinks;}

Page 7: ненавязчивый Java Script   алексей сергеев

www.rit2007.ru

Поиск необходимого элементаПоиск необходимого элемента

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

<input class="required" name="phone" />

function getRequired(){ var inputs = document.getElementsByTagName('input'); var requiredInputs = new Array; for ( var i = 0; i < inputs.length; i++ ) { if ( inputs[i].className.match('required‘) ) requiredInputs.push(inputs[i]); } return requiredInputs;}

Page 8: ненавязчивый Java Script   алексей сергеев

www.rit2007.ru

Дерево элементовДерево элементов

Page 9: ненавязчивый Java Script   алексей сергеев

www.rit2007.ru

Добавление обработчикаДобавление обработчика

Плохие способы

<a href="#" onclick="login();">

<a href="javascript:login();">

<a href="javascript:void(0);" id="login">

document.getElementById('login').onclick = function(){

}

Page 10: ненавязчивый Java Script   алексей сергеев

www.rit2007.ru

Добавление обработчикаДобавление обработчика

DOM event model: addEventListener removeEventListener

MSIE: attachEvent detachEvent

Page 11: ненавязчивый Java Script   алексей сергеев

www.rit2007.ru

Добавление обработчикаДобавление обработчика

function addEvent(obj, evType, func, useCapture){ if (obj.addEventListener){ obj.addEventListener(evType, func, useCapture); return true; } else if (obj.attachEvent){ var r = obj.attachEvent('on'+evType, func); return r; } else { obj['on'+evType] = func; }}

Page 12: ненавязчивый Java Script   алексей сергеев

www.rit2007.ru

Отмена исходного действияОтмена исходного действия

DOM event model: preventDefault stopPropagation

MSIE: window.event.returnValue window.event.cancelBubble

Page 13: ненавязчивый Java Script   алексей сергеев

www.rit2007.ru

Отмена исходного действияОтмена исходного действия

function cancelDefault(e){ if ( e && e.preventDefault && e.stopPropagation() ){ e.stopPropagation(); e.preventDefault(); } if ( window.event ){ window.event.cancelBubble = true; window.event.returnValue = false; }}

Page 14: ненавязчивый Java Script   алексей сергеев

www.rit2007.ru

Источник событияИсточник события

DOM Event Model e.target

MSIE window.event.srcElement

if ( window.event && window.event.srcElement ){ elem = window.event.srcElement;} else if ( e && e.target ) { elem = e.target;} else { return;}

Page 15: ненавязчивый Java Script   алексей сергеев

www.rit2007.ru

AJAXAJAX

Сначала не-AJAX версия Добавьте обработчики событий, которые

вместо ссылок и кнопок будут пересылать данные на сервер через XMLHttpRequest

Используте атрибуты href и action Для простоты используйте AHAH (Asynchronous

HTML and HTTP)

Page 16: ненавязчивый Java Script   алексей сергеев

www.rit2007.ru

Спасибо за внимание!Спасибо за внимание!