【发布时间】:2012-07-22 09:16:07
【问题描述】:
供参考,这里有一篇关于Creating a Custom Filter Selector with jQuery的文章。
简介:
对于那些不熟悉 jQuery 的自定义过滤器选择器的人,这里有一个关于它们是什么的快速入门:
如果您需要可重用的filter,您可以通过将自己的函数添加到jQuery.expr[':'] 对象来扩展jQuery 的选择器表达式。
该函数将在当前集合中的每个元素上运行,并且应该返回 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 would be the following array:
[":tabIndexAbove(4)", "tabIndexAbove", "", "4"]
如您所见,我们可以使用 match[3] 获取括号内的值。
问题:
在 jQuery 1.8 中,the match array is no longer being passed in to the filter function。由于我们无法访问传入的信息,the tabindexAbove filter does not work anymore(这个小提琴和上面那个的唯一区别是它使用了更高版本的 jQuery)。
所以,我想澄清几点:
这是预期的行为吗?它是否记录在任何地方?
这是否与
Sizzlehas been updated 的事实有关(尽管它明确指出“在此重写中未更改 Sizzle 的旧 API”。也许这就是他们所说的“删除现在不必要的Sizzle.filter")?-
既然我们无法访问
match数组,还有其他方法可以获取传递给过滤器的信息(在我们的例子中是4)吗?
I never found any documentation in the jQuery Docs about the custom filter selectors,所以我不知道从哪里开始寻找这方面的信息。
【问题讨论】:
标签: javascript jquery jquery-selectors