Sizzle
Когда я рассказывал о Sizzle, то решил вас не грузить возможностями по расширению библиотеки, и вот время настало… В Sizzle можно расширять много чего:
Sizzle.selectors.matchSizzle.selectors.findSizzle.selectors.filterSizzle.selectors.attrHandleSizzle.selectors.pseudos
Но браться мы будем лишь за расширение псевдо-селекторов, наподобие:
$("div:animated"); // поиск анимированных элементов
$("div:hidden"); // поиск скрытых элементов div
$("div:visible"); // поиск видимых элементов divПочему я привел только эти фильтры? Всё просто — только они не входят в Sizzle и относятся лишь к jQuery, именно такие плагины мы будем тренироваться разрабатывать. Начнем с кода фильтра :visible:
// пример для расширения Sizzle внутри jQuery
// для расширения самого Sizzle нужен чуть-чуть другой код
jQuery.expr.pseudos.visible = function( elem ) {
// проверяем ширину и высоту каждого элемента в выборке
return !!( elem.offsetWidth || elem.offsetHeight);
};Выглядит данный код несложно, но, пожалуй, я-таки дам каркас для нового фильтра и добавлю чуть-чуть пояснений:
$.extend($.expr.pseudos, {
/**
* @param element DOM-элемент
* @param i порядковый номер элемента
* @param match объект матчинга регулярного выражения
* @param elements массив всех найденных DOM-элементов
*/
test: function(element, i, match, elements) {
/* тут будет наш код, и он будет решать, кто виноват */
return true || false; // выносим вердикт
}
})Ну, теперь попробуем решить следующую задачку:
— Необходимо выделить ссылку в тексте в зависимости от её типа: внешняя, внутренняя или якорь на странице.
Для решения лучше всего подошли бы фильтры для селекторов следующего вида:
Поскольку «из коробки» данный функционал не доступен, мы напишем его сами. Для этого нам понадобится не так уж и много (пример лишь для последнего :external, рабочий код на странице sizzle.filter.html):
ВСЕГДА используйте фильтр вместе с HTML-тегом, который ищете:
Sizzle Documentation — скудненькая официальная документация
Last updated