Dojo 的核心功能接口 - dojo/query

  这个 dojo/query 模块相信读者们也是非常熟悉了,它主要是基于 CSS 的 Selector 来定位并返回相应节点。其实它使用起来非常简单,本小节我们会重点它的一些不太为人知的特殊功能。

  先来看一个基本使用方式的示例:

1  require(["dojo/query", "dojo/dom"], function(query, dom){
2   var nl = query(".someClass", "someId");
3   // 或者
4   var node = dom.byId("someId");
5       nl = query(".someClass", node);
6  });

  其主要参数其实很简单,第一个是 Selector 的内容,第二个是根节点的 ID 或者节点对象。这里我们就是查找节点 ID 为“someId”的节点的所有子节点中,包含 someClass 的 Class 属性的所有节点。dojo/query 返回值(这里是 nl)其实是一个 dojo/NodeList 对象,不是我们通常认为的数组对象。当然,它支持数组对象支持的下标运算符“[]”,但是它还包括很多额外的方法, 如:concat,forEach,map,on,lastIndexOf 等等。所以要注意,我们不能简单的把它当成数组对象来对待。

  同 样,还有 dojo/NodeList-data,dojo/NodeList-dom,dojo/NodeList-fx,dojo/NodeList- html,dojo/NodeList-traverse 等等对象,它们扩展了 dojo/NodeList,实现了一些新的功能,如 dojo/NodeList-dom 在 dojo/NodeList 基础上扩展了一些 DOM 操作的接口,让我们可以很方便的批量执行一些 DOM 操作。dojo/NodeList-fx 扩展了一些动画接口,可以批量执行动画。这些接口相信很多读者之前就已经接触过了,这里不再深入,在希望未接触过的读者能注意一下,这些模块对于我们使用 dojo/query 非常有帮助。

  再来看一些稍微复杂一点的示例:

