快速提问 - 是否可以通过遍历来扩展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
数组作为结果集返回。
答案 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。