2.选择元素 - 自定义过滤器《jquery实战》

2.5.6 自定义过滤器
jQuery 中有两种方法创建自定义的过滤器。第一种比较简单,但是不鼓励,从 jQuery 1.8 开始已经被第二种方法取代。记住,使用新方法时,你自定义的过滤器在 jQuery 1.8 之前的版本不可用。
假设一个编程技术游戏。该游戏很多级别,可以区分不同的难度,用户可以获取分数,可以获取不同的编程技能。
<ul class="levels">
<li data-level="1" data-points="1" data-technologies="javascript node grunt">Level 1</li>
<li data-level="2" data-points="10" data-technologies="jquery requirejs">Level 2</li>
<li data-level="3" data-points="100" data-technologies="php composer">Level 3</li>
<li data-level="4" data-points="1000" data-technologies="javascript jquery backbone">Level 4</li>
</ul>
假如经常要选择数据级别(data-level)大于2,获取的数据分数(data-points)大于100的游戏,且包含 jQuery 技术的(data-technologies)。但是如何使用选择器进行打两的对比呢?事实上,不可以。为了完成这个任务,必须初始化集合,然后获取需要的元素:
//li[data-technologies~="jquery"] 相当于 li[data-technologies*="jquery"]
var $levels = $('.levels li[data-technologies~="jquery"]');
var mathchedLevels = [];
for (var i = 0; i < $levels.length; i++) {
if ($levels[i].getAttribute('data-level') > 2 &&
$levels[i].getAttribute('data-points') > 100)
mathchedLevels.push($levels[i]);
};
创建自定义过滤器可以不用每次重复:
$.expr[':'].requiredLevel = $.expr.createPseudo(function(filterParam) {
return function(element, context, isXml) {
return element.getAttribute('data-level') > 2 &&
element.getAttribute('data-points') > 100;
};
});
过滤器只是一个添加了属性:的函数,它属于jQuery的 expr 属性。它是一个称为“冒号(colon)”的属性。:属性是一个包含jQuery原声过滤器的属性,可以使用它添加自己的代码。
你可以调用自定义过滤器requiredLevel,而不是直接传递这个函数。
$('.levels li:requiredLevel')
也可以使用称为 createPseudo 的jQuery工具(它属于底层的Sizzle选择器引擎)。
对于 createPseudo() 函数,可以传递匿名方法,声明一个参数叫 filterParam。filter Param标识过滤器参数,这个参数也可以另外起名字。它是一个可选参数,与 :eq() 和 nth-child() 类似。在匿名函数内部,可以创建另外一个匿名函数,用来执行特定的过滤器工作。在函数内,jQuery 传递要处理的元素(element参数),从这些 Dom Element 或 Dom Document 对象(上下文参数)里进行查询。Boolean 类型的参数勇于指定是不是处理 XML文档(isXML参数)。在最内层的函数里,可以编写代码来测试元素是否被保留。

前面一个例子引入了参数filterParam,可以向自定义过滤器传递参数。因为需求是固定的,所以没有使用它。现在来看看使用它帮助我们完成工作。
假设要根据提供的分数来查找特定的级别,比如“选择分数大于X的所有级别”。这是一个要使用参数传递给自定义伪选择器的好机会,基于现在的需求。
$.expr[':'].pointsHigherThan = $.expr.createPseudo(function (filterParam) {
var points = parseInt(filterParam, 10);//缓存的参数,可以在函数闭包内访问
return function (element, context, isXml) {
return element.getAttribute('data-points') > points;
};
});
这里使用的是 createPseudo() 函数,但调用的是 pointsHigherThan 过滤器、在声明第二个函数前,需要在变量 points 中保存参数。所以,它可以在闭包里访问。此时,可以通过存储的变量来使用给定的参数。

