2 заметки с тегом

javascript

Швейцарский нож jQuery-разработчика — jQuery Helpers

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

Можно посмотреть на Гитхабе или сразу скачать.

makeActive
cycle
genHtml
appendCount, prependCount
onlyDigits
parseInt, parseFloat
breakdown
cleaner
dataObject
popup
transmit
src, href
disable, enable
hash, pathname
run
removeSpaces
reverse
ending

makeActive (’classname’ || object{classname, selector})

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

$(this).makeActive('my_class_name');

Или передать объект, заключающий в себе название класса и селектор соседних элементов:

$(this).makeActive({
	className: 'my_class_name',
	selector: 'div'
});

Пример:

$('div').click(function(){
    $(this).makeActive();
});

cycle (’next’ || ’prev’)

Не знаю как вам, а мне иногда катастрофически не хватает циклических next / prev в jQuery. Эту проблему я решил, написав хелпер cycle, который принимает next или prev в качестве строки.

Пример:

$('#prev').click(function(){
    $('.wrap div.active').cycle('prev').makeActive();
});

$('#next').click(function(){
    $('.wrap div.active').cycle('next').makeActive();
});

genHtml (code, count)

Иногда бывает задача создать определённое количество html элементов, например для пагинации слайдера.

Конструкции вроде:

$('.slide').each(function(i){
	var $li = $('<li>').append('<a><span>'+ (i+1) +'</span></a>');
	$pagination.append($li);
});

меня всегда бесили. Поэтому был написан хелпер genHtml, который принимает тег строкой и количество.

appendCount, prependCount

Вставляют нужное количество html элементов на страницу, используя genHtml. Синтаксис такой же как у genHtml.

onlyDigits

Иногда требуется текстовый инпут, в который физически можно ввести только цифры. К великому сожалению, стандартные средства html не предлагают такого функционала (даже <input type="number" /> в котором это было бы логично). Для этого существует хелпер onlyDigits.

$('input').onlyDigits();

parseInt, parseFloat

Вызываются у блока с числом или инпута и возвращают число сразу с типом number.

breakdown

С помощью этого хелпера, можно разбить число пробелами по разрядам.

$('#num').breakdown();

cleaner

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

Для этих целей был написан хелпер cleaner. Он добавляет рядом с инпутом <a class="clean" />, который можно оформить с помощью css как душе угодно.
Желательно перед использованием обернуть инпут в какой-нибудь див, а крестик прижать вправо абсолютным позиционированием. А после этого добавить инпуту паддинг справа, чтобы текст не заезжал на крестик. Да, к сожалению всё это не так удобно, как мне хотелось бы, но работаю над упрощением. Для стандартного использования написан css-код, который желательно просто копировать в основной файл стилей своего проекта и изменять.

dataObject

Данный хелпер позволяет доставать javascript-объекты из атрибутов data-*. Используется также, как и стандартный метод .data() в jQuery, только вместо строки возвращает объект.

Иногда нужен простой попап, который бы закрывался при клике за его пределами. Для этого был написан хелпер popup. При вызове он добавляет элементу класс shown, и удаляет при закрытии (я использую добавление класса, а не show/hide, чтобы управлять анимацией появления при помощи css). Метод может принимать объект, с атрибутами link и close. link — ссылка, при клике на которую будет показан попап. close — элемент внутри попапа (крестик), при клике на который попап будет закрыт.

transmit (’method’, [options array])

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

$(window).load(function(){
	$('#object').click();
});

мне кажутся нелогичными и трудночитаемыми, когда намного логичней было бы так:

$(window).load($('#object').click);

Но jQuery перезаписывает контекст у колбеков. И конечно в 99% случаев это удобно, но не в данном.
Хелпер transmit частично решает эту проблему, позволяя писать так:

$(window).load($('#object').transmit('click'));

src, href

Возвращают/изменяют значение атрибутов src и href у элементов на странице. Мне не хватало таких методов как val() у инпутов, только для ссылок.

disable, enable

disable — добавляет атрибут disabled у элементов, enable — убирает.

hash, pathname

Возвращают/изменяют соответствующие части href у ссылок на странице.

run

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

removeSpaces

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

reverse()

Разворачивает порядок следования jQuery объектов.

ending (end1, end2, end3, count)

Хелпер для формирования окончаний у слов во множественном числе.

Для определения возможностей браузера я рекомендую использовать Modernizr. Но в своей работе я сталкивался с тем, что не все нужные мне тесты были реализованы в нём. Поэтому я написал парочку своих, расширив jQuery.support, и оформив всё в файл jquery.support.js.

jQuery.support.calc

Определяет, поддерживает  ли браузер css-функцию calc. Актуально для старых версий оперы и 8-го экслорера.

jQuery.support.flash

Определяет, установлен ли Flash на компьютере пользователя.

jQuery.support.mobile

Детектит мобильные браузеры.

jQuery.support.preserve3d

Проверяет, поддерживается ли браузером 3D представления. Актуально, если вы хотите использовать в своём проекте transform-style: preserve-3d;.

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

UPD: Произошла какая-то фигня, и я не заметил, как публикнул недописанный черновик. Но это даже хорошо, т. к. я бы ещё месяц его мусолил. Так что кто увидел — тссс.

2014   javascript   jQuery   jQueryHelpers

finalReject — наипростейшая заглушка для старых версий IE

finalReject — Плагин, отображающий, в устаревших версиях Internet Explorer, заглушку с предложением обновить браузер. Заглушка накладывается поверх сайта в виде попапа, и в случае чего может быть закрыта пользователем. При этом, после закрытия, она не исчезает навсегда, а прикрепляется к верхней части окна браузера, и продолжает отображаться в минимизированном виде.

Полная заглушка выглядит вот так:

Установка плагина предельно проста. Достаточно скачать архив по ссылке и распаковать папку reject в корень сайта. Или в любое другое место на сайте.

Подключается плагин самым нативным способом: с помощью условных комментариев. Например для отображения заглушки во всех версиях IE ниже 9, достаточно добавить в блок <head> следующий код:

<!--[if lt IE 9]>
	<link rel="stylesheet" href="/reject/reject.css" media="all" />
	<script type="text/javascript" src="/reject/reject.min.js"></script>
<![endif]-->

В 7-9 версиях Internet Explorer плагин отображается и работает так, как задумано. В 6-й не совсем, но тоже адекватно.

Страница плагина на Гитхабе. Буду рад вашим старам, и пулл реквестам :-)

На какое-то время, эта заметка в блоге будет являться официальной страницей плагина, пока я не придумаю что-нибудь поинтересней.

UPD: Теперь finalReject можно установить с помощью bower:

$ bower install final-reject --save

UPD2: Можно ничего не скачивать и не устанавливать, а просто добавить в <head> код:

<!--[if lt IE 9]>
	<link rel="stylesheet" href="https://rawgit.com/codefucker/finalReject/master/reject/reject.css" media="all" />
	<script type="text/javascript" src="https://rawgit.com/codefucker/finalReject/master/reject/reject.min.js"></script>
<![endif]-->

UPD3: Текст заглушки можно изменить с помощью аттрибута data-text:

<!--[if lt IE 9]>
	<link rel="stylesheet" href="https://rawgit.com/codefucker/finalReject/master/reject/reject.css" media="all" />
	<script type="text/javascript" src="https://rawgit.com/codefucker/finalReject/master/reject/reject.min.js" data-text="Unfortunately, the browser you use, outdated and can not properly display the site. Please download any of the following browsers:"></script>
<![endif]-->
2014   finalReject   IE   javascript   plugin