Vlastní selektory v jQuery

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

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Tato stránka používá Akismet k omezení spamu. Podívejte se, jak vaše data z komentářů zpracováváme..