当前位置:嗨网首页>书籍在线阅读

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){
     //返回真或假
   }
});