Блог Страница 192

Работа с функциями bind, unbind и объектом-событием

0

Мы проведем лишь краткий обзор представленных функций, поскольку их применение оправдано в довольно редких ситуациях. В случае острой необходимости, дополнительную информацию по данным функциям всегда можно отыскать в специальной литературе, посвященной jQuery.

Иногда вам понадобится получить более полный контроль над некоторыми событиями. Сделать это можно при помощи удобных функций bind() и unbind(). Вы можете передавать в них параметры, отвечающие за типы событий (click, mouseenter и др.), данные, а также обработчики событий (или вызывать другую функцию). Данные являются дополнительным параметром; их рассмотрение выходит за рамки этого курса.

.bind(event type, data, functionName) jQuery(“.post”).bind(“mouseenter”, function(){//code}); Привязывает к выбранным элементам функцию, которая будет вызвана по заданному событию.
.unbind(event type, functionName) jQuery(“.post”).unbind(“mouseenter”, function(){//code}); Удаляет обработку события у выбранных элементов.

В предыдущей статье мы реализовали эффект подсветки пунктов с помощью функции hover(). Теперь мы попробуем сделать то же самое с помощью функций bind() и unbind(). Данный способ является не самой изящной реализацией простого эффекта наведения – он слишком громоздкий. Однако иногда такое решение бывает востребовано.

Основное преимущество функции bind() состоит в том, что вы можете передавать в нее данные. В следующем примере мы передадим данные, а именно цвет нашего фона, в функцию события:

...
  jQuery(".widget-area li ul li").bind("mouseenter", {color: "#f60"}, 
function(event){
      jQuery(this).css("background", event.data.color);
         jQuery(this).unbind("mouseleave");
  });
  jQuery(".widget-area li ul li").bind("mouseleave", function(){
      jQuery(this).css("background", "none");
      jQuery(this).unbind("mouseenter");
  });
...

В предыдущем примере, для того чтобы передать данные, мы воспользовались объектом-событием. Объединенный объект-событие помогает передать информацию о возникшем событии в функцию, сохраняя исходный код понятным и чистым, что позволяет быстро отыскивать и устранять ошибки.

event.type Возвращает тип события (mouseenter, keyup и т.д.)
event.target Возвращает выбранный элемент, который инициировал событие.
event.data Возвращает дополнительные данные, переданные через функцию bind.
event.pageX, .pageY Определяет позицию курсора мыши относительно левого края (pageX) или верхнего края (pageY) документа.
event.result Возвращает последнее значение, которое было возвращено обработчиком событий. Полезно для поиска и устранения ошибок.
event.timeStamp Возвращает временную метку (timestamp) Unix, когда событие было инициировано.

Следующий код будет выводить атрибуты объекта-события по щелчку:

...
jQuery(".post").click(function(event){
    jQuery(this).html("event type: "+event.type+"<br/>event timestamp: 
"+event.timeStamp+"<br/>event x: "+event.pageX+"<br/>event y: "+event.
pageY);
});
...

Еще одна функция объекта-события, которая может оказаться полезной в дальнейшей работе – preventDefault(). Она может отменить стандартное действие элемента.

.preventDefault() jQuery(.post a).preventDefault(); Предотвращает выполнение стандартных действий, определенных браузером, для выбранных элементов.
.ispreventDefault() jQuery(.post a).ispreventDefault(); Возвращает истину или ложь, в зависимости от того, установлена или нет функция ispreventDefault на выбранном наборе элементов.

Работа с селекторами jQuery

0

В данной статье мы познакомимся с работой селекторов и фильтров. Для иллюстрации выборки элементов я буду использовать функцию css(). Мы изучим эту функцию подробнее в следующих разделах. Сейчас же нашей задачей будет понять функционирование селекторов и фильтров.

Если вы работали когда-либо с CSS, то вы с легкостью сможете понять механизм работы селекторов в jQuery. Выборка необходимого набора элементов объявляется в самом начале основной функции jQuery:

jQuery(function(){
jQuery("selector:filter").jqFunctionName();
});

Выборка на базе синтаксиса CSS может производиться по:

  • названиям HTML-тегов. Пример: p, div, body и т.д.
  • идентификаторам (атрибутам id). Пример: #one, #nice и т.д.
  • классам (атрибутам class). Пример: .posted, .deleted и т.д.

Естественно, любая комбинация, разрешенная в CSS, будет также допустима и в jQuery:

  • Tag (пробел, либо слитно) #id или .className (например, div#sidebar li)
  • Tag, .class (например, p, .post)

Для внесения большей ясности введем формальное определение структуры селекторов (по аналогии с CSS):

  • (a,b) Запятая обозначает выборку как элементов a, так и элементов b. К примеру, div, p выберет все теги div и все теги p.
  • (a b c …) Пробел означает выборку элемента a, который содержит в себе хотя бы один элемент b, который, в свою очередь, содержит в себе хотя бы один элемент c (и т.д.). К примеру, div p .className выберет все теги div, внутри которых имеется хотя бы один тег p, включающий в себя хотя бы один элемент, принадлежащий классу .className.
  • (ab, где b – класс или идентификатор) Отсутствие пробела означает выборку всех элементов, которые обладают заданным классом или идентификатором b. К примеру, p.className выбирает все элементы p, принадлежащие классу .className.

Также в пределах jQuery вы можете использовать следующие дополнительные символы для уточнения вашей выборки:

  • Символ > позволяет выбирать все дочерние элементы указанного родителя.

К примеру, .post > p выберет все элементы p, содержащиеся непосредственно в классе .post.

Сравним на примерах действие .post > p и .post p.

Первый наш пример будет выглядеть следующим образом:

jQuery(function(){
jQuery(".post p").css("background", "#f60");
});

Работу этого сниппета можно оценить на следующем изображении. Заметьте, что выделение получили абсолютно все абзацы, несмотря на то, что они вложены в другой класс .entry-content.

Теперь перейдем ко второму примеру:

jQuery(function(){
jQuery(".post > p").css("background", "#f60");
});

Здесь мы видим, что ни один из абзацев не получил выделение, поскольку они находятся внутри div с классом .entry-content, следовательно, не являются дочерними элементами класса .post.

Селектор + будет выбирать все соседние элементы для заданного селектора. К примеру, li + li выберет каждый элемент li списка, за исключением первого. Пример:

...
jQuery("li + li").css("background", "#f60");
...

Селектор ~ выберет все элементы, находящиеся на одном уровне с заданным селектором. К примеру, li ~ li выберет все элементы li списка, находящиеся на одном уровне с первым элементом li. Пример:

...
jQuery("li ~ li").css("background", "#f60");
...

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

Работа с DOM

0

С помощью jQuery вы можете перемещаться по дереву DOM и напрямую обрабатывать его объекты, вместо того чтобы работать с элементами, находящимися в обернутом наборе (помните: расположенные в массиве элементы больше не являются объектами DOM). Для того чтобы вести работу непосредственно с DOM, вы можете использовать несколько функций и свойств jQuery. Официальный сайт jQuery предлагает список, состоящий из 20, или даже 30 функций, которые вы можете использовать для перемещения по DOM, однако при работе с WordPress они вам, скорее всего, не понадобятся. Те функции, которые я буду использовать в дальнейшем, являются частью ядра jQuery, и не принадлежат к Traversing API, что, однако, не мешает мне применять их для управления объектами DOM.

.length, или size() jQuery(“.post”) .length; Возвращает количество элементов в выбранном наборе.
.get(number-optional) jQuery(“.post”) .get(3); Возвращает массив собственных элементов DOM. Функция удобна на тот случай, если вы не хотите работать напрямую с DOM и не желаете использовать обертку jQuery.
.find(selector) jQuery(“.post”) .find(“.entry b”); Возвращает массив jQuery элементов для первого селектора, который соответствует заданному селектору функции
.each(functionName) jQuery(“.post”) .each(function(){//code}); Выполняет функцию для каждого элемента, соответствующего заданному селектору

Поскольку эти функции возвращают числа и массивы, их можно использовать для быстрого поиска различных ошибок. Пример:

...
alert("How many posts does this blog have? "+jQuery(".post").length);
jQuery(".post").each(function(){
    alert("one alert for each .post")
});
...

Результат вы можете увидеть на следующем скриншоте:

Применение селекторов и фильтров jQuery

0

Самое время приступить к изучению jQuery. Для того чтобы у вас не возникло никаких вопросов, мы начнем изучение jQuery с азов и закончим более сложными вопросами. Процесс обучения может быть условно разбит на следующие пункты:

  • Работа с селекторами и фильтрами
  • Управление контентом и стилевыми правилами CSS
  • Работа с событиями и эффектами

Первый пункт списка – “Работа с селекторами и фильтрами” – очень важен для глубокого понимания jQuery. Селекторы и фильтры позволяют выбирать объекты на странице и группировать их в новый jQuery-объект, с которым можно выполнять любые необходимые действия. С помощью селекторов можно легко и быстро захватить массив элементов, используя прозрачный синтаксис CSS. Фильтры используются для корректировки и уточнения результатов выбранного массива элементов.

Помните, что объекты, взятые в обертку jQuery при помощи селекторов и фильтров, не являются больше элементами DOM. Они представляют собой массив элементов, находящийся в обертке нового jQuery объекта, который обладает целым набором доступных функций и возможностей.

Подключение jQuery к WordPress

0

jQuery может быть подключен к WordPress тремя различными способами:

  • Вы можете скачать библиотеку jQuery с сайта jquery.com и подключить ее непосредственно к XHTML-заголовку файла header.php с помощью тега script. Этот способ является действенным, однако он не рекомендуется в силу некоторых причин.
  • Вы можете зарегистрировать jQuery в WordPress при помощи API.
  • Вы можете использовать в своих интересах сеть Google CDN (Code Distribution Network) для того чтобы подключить jQuery к темам и плагинам.

Мы рассмотрели основы первого метода в статье Подключение библиотеки jQuery. WordPress это настолько гибкая платформа, что любой пользователь, обладающий подходящим уровнем администрирования, сможет без особых проблем обновить и улучшить тему, установить дополнительные плагины, которые могут также использовать jQuery или другие Javascript библиотеки. Именно поэтому подключение jQuery или других Javascript файлов напрямую к теме при помощи тегов script не рекомендуется, так как это может приводить к различным конфликтам с другими скриптами и библиотеками, используемыми на сайте под управлением WordPress. В данной главе мы рассмотрим применение двух последних методов подключения jQuery к WordPress.

Основные фильтры jQuery

0

Поскольку мы будем вести работу с WordPress, нам понадобятся удобные фильтры :not() и :header. Фильтр :header позволяет выбрать все заголовки, вне зависимости от их уровня (h1, h2, и т.д.). Попробуйте добавить в созданный файл custom-jquery.js следующий код (не волнуйтесь о части .css()…, мы вернемся к ней позже. Я использую ее только для того, чтобы проиллюстрировать действие фильтров):

jQuery(function(){
jQuery(":header").css("background", "#f60");
});

На рисунке вы можете заметить действие данного фильтра. Все заголовки получили соответствующее представление (оранжевый фон):

Моим любимым фильтром является фильтр :not(). Очень часто при выборке элементов в обертку сложно задать какие-либо конкретные условия, поэтому проще сказать, что вы не хотите в ней видеть. Когда-то давно я работал с темой, в которой иконки для e-mail и PDF были вложены в класс .post. У темы не было класса .entry. Все это ужасно раздражало, поскольку я хотел применить некоторые преобразования к изображениям, которые находились в записях WordPress, однако эти преобразования затрагивали и иконки! Автор темы обернул иконки в класс .postIcons. С помощью фильтра :not() я смог задать преобразования только для тегов img, которые были расположены в классе .post, исключив из рассмотрения .postIcons.

Посмотрим, что произойдет, если мы добавим фильтр :not() к нашей предыдущей выборке:

...
jQuery(":header:not(li :header)").css("background", "#f60");
...

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

Из предыдущего примера вы, вероятно, заметили, что фильтры можно использовать многократно в пределах выборки. Это позволяет добиться хороших результатов. К примеру, (“:headers:not(li h2)”) выполнит аналогичное действие, что и выборка, которая была приведена в предыдущем примере. Всегда лучше идти прямыми маршрутами к своей цели. Я лишь пытаюсь проиллюстрировать, как можно использовать эти два фильтра. Безусловно, в дальнейшем вы столкнетесь с более сложными ситуациями, в которых вам пригодятся полученные знания.

Давайте подробно рассмотрим каждый из основных фильтров. В качестве иллюстрации их синтаксиса я буду использовать класс .post, поскольку он чаще всего применяется на практике.

:not(selector) jQuery(“.post img:not(.pIcon)”).jqFn(); Исключает из выборки все элементы, соответствующие заданному селектору
:header jQuery(“.post:header”).jqFn(); Оставляет в выборке все элементы, являющиеся заголовками различных уровней (h1,h2,…)
:first jQuery(“.post:first”) .jqFn(); Оставляет в выборке только первый выбранный элемент
:last jQuery(“.post:last”) .jqFn(); Оставляет в выборке только последний выбранный элемент
:even jQuery(“.post:even”) .jqFn(); Оставляет в выборке только четные элементы. Примечание: массивы нумеруются с нуля. Ноль считается четным числом, т.е. первый элемент массива также войдет в выборку.
:odd jQuery(“.post:odd”) .jqFn(); Оставляет в выборке только нечетные элементы. Примечание: массивы нумеруются с нуля. Ноль считается четным числом, т.е. первый элемент массива не войдет в выборку.
:eq(number) jQuery(“.post:eq(0)”) .jqFn(); Оставляет в выборке один элемент, который характеризуется своим номером. Примечание: нумерация начинается с нуля.
:gt(number) jQuery(“.post:gt(0)”) .jqFn(); Оставляет в выборке все элементы с номерами, которые превосходят заданный номер. Примечание: нумерация начинается с нуля.
:lt(number) jQuery(“.post:lt(2)”) .jqFn(); Оставляет в выборке все элементы с номерами, которые не превосходят заданный номер.
:animated jQuery(“.post:animated”).jqFn(); Оставляет в выборке все элементы, которые в настоящий момент анимированы (мы рассмотрим анимацию позже в данном разделе).

Обход конфликтных ситуаций, связанных с подключением jQuery

0

Для того чтобы избежать конфликтных ситуаций, связанных с использованием короткой переменной $, необходимо ориентироваться на синтаксис noConflict режима. Функция wp_enqueue_script гарантирует загрузку jQuery в режиме noConflict. Во избежание конфликтов достаточно заменить переменную $ полной перемнной jQuery.

Установка собственной переменной jQuery

Если вы считаете переменную jQuery слишком длинной для написания, вы всегда можете заменить стандартную переменную $ на любую другую, оставаясь при этом в границах режима noConflict:

<script type="text/javascript">
var $jq = jQuery.noConflict();
$jq(document).ready(function() {
$jq("p").click(function() {
alert("Hello world!");
});
});
</script>

Способ безопасного использования переменной $

Несмотря на то, что использование переменной $ в пределах WordPress может приводить к различным конфликтам библиотек, существует возможность ее безопасного применения. Тем более, для использования $ есть множество веских причин. Не будет же разработчик при копировании каждого сценария изменять все вхождения $ на jQuery или любые другие короткие варианты? (говорят, есть такая опция “Найти и заменить”, но мы про нее не слышали…) Следующий пример демонстрирует, как можно безопасно использовать переменную $ в jQuery скриптах:

jQuery(function ($) {
/* jQuery only code using $ can safely go here */
});

Обзор событий и эффектов jQuery

0

В предыдущих статьях мы научились работе с селекторами; теперь Вы можете захватывать любые элементы, управлять их атрибутами, устанавливать CSS правила. Основываясь на представленных примерах, вы, безусловно, придумали что-то свое, что хотелось бы реализовать в собственной теме. Однако не будем спешить с этим, ведь мы до сих пор не знакомы с событиями и эффектами.

Работа с событиями в jQuery

Существует множество событий, которые могут быть обработаны с помощью jQuery. Вы можете привязывать события к элементам, удалять события, ссылаться на объединенный объект-событие, а также использовать хэлперы. Первым шагом, с которого мы начнем свое изучение событийного аппарата jQuery, станет знакомство с хэлперами.

Хэлперы, или вспомогательные функции (также известные как “shortcuts”), позволяют легко устанавливать события при щелчке или наведении на элемент. Также вы можете легко переключать события для достижения интересных эффектов. Ниже приведен список полезных хэлперов, которые мы будем использовать в WordPress:

.click(functionName) jQuery(“.post”) .click(function(){//code}); Связывает функцию с событием click, которые происходит при одиночном щелчке мыши.
.dbclick(functionName) jQuery(“.post”) .dbclick(function(){//code}); Связывает функцию с событием click, которое происходит при двойном щелчке мыши.
.hover(functionName1,functionName2) jQuery(“.post”) .hover(function(){//code}); Работает с событиями mouseenter/mouseleave. Привязывает к выбранным элементам две функции, которые вызываются при событиях mouseenter и mouseleave.
.toggle(functionName1, functionName2, functionName3, и т.д.) jQuery(“.post”) .toggle(function(){//code}); Работает с событием click. Привязывает к выбранным элементам несколько функций, каждая из которых вызывается при каждом новом щелчке мыши, т.е. происходит чередование вызываемых функций.
.mouseenter(functionName) jQuery(“.post”) .mouseenter(function(){//code}); Вызывает функцию, когда указатель мыши перемещается поверх выбранных элементов.
.mouseleave(functionName) jQuery(“.post”) .mouseleave(function(){//code}); Вызывает функцию, когда указатель мыши покидает выбранные элементы.
.keydown(functionName) jQuery(“.post”) .keydown(function(){//code}); Связывает функцию с событием keydown, которое происходит в том случае, когда выбранный элемент получил фокус и нажата кнопка клавиатуры.
.keyup(functionName) jQuery(“.post”) .keyup(function(){//code}); Связывает функцию с событием keyup, которое происходит в том случае, когда выбранный элемент получил фокус и кнопка клавиатуры была отпущена (естественно, до этого она должна быть нажата).

С событиями страница получает большую живость и динамичность. Давайте попробуем добавить эффект подсветки к пунктам сайдбара:

...
jQuery(".widget-area li ul li").hover(function(){
    jQuery(this).css("background", "#f60");
  },
  function(){
    jQuery(this).css("background", "none");
});
...

В результате, как только курсор мыши переместится на какой-либо из пунктов сайдбара, тот изменит свой бэкграунд на оранжевый.

Как отфильтровать выбранный набор элементов

0

Возможно, на первоначальном этапе вам будет достаточно стандартного набора стилевых CSS селекторов. Однако мы не будем долго останавливаться на них, и пойдем дальше. Фильтры – еще один важный и полезный инструмент, позволяющий сузить круг выборки. Опять же, возвращаясь к темам WordPress, с фильтрами вы можете выполнять различные действия над элементами: выбирать их по названиям, идентификаторам и атрибутам, без необходимости ручного редактирования кода.

С помощью jQuery можно легко и быстро изменить разметку страницы. Однако, делать это в WordPress нужно очень осторожно, поскольку есть риск повредить тему. Понимание фильтров позволит вам получить более тщательный контроль над выборками.

По аналогии с CSS, многие фильтры похожи на псевдоклассы CSS (к примеру, :hover и :first-child). Эти фильтры разбиты в jQuery API по следующим категориям (я перечислих их в порядке применимости в WordPress): основные фильтры, фильтры контента, дочерние фильтры, фильтры форм, фильтры атрибутов, фильтры видимости.

Использование Google CDN

0

В некоторых случаях регистрация библиотеки jQuery и привязка ее копии к WordPress оказываются неприемлимыми для разработчика. Решением возникшей проблемы выступает загрузка jQuery из Google CDN (Code Distribution Network). CDN позволяет сохранить пропускную способность канала, вследствие чего сайт получает возможность производить параллельную обработку данных во время загрузки дополнительных скриптов. Вдобавок ко всему, разработчик всегда может получить из CDN самую последнюю версию jQuery. Среди других преимуществ Google CDN стоит отметить быструю загрузку библиотеки jQuery и возможность ее кэширования, т.е. если пользователь ранее заходил на сайт, который использует аналогичный способ загрузки jQuery, ему не придется вновь подгружать данную библиотеку, т.к. она будет храниться в кэше.

Регистрация и подключение библиотеки jQuery через CDN Google

Для того чтобы подключить jQuery через CDN Google, необходимо убедиться в том, что библиотека изначально не зарегистрирована в теме, после чего можно проводить регистрацию jQuery в CDN. Делается это довольно просто посредством функции wp_enqueue_script. Если какой-либо плагин или сценарий требует для своего выполнения jQuery и не конфликтует с версией библиотеки, загруженной из Google, то эта версия jQuery будет использована в процессе выполнения скрипта. Если же скрипт зависит от какой-либо конкретной версии библиотеки jQuery (скажем, 1.3.2 или 1.2.6), а в CDN загружена версия 1.4.2, то в таком случае для скрипта будет загружена необходимая версия. Поскольку каждый скрипт, загруженный через Script API, остается в режиме noConflict, нормальным считается обладать двумя версиями jQuery, используемыми по мере необходимости.

...
wp_deregister_script( 'jquery' );
wp_register_script(   'jquery', 'http://ajax.googleapis.com/ajax/libs/
jquery/1.4/jquery.min.js');
...

Google предлагает удобную систему управления версиями, позволяющую отыскать именно ту версию библиотеки, которая вам необходима, либо воспользоваться последней стабильной версией.

Функционирование системы управления версиями

В примере, приведенном выше, я ввел фрагмент “…jquery/1.4/jquery…” для определения необходимой мне версии библиотеки jQuery. Поскольку последней стабильной версией jQuery на момент написания статьи являлась 1.4.2, то она была бы автоматически загружена к моей теме. Если бы разработчики выпустили версию 1.4.3, то она стала бы вызываться по расположенной в примере ссылке, поскольку я определил версию с точностью до двух первых цифр. Аналогично, если бы я ввел строку “…jquery/1.3/jquery…”, то система управления версиями произвела бы загрузку последней существующей версии jQuery вида 1.3.x, а именно 1.3.2. Если же указать “…jquery/1/…”, то система загрузит последнюю существующую на данный момент версию библиотеки вида 1.x.

Использование системы управления версиями открывает перед разработчиком возможность загрузки самой последней версии библиотеки, однако это чревато появлением различных ошибок, связанных с функционированием плагинов и сценариев. Для того чтобы обезопасить себя, достаточно определить и установить ту версию jQuery, в которой плагины и сценарии будут работать стабильно.