看看允许你获取50分以上的级别。
var $higherPointsLevels = $('.levels li:pointsHigherThan(50)');
2.选择元素 - 自定义过滤器《jquery实战》的更多相关文章
- jQuery 实战读书笔记之第二章:选择元素
基本选择器 html 代码如下,后面的 js 使用的 html 基本大同小异. <!doctype html> <html> <head> <title> ...
- Jquery 系列(2) 选择元素
Jquery基础学习 jQuery利用css选择符的能力,能够在DOM中快捷而轻松地获取元素. 主要内容如下: 介绍DOM树 如何通过CSS选择符在页中查找元素 扩展jQuery标准的CSS选择符 选 ...
- JQuery基础教程:选择元素(中)
自定义选择符 JQuery在各种CSS选择符的基础上还添加了独有的完全不同的自定义选择符,注意,只要可能,jQuery就会使用浏览器原生的DOM选择符引擎去查找元素.但在使用自定义选择符的时候,就无法 ...
- 初识jQuery,八字真言“选择元素,对其操作”
jQuery在我印象中,就是很多类似$(),然后昨天开始接触了,觉得很和谐,获取元素比JavaScript简单很多,有意思. 一.开始学习jQuery,下载jQuery库的文件 http://jque ...
- jQuery——选择元素
###理解DOM jQuery最强大的特性之一就是能够简化在DOM中选择元素的任务.**DOM(文档对象模型)**充当了JavaScript与网页之间的接口,它以对象网络而非纯文本的形式来表现HTML ...
- 抛弃jQuery:DOM API之选择元素
原文链接:http://blog.garstasio.com/you-dont-need-jquery/selectors/ 我的Blog:http://cabbit.me/you-dont-need ...
- JQuery基础教程:选择元素(上)
jQuery最强大的特性之一就是它能够简化在DOM中选择元素的任务,DOM中的对象网络与家谱有几分类似,当我们提到网络中元素之间的关系时,会使用类似描述家庭关系的术语,比如父元素.子元素,等等.通过一 ...
- jQuery选择器对应的DOM API ——选择元素
英文原文:http://blog.garstasio.com/you-dont-need-jquery/selectors/愚人码头注: 原作者的写这文章的意图是让我们抛弃jQuery,You Don ...
- JQuery官方学习资料(译):选择元素
选择元素 JQuery最基本的概念是“选择一些元素并让它们做些什么”.JQuery支持大部分的CSS3的选择器,以及一些非标准的选择器. 通过ID选择元素 $( "#myId&quo ...
随机推荐
- Spring之c3p0连接池xml配置和使用举例
1.导入jar包 c3p0-0.9.5.2.jar mchange-commons-java-0.2.11.jar 2.源码: beans.xml <beans xmlns="http ...
- P4932 浏览器
题目背景 __stdcall在用Edge玩slay的时候,鼠标会经常失灵,这让她十分痛苦,因此她决定也要让你们感受一下Edge制造的痛苦. 题目描述 __stdcall给了你n个点,第i个点有权值x[ ...
- LCT动态树入门
LCT,link-cut-tree,一种基于splay的高级数据结构,常用于维护动态森林问题,但ta只能维护子树信息,无法修改子树信息. 首先,如果你不会splay,来这里看看吧. 接下来步入正题. ...
- 洛谷P3950 部落冲突(LCT)
洛谷题目传送门 最无脑LCT题解,Dalao们的各种算法都比这个好多啦... 唯一的好处就是只管码代码就好了 开战cut,停战link,询问findroot判连通性 太无脑,应该不用打注释了.常数大就 ...
- 【题解】 bzoj1875: [SDOI2009]HH去散步 (动态规划+矩阵乘法)
bzoj1875,懒得复制,戳我戳我 Solution: 看到这道题,看的出是个dp,每个点\(t\)时刻到达的方案数等于\(t-1\)到连过来的点方案数之和 但又因为题目有要求不能走一样的边回去不是 ...
- 如何用React, Webcam和JS Barcode SDK创建Web扫码App
这篇文章分享下如何结合React Webcam和Dynamsoft JavaScript Barcode SDK来创建Web扫码App. Web实时扫码 从GitHub上下载react-webcam. ...
- hadoop2相对hadoop1有非常重大的改进
hadoop2相对hadoop1有非常重大的改进. 下面看一下在HDFS和MapReduce方面的改进: HDFS Federation(HDFS联邦)federation-background[1] ...
- 【BZOJ1967】[AHOI2005]穿越磁场(最短路)
[BZOJ1967][AHOI2005]穿越磁场(最短路) 题面 BZOJ 洛谷 题解 一个显然的思路是这样的,我们的正方形的边长把整个平面割成了若干块,显然每个联通块都可以看着做一个点,那么接下来只 ...
- RBAC: 基于角色的访问控制(Role-Based Access Control)
本文只讨论两种基于角色的访问控制的不同点,不涉及权限设计的数据库设计. 基于角色的访问控制(Role-Based Access Control)可分为隐式角色访问控制和显式角色访问控制. 隐式角色访问 ...
- 菜单栏--Dom选择器
制作一个左侧菜单栏,包含菜单目录和内容 点击菜单栏才会展示内容,否则隐藏内容 二.事例 2.1 菜单栏基本样式 <body> <div style="height: 48p ...