Статьи

Звездный контроль с помощью jQuery

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

Если вы никогда ранее не использовали jQuery, скачайте бесплатный образец PDF и начните работу с введением в Главе 2. Глава 7, из которой взята эта статья, также включена в загрузку, так что если вы предпочитаете читать этот учебник в автономном режиме, вы можете сделать это на досуге.

Вы можете получить образец кода для этой статьи здесь .

Наш клиент хочет повысить вовлеченность пользователей и помочь своим пользователям чувствовать себя важными. Мы немного подумали об этом и бросили ему идею звездного рейтинга — в конце концов, люди не любят ничего больше, чем выражать свои чувства через назначение золотых звезд. Наш новый блестящий элемент управления появится, как показано на рисунке 1, «Звездный контроль» .


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


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

Для звезд мы будем полагаться на спрайты CSS. Таким образом, наш элемент управления будет зависеть только от одного изображения (как показано на рисунке 2, «Звездное изображение спрайта CSS» ), что экономит на HTTP-запросах и облегчает редактирование нашими графическими дизайнерами.


Наш CSS будет применять изображение спрайта CSS к ссылкам, которые мы создаем, которые представляют пол-звезды. Для перемещения между различными состояниями изображения нам просто нужно обновить свойство background-position :


Мы решили сделать так, чтобы пользователь выбирал рейтинг из четырех звезд, а не из обычных пяти. Почему? Психология пользователя! Предложите человеку среднюю дорогу, и она его возьмет; не имея посредников, мы заставляем пользователей больше думать о своем выборе. Мы добиваемся лучших результатов, и мы сможем лучше представить пользователям лучший контент (выбранный ими)!

Но четыре — это ограниченная шкала, поэтому мы хотим учесть полузвездные рейтинги. Это осуществляется с помощью оптического обмана — вы, вероятно, заметили, что наши изображения звезд делятся пополам. Наш HTML будет содержать восемь радиокнопок, и каждая из них будет стоить пол звезды. В коде есть две части для преобразования наших восьми переключателей в четыре звезды. Во-первых, функция createStars возьмет контейнер с переключателями и заменит его звездными ссылками. Затем к каждой звезде будут добавлены соответствующие обработчики событий (в методе addHandlers ), чтобы пользователь мог взаимодействовать с addHandlers управления. Вот скелет нашего объекта starRating :


Метод create перебирает каждый контейнер, соответствующий селектору, который мы передаем, и создает список ссылок, которые действуют как прокси для переключателей. Эти ссылки — то, что мы сделаем так, чтобы они выглядели как звезды. Он также скрывает оригинальные элементы формы, поэтому пользователь видит только наши милые звезды:


Мы начинаем с создания контейнера для новых ссылок (элемент div ); мы создадим одну новую ссылку для каждой из переключаемых кнопок. После выбора всех переключателей с помощью фильтра :radio , мы берем рейтинг каждого элемента и используем его для создания элемента гиперссылки.

Как только наша ссылка будет готова, мы передадим ее методу addHandlers — здесь мы добавим события, необходимые для ее работы. Затем мы добавляем его в список контейнеров. Как только он окажется в контейнере, мы увидим, выбран ли текущий переключатель (мы используем фильтр формы :checked ). Если этот флажок установлен, мы хотим добавить class rating к этой полузвезде и ко всем полумесяцам до нее. Любой ссылке с class rating будет присвоено изображение золотой звезды (что позволит пользователям видеть текущий рейтинг).

Чтобы выбрать все элементы, которые нам нужны, чтобы превратить золото, мы собираемся заручиться поддержкой нескольких новых действий jQuery: prevAll и andSelf . Действие prevAll выбирает каждого родного брата перед текущим выбором (в отличие от действия prev , которое выбирает только непосредственно предыдущего родного брата). Для нашего примера мы хотим добавить class к предыдущим братьям и сестрам и текущему выбору. Для этого мы применяем действие andSelf , которое просто включает исходный выбор в текущий выбор. Теперь у нас есть все ссылки, которые будут золотыми, поэтому мы можем добавить class .

совет: другие методы обхода

Вы могли догадаться, что наряду с prevAll jQuery предоставляет нам метод nextAll , который захватывает все родственные элементы элемента, встречающиеся после него в том же контейнере. JQuery 1.4 также представил два новых сопутствующих метода: prevUntil и nextUntil , Они вызываются с помощью селектора и будут сканировать одноуровневые элементы (вперед или назад, в зависимости от того, какой из них вы используете), пока они не попадут в элемент, соответствующий селектору.

Так, например, $('h2:first').nextUntil('h2'); даст вам все элементы, расположенные между первым h2 на странице и следующим h2 в том же элементе контейнера.

Если вы передадите второй параметр в prevUntil или nextUntil , он будет использоваться как селектор для фильтрации возвращаемых элементов. Так, например, если бы мы написали nextUntil('h2', 'div') , он вернул бы только элементы div между нашим текущим выбором и следующим h2 .

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


Элемент управления выглядит так, как будто он обретает форму, но пока ничего не делает. Нам нужно прикрепить некоторые обработчики событий и добавить некоторое поведение. Нас интересуют три события. Когда пользователи наводят курсор мыши на звезду, мы хотим обновить спрайт CSS, чтобы показать состояние наведения мыши; когда они уходят, мы хотим вернуть спрайт CSS в исходное состояние; и когда они нажимают, мы хотим сделать выбор золота:


Функция hover это самый простой способ: при наведении курсора мы выбираем все prevAll до этого, включая текущую prevAll и andSelf class prevAll andSelf , используя prevAll и andSelf , как мы это делали в настройке. При наведении курсора мы покрываем наши базы и удаляем класс rating-over все ссылки. Об этом позаботились.

Теперь за клик:


Важной частью обработки события click является обновление базовой модели переключателя. Мы делаем это, выбирая правильную радио-кнопку с :radio фильтром и селектором атрибутов, который ищет радио-кнопку, значение которой соответствует тексту текущей ссылки.

Обновив модель, мы можем вернуться к возням со спрайтами CSS. Сначала мы очищаем rating от любых ссылок, которые в данный момент есть, а затем добавляем его ко всем ссылкам, находящимся до и перед той, которую выбрал пользователь. Последнее касание — отмена действия ссылки по умолчанию, поэтому нажатие на звездочку не вызывает изменения местоположения. ,

Надеюсь, вам понравился весь вкус jQuery, который содержится в jQuery: от новичка до ниндзя . Не забудьте взять бесплатный образец PDF , который содержит этот пример, а также более 150 страниц более полезного учебного материала. Если вы уже проданы, вы можете купить книгу прямо у SitePoint .