作为参考,这里有一篇关于使用 jQuery 创建自定义过滤器选择器的文章。
介绍:
对于那些不熟悉jQuery 的自定义过滤器选择器的人,这里有一个关于它们是什么的快速入门:
如果您需要一个可重用的,您可以通过将您自己的函数添加到对象filter
来扩展 jQuery 的选择器表达式。jQuery.expr[':']
该函数将在当前集合中的每个元素上运行,并且应该返回 true 或 false(很像filter
)。三位信息被传递给这个函数:
有问题的元素
该元素在整个集合中的索引
从正则表达式匹配返回的
match
数组,其中包含更复杂表达式的重要信息。
扩展jQuery.expr[':']
后,您可以将其用作 jQuery 选择器中的过滤器,就像您使用任何内置的过滤器(:first
、:last
等:eq()
)
这是一个示例,我们将过滤分配有多个类的元素:
jQuery.expr[':'].hasMultipleClasses = function(elem, index, match) {
return elem.className.split(' ').length > 1;
};
$('div:hasMultipleClasses');
这是小提琴:http: //jsfiddle.net/acTeJ/
在上面的示例中,我们没有使用match
传入函数的数组。让我们尝试一个更复杂的例子。在这里,我们将创建一个过滤器来匹配tabindex
大于指定数字的元素:
jQuery.expr[':'].tabindexAbove = function(elem, index, match) {
return +elem.getAttribute('tabindex') > match[3];
};
$('input:tabindexAbove(4)');
这是小提琴:http: //jsfiddle.net/YCsCm/
之所以可行,是因为该match
数组是从用于解析选择器的正则表达式返回的实际数组。因此,在我们的示例中,match
将是以下数组:
[":tabIndexAbove(4)", "tabIndexAbove", "", "4"]
如您所见,我们可以使用match[3]
.
问题:
在 jQuery 1.8 中,不再将match
数组传递给 filter 函数。由于我们无法访问传入的信息,因此tabindexAbove
过滤器不再起作用(这个小提琴和上面那个小提琴之间的唯一区别是它使用了更高版本的 jQuery)。
所以,这里有几点我想澄清:
这是预期的行为吗?它在任何地方都有记录吗?
这是否与
Sizzle
已更新的事实有关(尽管它明确指出“在此重写中未更改 Sizzle 的旧 API”。也许这就是他们所说的“删除现在不必要的Sizzle.filter
”) ?现在我们无法访问
match
数组,还有其他方法可以获取传递给过滤器的信息(在我们的例子中,4
)?
我从未在 jQuery Docs 中找到任何关于自定义过滤器选择器的文档,所以我不知道从哪里开始寻找有关此的信息。