1  dojo.query(‘#t span.foo:not(span:first-child)‘),
2  dojo.query(‘#t span.foo:not(:first-child)‘)
3
4  dojo.query(‘#t h3:nth-child(odd)‘),
5  dojo.query(‘#t h3:nth-child(2n+1)‘)
6
7  dojo.query(‘#t2 > input[type=checkbox]:checked‘)

  前两个例子会返回 ID 为“t”的节点下面,所有的不是其上层节点的第一个子节点的,并且 Class 属性为“foo”或者包含“foo”的所有 span 节点。

  后两个例子会返回 ID 为“t”的节点下面,所有为其上层节点的奇数子节点的 h3节点。

  最后一个例子会返回 ID 为“t2”的节点下面,所有被选中的 checkbox 节点。

  dojo/query 支持所有的 CSS3 的 Selector,感兴趣的读者可以参考一下 W3C 的关于 CSS3 的标准的定义,其中定义的所有 Selector 均可以用在 dojo/query 中。

  既然我们是基于 CSS 的 Selector 来定位并返回节点的,那我们到底是基于哪个版本的 CSS 的 Selector 算法呢?事实上,dojo/query 支持四种 Selector 模式:CSS2,CSS2.1,CSS3,ACME。相比前三个大家都很熟悉了,第四个 ACME 其实是 CSS3 的进阶,除了支持所有 CSS3 的 Selector 外,它还支持一些 Selector 引擎不支持的的检索规则。默认情况下,如果设定 async 为 false,dojo/query 会使用 ACME 模式,如果 async 为 true,则使用 CSS3。

  我们可以通过 dojoConfig 来定义我们所使用的 Selector 模式,也可以在引用 dojo/query 模块的时候指定:

 1  <script data-dojo-config="selectorEngine: ‘css2.1‘, async: true"
 2  src="dojo/dojo.js">
 3  </script>
 4
 5  <script type="text/javascript">
 6   var dojoConfig = {
 7     selectorEngine: "css2.1",
 8     async: true
 9   };
10  </script>
11  <script src="dojo/dojo.js">
12
13  define(["dojo/query!css3"], function(query){
14     query(".someClass:last-child").style("color", "red");
15  });

  上述示例中列举了三种方式定义 Selector 模式,读者们可以根据需要自行选择。

  其实 Dojo 还包含其它的 Selector 模式,可以从如下网址下载:

    sizzle: https://github.com/kriszyp/sizzle

    slick: https://github.com/kriszyp/slick

  安装好后,通过之前介绍的方式定义即可:

1  <script data-dojo-config="selectorEngine: ‘sizzle/sizzle‘" src="dojo/dojo.js">
2  </script>
3
4  define(["dojo/query!slick/Source/slick"], function(query){
5   query(".someClass:custom-pseudo").style("color", "red");
6  });

  由此可见,关于 Selector 的模式的定义是非常灵活的,可扩展性非常强。

原文地址:http://www.ibm.com/developerworks/cn/web/1303_zhouxiang_dojocore/#major3

时间: 2024-07-29 09:40:43

Dojo 的核心功能接口 - dojo/query的相关文章

Chrome扩展开发之四——核心功能的实现思路

目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制和通信方式 3.Chrome扩展开发之三——Chrome扩展中的数据本地存储和下载 4.Chrome扩展开发之四——核心功能的实现思路 如果你对GmailAssist感兴趣,可以在chrome商店中搜索“Gmail助手”,或点击这里直接访问商店来安装试用:如果你对GmailAssist的源码感兴趣,

Vega Prime核心功能模块介绍

Vega Prime具有典型面向对象特点,其核心功能模块都是以类的形式定义的,并存在一定的继承关系,对基本功能进行扩充. vp***表示vp模块中的函数和类,这一层完全可以由Lynx Prime来操作完成: vs***表示vsg模块中的函数和类,是vp的关键核心: vr***表示render层,是硬件接口层,可以理解为对OpenGL或DirectX的封装层: vu***表示一些内存管理.辅助.数学.工具类,对vega prime的其它功能进行了完善. 1.内核vpKernel vpKernel继

核心开发接口介绍

核心开发接口介绍1.hibernate_0500_CoreAPI2.HiberanteAPI 文档需要单独下载 在线api链接:http://docs.jboss.org/hibernate/core/3.3/api3.Configuration a) AnnotationConfiguration b) 进行配置信息的管理 c) 用来产生 SessionFactory d) 可以在 configure方法中指定hibernate配置文件 e) 只需关注一个方法即:buildSessionFac

一对一直播系统app开发核心功能点简析

关于一对一直播系统,之前我们聊过太多的内容了.一对一直播系统的功能,搭建部署用到的内容以及它与传统直播平台的区别.我们先简单回顾下一对一直播系统不同于传统直播平台的地方:1.通过连麦功能建立私聊机制2.一对一视频直播预约功能不论对于一对一直播系统还是传统直播平台,直播间部分的功能何消息内容推送socket部分应用基本一致.直播间部分的开发(部分):一对一直播系统直播间部分的开发比较特殊的地方在于进入直播间之前的付费私聊机制和主播详情页的设置.a)付费私聊:我们常见的付费私聊方式有指定收费金额(先

自己实现spring核心功能 三

前言 前两篇已经基本实现了spring的核心功能,下面讲到的参数绑定是属于springMvc的范畴了.本篇主要将请求到servlet后怎么去做映射和处理.首先来看一看dispatherServlet的基本流程,这我在以前的博客里面也讲过,传送门 这里先给个我们的简易处理流程 准备工作 为了能将请求传递,我们需要写一个控制器类来接收请求,写两个接口来处理请求 HomeController类 1 @JCController 2 @JCRequestMapping("/home") 3 pu

Spring 核心功能演示

Spring 核心功能演示 Spring Framework 简称 Spring,是 Java 开发中最常用的框架,地位仅次于 Java API,就连近几年比较流行的微服务框架 SpringBoot,也是基于 Spring 实现的,SpringBoot 的诞生是为了让开发者更方便地使用 Spring,因此 Spring 在 Java 体系中的地位可谓首屈一指. 当然,如果想要把 Spring 所有功能都讲的一清二楚,远远不是一两篇文章能够做到的,但幸运的是,Spring 的基础资料可以很轻易的搜

软件包管理器的核心功能(笔记)

程序:指令+数据    指令:芯片        CPU: 普通指令,特权指令        指令集        C语言:    Powerpc: 二进制格式 x86: x86: 汇编powerpc: 汇编 高级语言:C: 软件包管理器的核心功能:1.制作软件包:2.安装.卸载.升级.查询.校验: Redhat, SUSE, Debian Redhat, SUSE: RPM    Redhat Package Manager    PRM is Package ManagerDebian: d

基于Android MPAndroidChart实现腾讯QQ群数据统计报表核心功能

 基于Android MPAndroidChart实现腾讯QQ群数据统计报表核心功能 腾讯QQ移动客户端(新版)的QQ群有一项功能比较有趣,是关于QQ群的.QQ群新增一项功能开放给具有管理权限的群成员:管理群 -> 群数据 中,会看到QQ群的一些基础数据统计报表,如人数.发言条数的统计报表,如图: 我之前写了一篇文章是关于Android平台上的一个统计报表的开源框架MPAndroidChart,文章介绍了如何在自己的项目中使用MPAndroidChart制作统计报表,同时给出了基本折线图的一

微信核心功能全解析

最近做了一套及时通讯软件,其中很多功能和微信是相仿的,下面详细介绍一下具体实现. 做及时通讯肯定要用xmpp协议,微信和一些及时通讯软件也是用的这套协议,只是纵向开发深度不同. 1.复写语音按钮 @SuppressLint("NewApi") public class RecordButton extends Button  { public RecordButton(Context context) { super(context); init(); } public RecordB