作为参考,这里有一篇文章使用 jQuery 创建自定义过滤器选择器 http://answers.oreilly.com/topic/1055-creating-a-custom-filter-selector-with-jquery/.
介绍:
对于那些不熟悉的人jQuery 的自定义过滤器选择器,这里是它们的简要介绍:
如果您需要可重复使用的filter http://api.jquery.com/filter/,你可以通过添加你自己的函数来扩展 jQuery 的选择器表达式jQuery.expr[':']
object.
该函数将在当前集合中的每个元素上运行,并应返回 true 或 false(很像filter http://api.jquery.com/filter/)。三位信息传递给该函数:
有问题的元素
该元素在整个集合中的索引
A match
从正则表达式匹配返回的数组,其中包含更复杂表达式的重要信息。
一旦你延长了jQuery.expr[':']
,您可以将它用作 jQuery 选择器中的过滤器,就像使用任何内置过滤器一样(:first
, :last
, :eq()
etc.)
下面是一个示例,我们将过滤分配有多个类的元素:
jQuery.expr[':'].hasMultipleClasses = function(elem, index, match) {
return elem.className.split(' ').length > 1;
};
$('div:hasMultipleClasses');
这是小提琴:http://jsfiddle.net/acTeJ/ 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/ http://jsfiddle.net/YCsCm/
这样做的原因是因为match
array 是从用于解析选择器的正则表达式返回的实际数组。所以在我们的例子中,match将是以下数组 http://jsfiddle.net/YCsCm/1/:
[":tabIndexAbove(4)", "tabIndexAbove", "", "4"]
正如你所看到的,我们可以通过使用来获取括号内的值match[3]
.
问题:
在 jQuery 1.8 中,the match数组不再被传递给过滤函数 http://jsfiddle.net/YCsCm/2/。由于我们无法访问传入的信息,the tabindexAbove过滤器不再起作用 http://jsfiddle.net/YCsCm/3/(这个小提琴和上面那个小提琴之间的唯一区别是它使用了更高版本的 jQuery)。
因此,我想澄清以下几点:
这是预期的行为吗?它在任何地方都有记录吗?
这与以下事实有什么关系吗Sizzle已经升级 http://blog.jquery.com/2012/07/04/the-new-sizzle/(尽管它明确指出“Sizzle 的旧 API 在这次重写中没有改变”。也许这就是他们所说的“删除现在不必要的Sizzle.filter
")?
现在我们无法访问match
数组,是否有其他方法可以获取传递给过滤器的信息(在我们的例子中,4
)?
我从未在 jQuery 文档中找到任何有关自定义过滤器选择器的文档 https://www.google.com/search?q=site%3Adocs.jquery.com+custom+filter+selector,所以我不知道从哪里开始寻找这方面的信息。