自定义jQuery选择器

时间:2011-01-03 18:54:30

标签: javascript jquery

快速提问 - 是否可以通过遍历来扩展jQuery选择器以更改结果集(例如),而不仅仅是通过过滤现有的集合?

澄清 - 我不希望选择器等同于$.filter()的调用 - 我希望更接近$('foo:nth-child(n)')$('foo:eq(n)'),我可以准确指定返回哪些元素由选择器。任何想法都将不胜感激。

编辑:这是我想要实现的一个例子:

$.expr[':']['nth-parent'] = function(deTarget, iIndex, aProperties, aStack) {
    var iN, $currentElement;

    if(!deTarget)
        return;
    if(!aProperties || aProperties.length < 4 || isNaN(iN = parseInt(aProperties[3])) || iN < 0)
        throw('jQuery.nth-parent(N) requires a non-negative integer argument');

    $currentElement = $(deTarget);
    while(--iN >= 0)
        $currentElement = $currentElement.parent();

    aStack = $currentElement.length ? [$currentElement.get(0)] : [];
    return aStack.length ? true : false;
};

所以,最终,在这种特殊情况下,我希望将新的aStack数组作为结果集返回。

4 个答案:

答案 0 :(得分:1)

此链接可以帮助您满足您的需求: http://jquery-howto.blogspot.com/2009/06/custom-jquery-selectors.html

但回答你的问题是可以创建自定义选择器。

答案 1 :(得分:1)

我认为你的意思是你想要一个带参数的自定义选择器:

$.expr[':'].heightAbove = function(obj, idx, meta, stack) {
    return ($(this).height() > parseInt(meta, 10));
};

然后您可以将其称为

$('div:heightAbove(40)');

选择高度超过40像素的div。

答案 2 :(得分:1)

是的,你可以这样做,这里的正确例子就是你在问题中所追求的,这里是:eq()的实施方式:

jQuery[":"].eq = function(elem, i, match) {
   return match[3] - 0 === i;
};

签名还有一个参数stack,如下所示:

function(elem, index, match, stack)

stack所有元素的集合,如果您需要在过滤中使用它。

答案 3 :(得分:0)

是的,你可以extend the selectors

至于例子:let me help you