Už jsme si ukázali, jak jsou jQuery selektory pomalé. A pomalé jsou hlavně proto, že jsou hodně mocné a dokáží najít cokoliv.
A pokud nedokáží najít to, co zrovna potřebujete, můžete si dokonce napsat vlastní přesně pro svoje potřeby.
Selektory v jQuery jsou totiž prováděny funkcemi a když jQuery v selektoru najde například „:visible„, ví, že má zavolat metodu $.expr[‚:‘].visible().
A díky této znalosti si můžete dopsat vlastní selektory, které pak začnou automaticky fungovat:
$.expr[':'].noValue = function(el) {
return ($(el).is('input')
&& $(el).val() === '');
}
$('form :noValue').addClass('invalid');
Selektoru můžete předat i vlastní parametry:
$.expr[':'].smaller = function(el, i, param) {
return ($(el).is('input')
&& (parseInt($(el).val(), 10)
< parseInt(param[3], 10)));
}
if ($('#age').is(':smaller(18)')) {
document.location = '/deny-access.html';
}
Třetí parametr (param) obsahuje vše, co zapíšete do závorky (v podobě řetězce), takže je jen na vás, jak parametr použijete:
$.expr[':'].range = function(el, i, param) {
var
range = param[3].split('-'),
value = parseInt($(el).val(), 10);
return (value >= range[0]
&& value <= range[1]);
}
if ($('#age').is(':range(12-18)')) {
document.location = '/tenagers.html';
}
Ve výše uvedených kódech je vidět, že se param používá jako param[3], což je způsobeno (alespoň podle mě) chybou, kdy jQuery předává celý výsledek regulárního výrazu, který parametry parsuje, místo toho, aby předalo pouze obsah v závorce. Můžeme pouze doufat, že v některé z dalších verzí se to (v lepším případě) nepokusí opravit (pak by param[3] vracel třetí znak v závorce) a nebo (v horším případě) že parsování nezmění a hledaný výraz se neposune na jiný index (pak by param[3] vracel něco úplně jiného).