49-讨论
2.12.3 讨论
前面已经提到过,过滤器函数的第三个参数是一个从jQuery在选择器字符串上进行的正则表达式匹配返回的数组。如果你打算创建接受参数的过滤器表达式,这个匹配就特别有用。假定我们打算创建一个查询jQuery保留数据的选择器:
jQuery('span').data('something', 123);
//我们希望能够做到:
jQuery('*:data(something,123)');
这个选择器的目的是选择通过jQuery的 data() 方法附加了数据的所有元素——具体选择的是数据键值为 something ,数值为123的元素。
上面提出的过滤器( :data )可以这样创建:
jQuery.expr[':'].data = function(elem, index, m) {
//从匹配的元素中删除" :data(" and the trailing ")",因为这些部分不必要:
m[0] = m[0].replace(/:data\(|\)$/g, '');
var regex = new RegExp('([\'"]?)((?:\\\\\\1|.)+?)\\1(,|$)', 'g'),
//读取数据键值:
key = regex.exec( m[0] )[2],
//读取测试的数据值:
val = regex.exec( m[0] );
if (val) {
val = val[2];
}
//如果传递了一个值,对其进行测试;否则,测试键值是否为真:
return val ? jQuery(elem).data(key) == val : !!jQuery(elem).data(key);
};
使用如此复杂的正则表达式是因为我们希望使其尽量灵活。新的选择器能够以许多不同的方法使用:
//和我们最初的想法一样(同上):
jQuery('span:data("something",123)');
//检查"something"是不是"真"值:
jQuery('span:data(something)');
//带不带(内部的)引号:
jQuery('span:data(something, "something else")');
现在,我们有了一种查询jQuery在元素中保留数据的全新方法。
如果你想要同时添加超过一个新的选择器,最好使用jQuery的 extend() 方法:
jQuery.extend(jQuery.expr[':'], {
newFilter1 : function(elem, index, match){
//返回真或假
},
newFilter2 : function(elem, index, match){
// 返回真或假
},
newFilter3 : function(elem, index, match){
//返回真或假
}
});