jQuery自身提供了许多选择器,除此之外其还允许我们自定义选择器。下面这种自定义选择器的方法仅适用于1.8及其以后的版本。考虑有如下html片段:
1 | <ul class="levels"> |
假如我们需要选择出data-level属性值大于2,data-points大于100并且data-technologies属性包含”jquery”的li,传统的做法是:
1 | //先筛选出data-technologies属性包含"jquery"的li |
如果需要多次使用,我们可以创建自定义选择器,让代码更优雅:
1 | $.expr[':'].requiredLevel = $.expr.createPseudo(function (filterParam) { |
createPseudo
方法用于创造自定义选择器,可向其传递参数filterParam,参数名可以另起其名,这里需求固定,所以不必传参。element表示当前处理的元素,isXML用于指定是否为XML文本,默认为false。context默认为整个document,可以指定范围来增强性能:
比如查找div内的p元素:
1 | $("div p") 或 |
结果一致,第二种写法效率更高。
言归正传,使用上述定义的选择器来查询满足条件的li:
1 | var $requiredLevels = $('li:requiredLevel','.levels '); |
传递参数
假如将需求改为,查找出data-points大于某个整数值的li,要怎么做呢?这时候就可以用上filterParam了:
1 | $.expr[':'].pointsHigherThan = $.expr.createPseudo(function (filterParam) { |
测试:
1 | var $higherPointsLevels = $('li:pointsHigherThan(50)','.levels '); |
《jQuery实战 第三版》读书笔记