Основы «ненавязчивого» JavaScript |
|
Веб-разработка в последнее время существенно изменилась: мы прекратили смешивать содержание, оформление и функциональность, и, таким образом, менять дизайн и верстку по всему сайту стало легче - для этого нужно просто изменить таблицу стилей. А дополнительная функциональность может быть легко добавлена в уже существующий файл скриптов или за счет подключения нового. Давайте рассмотрим, как научиться использовать все преимущества современных браузеров, не ограничивая при этом пользователей более старых версий. Javascript: храним отдельноОдна из сильных сторон Javascript заключается в том, что его можно поместить в отдельный файл. Как и для CSS это означает, что можно присвоить одну коллекцию функций для каждой страницы сайта, и если нам нужно изменить ее функциональность, можно сделать все это в одном документе, что предпочтительнее, чем перебирать все страницы и менять какой-то один участок кода на другой. Например, мы можем подключить только один такой файл, который будет обеспечивать всю логику функционирования страницы в клиентском браузере. <script type="text/javascript" src="/scripts.js"></script> Javascript - это расширениеМы используем Javascript, только чтобы улучшить уже существующую функциональность, так как мы не можем на него полностью полагаться. Javascript может быть выключен или отфильтрован прокси-серверами и файерволами компаний, обеспечивающих безопасность. Мы никогда не можем принимать Javascript за данноcть. Это не означает, что мы совсем не можем использовать Javascript, это только значит, что мы можем добавлять его лишь как дополнительную возможность. Страницы должны работать и при выключенном JavaScript - это одно из основных правил «ненавязчивого» JavaScript. Давайте рассмотрим для примера следующий HTML-код: <form action="/"> Если у пользователя отключен JavaScript (или он отрабатывает некорректно в силу особенностей различных браузеров), то зайти на сайт будет просто невозможно. И это только по причине неверного проектирования, а не ошибки на стороне сервера или неверного расположения элементов в дизайне. Мы можем исправить этот фрагмент, заменив button на submit и добавив обработчик события submit для формы: <p><input type="submit" value="Войти"/></p> Доверять, но проверятьМножество ошибок в Javascript происходит просто потому, что разработчики слишком ленивы, чтобы проверить, доступен или нет данный объект или метод. Всегда при использовании какой-либо внешней переменной (которая не определена явно в этой функции) либо функционала, зависящего от браузера (например, DOM-методов), необходимо быть уверенным, что используемый объект или метод существует. В качестве примера правильных проверок можно привести следующий код: function color(object, color) { Если мы хотим убедиться, что браузер поддерживает W3C DOM, то достаточно провести следующую проверку: if (document.getElementById) { В общем случае нет никакой необходимости полагаться на передаваемую браузерами строку агента. Доступ к элементамКаждый XML- (а также и HTML-) документ - это дерево узлов. Узел - часть этого дерева (в качестве аналогии можно привести дерево файлов и директорий на жестком диске). Давайте посмотрим, какие функции и атрибуты мы можем использовать, чтобы перемещаться по дереву документа и выбирать необходимые нам узлы. getElementById('elementID') getElementsByTagName('tag') Естественно, мы можем смешивать и сочетать эти два варианта. Несколько примеров: document.getElementById('nav').getElementsByTagName('a')[1]; document.getElementsByTagName('div')[1].getElementsByTagName('p')[3]; Полный перечень всех DOM-методов, которые поддерживаются сейчас практически всеми браузерами, здесь приводить не имеет смысла. При желании с ними можно ознакомиться на сайте w3.org. Полезные советыМы способны получить доступ к любому элементу документа и затем изменить этот элемент, и мы можем улучшить работу пользователя, не привязываясь к Javascript. Однако возможны некоторые проблемы общего характера.
Добавляем обработчики событийГлавная техника, которую мы используем, чтобы сохранить наш Javascript «ненавязчивым», - это хранение скрипта в отдельном файле, что предпочтительней, чем смешивать его с разметкой страницы. Чтобы исполнить функции в нашем .js файле, нам надо вызвать их, когда страница загружена (подробнее о событии загрузки страницы было рассказано в начале этой главы). В некоторых случаях (например, при экстремальной оптимизации, глава четвертая) весь JavaScript-код может находиться в HTML-документе, заключенный в <script type=.text/javascript.>...</script>. Но это не будет означать, что мы смешиваем разметку страницы с ее обработкой, а содержание - с функциональностью. В этих случаях JavaScript-код будет полностью отделен от содержания, для которого он предназначен. Существует возможность добавлять обработчики событий в комплект к уже существующим обработчикам. При вызове функции мы передаем ей объект, который нужно привязать к событию, тип события и имя функции. function addEvent(object, eventType, function){ События - довольно сложная тема в Javascript. Для разработки простых веб-сайтов указанных примеров достаточно, но если мы переходим к разработке веб-приложений, тут ситуация многократно усложняется. Поэтому стоит быть внимательным к их функционированию в условиях отключенного или неподдерживаемого JavaScript. Ускоряем обработку событийДавайте рассмотрим, как можно использовать методы «ненавязчивого» JavaScript для максимального ускорения обработки событий в браузере. Мы можем уменьшить число приемников событий, которые назначены документу, путем определения одного приемника для контейнера и проверки в обработчике, из какого дочернего элемента всплыло это событие. Предположим, что у нас основная навигация по сайту включает шесть ссылок сверху, четырем из которых требуются обработчики событий, чтобы поменять у них атрибут href. У этих четырех ссылок атрибут class выставлен в bundle. Скорее всего, ситуация будет выглядеть следующим образом. var MenuNavigation = { В этом фрагменте довольно много лишнего. Во-первых, метод getElementsByTagName просматривает каждый дочерний DOM-узел в элементе mainNav, чтобы найти все ссылки. Затем мы еще раз пробегаем по всему найденному массиву, чтобы проверить имя класса каждой ссылки. Это пустая трата процессорного времени на каждом этапе. И это замедление загрузки страницы на уровне JavaScript-логики. Немного усложнимМожно прикрепить один-единственный обработчик событий к элементу mainNav, чтобы затем отслеживать все клики на ссылки внутри него: var MenuNavigation = { Простота и элегантность данного подхода должны быть очевидны, но у него есть и некоторое количество преимуществ в плане производительности:
Боремся с Internet ExplorerЕсть одна небольшая проблема при использовании изложенного выше кода. Определение целевого элемента у события, на самом деле, не является просто вызовом e.target. В Internet Explorer необходимо использовать e.srcElement. Самым простым решением для устранения этой проблемы является небольшая функция getEventTarget. Ниже представлена наиболее актуальная версия. function getEventTarget(e) { Переопределение событий в настоящее время является самой распространенной практикой, если речь заходит о большом числе обработчиков событий (например, о карте с сотнями точек, к которым назначены обработчики событий-кликов). Лучше всего для этого по умолчанию использовать простой, интуитивно понятный и хорошо оптимизированный метод для применения в качестве шаблона в программировании на стороне клиента, и он не должен требовать сотен строчек JavaScript-библиотек для своей работы. Пойдем дальшеА что, если нам нужно добавить такой обработчик на все ссылки (или почти на все)? Правильно: тогда для контейнера всех этих ссылок стоит выбрать document.body. Ниже пример кода, который позволяет так сделать. var MenuNavigation = { Если мы собираемся обрабатывать все ссылки, то нужно учесть, что в них могут быть вложены и картинки, и другие теги, поэтому добавлено рекурсивное «всплытие» ссылки: проверяется родитель объекта, на котором сработало событие, и если у него не определен атрибут href, то перебор продолжается, иначе возвращаем искомый объект. Вложение ссылок друг в друга запрещено стандартами, так что, если мы сами же проектируем HTML-код, то бояться нечего. Обработка событий в браузерахДавайте рассмотрим несколько практических способов работы с обработчиками событий в браузерах. Например, можно назначить обработчик напрямую: node.onclick = function(){ Если нужно несколько событий, или просто «осторожничаем», то можно воспользоваться следующей распространенной записью: if (node.addEventListener) Или таким модицифицированным вариантом (меньше символов): if (node.attachEvent) Можно также использовать отдельную переменную для обработчика события: var addEvent = node.attachEvent || node.addEventListener; Или записать в одну строку с использованием условной компиляции: node[/*@cc_on !@*/0 ? 'attachEvent' : 'addEventListener'] Работаем с событиямиДавайте рассмотрим, что мы можем извлечь из события после перехвата его с помощью соответствующего обработчика: node[/*@cc_on !@*/0 ? 'attachEvent' : 'addEventListener'] // или if (!e.target) { // или, если нам надо всего один раз // true везде кроме IE, в котором this === window // или просто используем вариант, который // убираем действие по умолчанию (в данном случае клик) }, false):
|
Поисковая оптимизация. С чего все начинаетсяПоисковая оптимизация - это комплекс работ над сайтом и внешними факторами для достижения наилучших позиций в поисковых системах в соответствии с выбранными ключевыми словами. Поисковую оптимизацию можно разделить на внутреннюю и внешнюю. Внутренняя оптимизация сайта направлена на работу с самим сайтом. Читать полностью |
Что ждет нас в будущем?Как мы видим, Яндекс не стоит на месте, и я уверен, что поисковые технологии этой системы будут развиваться и дальше, чтобы повышать качество поиска, которое пока трудно назвать идеальным. Читать полностью |
Матрикснет – новое качество поиска ЯндексаОсновная задача поисковой системы – дать ответ на вопрос пользователя. Когда пользователь задает запрос, поисковая система не обращается к каждому сайту в интернете, а ищет по базе известных ей страниц – поисковому индексу. Там она находит все страницы со словами из запроса. Ссылки на эти страницы пользователь и видит на страницах результатов поиска. Читать полностью |
Яндекс - как он выглядит внутри?Cайт www.yandex.ru был создан в 1997 году, для него хватало всего одного сервера, который стоял под рабочим столом одного из группы первых разработчиков Яндекса, Дмитрия, по фамилии Тейблюм. Очень быстро после открытия приобрели второй сервер, а вскоре, когда понадобилось установить ещё один, стало понятно, что под столом хватает пространства либо на три сервера Яндекса, либо на две ноги ... Читать полностью |
