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).