Полезные сниппеты на jQuery

26 июня 2009, 16:12 Павел Марковнин JavaScript рейтинг +20-

Сниппеты jQueryПривет!

Помните, когда-то давно мы делали подборки сниппетов jQuery? Так вот, тогда мы закончили их выпускать, так как не могли придумывать 3-5 сниппетов в неделю, а публиковать всякий треш не хотелось.

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

Выделение группы чекбоксов с помощью клавиши Шифт

Такая возможность есть в почте Гугла и она мне очень нравится. Суть в том, что в 2 клика можно выделить группу чекбоксов. Очень удобно в различных файловых менеджерах, почтах и прочих интерфейсах с большим количеством чекбоксов. Итак, сам код:

<script type="text/javascript">
// код сниппета
(function($) {
$.fn.setCheckboxesShift = function() {
var cbx = this,
last = -1, // номер предыдущего чекбокса;
start, // служебные
finish; // переменные

// проходим по каждому указанному чекбоксу
cbx.each(function(index) {
// при клике по нему (или его лэйблу)
$(this).click(function(e) {
// проверяем, стал ли он чекнутым
if($(e.target).attr('checked')) {
// теперь смотрим, больше ли у предыдущего индекс
if(index > last) { start = last; finish = index;
} else { start = index; finish = last; }

// если был предыдущий и зажата клавиша Шифт
if(last > -1 && e.shiftKey) {
// проходим с начального до конечного чекбокса
for(i = start; i <= finish; i ++) {
// и делаем их выделенными
$(cbx[i]).attr('checked', 'checked');
}
}
// запоминаем индекс только что кликнутого чекбокса
last = index;
}
});
});
};
})(jQuery);

$('#checkboxes-list').disableTextSelect(); // для этого нужен плагин disableTextSelect
// к указанным чекбоксам добавить такую возможность
$('#checkboxes-list :checkbox').setCheckboxesShift();
</script>

Клик по объекту плавно разворачивает какой-то блок

Такой сниппет будет полезен в списке частых вопросов, где при клике на вопрос открывает ответ на него. Сниппеты можно применить как к группе пар «ссылка-блок», так и к одной паре.

<script type="text/javascript">
// код сниппета
(function($) {
$.fn.openCloseBlocks = function(blocks, options) {
var defaults = {
speed: 'normal'
},
opts = $.extend(defaults, options),
togglers = $(this),
bls = $(blocks); if(!bls) return;

togglers.each(function(index) {
$(this).click(function(e) {
e.preventDefault();
$(bls[index]).slideToggle(opts['speed']);
});
});
};
})(jQuery);

// использование
// выбераем нужные ссылки
// аргумент — что открывать (i-ый элемент первого массива
// открывает i-ый элемент второго массива)
$('div > a').openCloseBlocks($('div.blocks'), {
speed: 'fast'
});
</script>

Клик по объекту показывает блок прямо под ней поверх контента

Выпадающее меню, которые можно наблюдать у нас в «Вопросах и ответах» и Эр-Эс-Эс иконке вверху страницы. Весьма полезная вещь.

<script type="text/javascript">
// код сниппета
(function($) {
$.fn.dropDownBlock = function(block, options) {
var defaults = {
speed: 'fast',
top: $(this).height(),
left: 0
},
opts = $.extend(defaults, options),
toggler = $(this),
block = $(block);
toggler.css({'outline': 'none'})

toggler.click(function(e) {
e.preventDefault();
$(block).css({
'position' : 'absolute',
'top' : (toggler.offset().top + opts['top']) + 'px',
'left' : (toggler.offset().left + opts['left']) + 'px'
});
if($(block).is(':visible')) $(block).fadeOut(opts['speed']);
else $(block).fadeIn(opts['speed']);
this.focus();
});
toggler.blur(function() {
$(block).fadeOut(opts['speed']);
});
};
})(jQuery);

// использование
// при клике на #toggler
// под ним показывается #drop-down-list
$('#toggler').dropDownBlock($('#drop-down-list'), {
speed: 'slow',
left: 10
});
</script>

А вот страница с примерами работы всех сниппетов.

Надеюсь, что эти сниппеты будут вам полезны и удобны в работе. Если у вас есть идею для сниппетов, пишите нам — реализуем.

Рекламное место, которое может стать вашим

Понравилась статья?

Тогда подпишись на обновления через RSS или воспользуйся
другими способами подписки.

Читать в Яндекс.Ленте Добавить в Google Добавить в Netvibes
  •  

Комментарии — 20

RSS
  • Аватарка
    26 июня 2009 в 17:03 KELiON
    В почте гугла, кстати, работает и в обратную сторону — то есть снимает чеки.
  • Аватарка
    26 июня 2009 в 18:09 ]]>adw0rd]]>
    Да, полезные сниппеты!
  • Аватарка
    26 июня 2009 в 22:11 ]]>Алексей Сайковский]]>
    Второй сниппет очень нужен. А как его на сайт внедрить?
  • Аватарка
    27 июня 2009 в 6:04 ]]>Игорь]]>
    Довольно интересные идеи. Особенно понравились ссылки с раскрывающимися блоками. Уже есть идеи где их использовать. Спасибо :)
  • Аватарка
    27 июня 2009 в 8:56 ]]>Grin]]>
    Алексей, а что именно непонятно с использованием сниппета? Подключаешь джиквери, а использование самого сниппета описано в примере. Или посмотри как сделано на странице примера
  • Аватарка
    27 июня 2009 в 18:34 ]]>Gorniy]]>
    «Клик по объекту показывает блок прямо под ней поверх контента»
    Объект - это она что ли? :)
  • Аватарка
    28 июня 2009 в 10:35 Михаил
    Первый сниппет точно так же должен и снимать выбор с флажков, тоже с шифтом.
  • Аватарка
    28 июня 2009 в 23:55 ]]>FaTeRy]]>
    ИМХО первый и 3й абсолютно бесполезны, а второй как раз просто шикарен! Попробовал, а где собственно указывать что именно разворачивать? И кстати у вас Разрешенные теги выдвигаются с помощью jQuery?
  • Аватарка
    29 июня 2009 в 9:15 ]]>Grin]]>
    FaTeRy, например, чтобы при клике на ссылку с айди link развернуть блок с айди block, то код нужно написать вот так:
    $('#link').openCloseBlocks($('#block'));

    Да, с помощью джиквери.
  • Аватарка
    29 июня 2009 в 13:28 ]]>Татьяна]]>
    второй сниппет мне лучше других!
  • Аватарка
    29 июня 2009 в 13:35 Dench
    Хорошие сниппеты, вот только почему в 3-ем используется toggler.offset(), а не toggler.position()?
    Просто position() возвращает тот же объект, но у offset'а проблемы с результатами при фиксированной ширине на мониторах с большим расширением, т.е. не правильно пересчитывается отступ слева, сам на такое несколько раз натыкался, приходилось добавлять левую «пустую» колонку, пока position() не попробовал )

    А еще в предпросмотре неверно экранируется апостроф )
  • Аватарка
    29 июня 2009 в 13:39 ]]>Денис]]>
    мне понравилисьвсе сниппетЫ! создатели хорошо поработали!
  • Аватарка
    30 июня 2009 в 1:06 ]]>voland]]>
    Полезные сниппеты, но раз уж статейка для новичков можно б и расписать какие файлики подключать :-)
  • Аватарка
    1 июля 2009 в 20:24 ]]>Даниил]]>
    ДЛЯ МЕНЯ САМЫЙ ЛУЧШИЙ -ЭТО ТРЕТИЙ!
  • Аватарка
    15 июля 2009 в 6:36 ]]>Денис Носов]]>
    Спасибо за сниппеты!!!

    У меня есть встречный вопрос относительно сниппета «Клик по объекту показывает блок прямо под ней поверх контента»:

    Подскажите пожалуйста, как сделать, чтобы при клике на сам блок он не исчезал, а исчезал при клике на кнопочку/текст (так сказать чтобы закрыть блок)?

    Этот сниппет было интересно попробовать реализовать для быстрой формы логина!

    Спасибо!
  • Аватарка
    17 июля 2009 в 12:27 Сергей
    Огромное спасибо Павел, с вашего разрешения я немного потюнинговал плагинчик для выделения чекбоксов. Добавил выделение всех и инвертирование при выделении.
    (function($) 
    {
    	// Выражаю огромную бладгодарность 
    	$.fn.CheckboxesShift = function(options)
    	{
    		// формирование опций
    		var opts = $.extend({}, $.fn.CheckboxesShift.defaults, options);
    		var cbx = this,
    		last = -1, 	// номер предыдущего чекбокса;
    		start, 		// служебные
    		finish; 	// переменные
    		
    		// проходим по каждому указанному чекбоксу
    		cbx.each(function(index) {
    			// при клике по нему (или его лэйблу)
    			$(this).click(function(e) {
    				if (opts.firstElemCheckAll == true && index == 0) {
    					for(i = 1; i <= cbx.length - 1; i ++) {
    						// и делаем их выделенными
    						$(cbx[i]).attr('checked', $(e.target).attr('checked'));
    					}
    				}
    				else {
    					// теперь смотрим, больше ли у предыдущего индекс
    					if(index > last) { 	start 	= last; 	finish 	= index;
    					} else { 			start 	= index; 	finish 	= last; }
    				
    					// если был предыдущий и зажата клавиша Шифт
    					if(last > -1 && e.shiftKey) {	
    						// если включено инвертирование - то игнорируем первый и последний элемент
    						if (opts.invert) {
    							start +=1;
    							finish -=1;
    						}
    						// проходим с начального до конечного чекбокса		
    						for(i = start; i <= finish; i ++) {
    							// и делаем инвертирование
    							if (opts.invert)
    								$(cbx[i]).attr('checked', !$(cbx[i]).attr('checked'));
    							// и делаем выделенным
    							else
    								$(cbx[i]).attr('checked', 'checked');
    						}
    					}
    					// запоминаем индекс только что кликнутого чекбокса
    					last = index;
    				}
    			});
    		});
    	};
    	
    	// опции по-умолчанию
    	$.fn.CheckboxesShift.defaults = 
    	{
    		firstElemCheckAll : false,
    		invert : false
    	};
    })(jQuery);
    // Пример использования
    $('#my-checkboxes').CheckboxesShift({
    	firstElemCheckAll: true,
    	invert: true
    });
     


    P.S. Извините за ч/б код, так и не понял как здесь можно разукрасить его :)
  • Аватарка
    18 октября 2009 в 0:56 ]]>saintist]]>
    Спасибо, именно то что искал, особенно про чекбоксы
  • Аватарка
    3 февраля в 11:09 Сашка
    Просто не могу нарадоваться. Мегаохуенно.
  • Аватарка
    7 февраля в 20:22 Киря
    Я только начинаю изучать все это можно исходник этих примеров?
  • Аватарка
    21 февраля в 19:53 Сергей
    Здравствуйте.
    Подскажите пожалуйста, как можно использовать последний сниппет больше чем на одном блоке на странице. (у меня 2 блока, первый появляется, ссылка на второй не реагирует)
  • Эл. почта (используется для Граватарки)
  • Домашняя страница
  • Имя в Твиттере
  • Разрешенные теги Текст сообщения (надо бы заполнить это поле)
  • как выглядит какой тег
    жирный текст <b>жирный текст</b>
    курсивный тект <i>курсивный тект</i>
    зачеркнутый текст <s>зачеркнутый текст</s>
    подчеркнутый текст <u>подчеркнутый текст</u>
    ссылка <a href="адрес">ссылка</a>
    function foo() { ... }
    <pre><code>function foo() { ... } </code></pre>