使用 dojo/query

在本篇文章中,我们将了解DOM的查询以及如何运用dojo/query这个模块来轻松地选择节点并操作他们。

入门指南

在操作DOM的过程中,如何快速高效地检索出DOM节点显得相当重要。我们在Dojo DOM Functions中已经熟悉了 dom.byId,然而,在应用程序里找出每一个感兴趣的节点的唯一ID是项繁琐且易错的工作。并且仅靠ID的方式来选择大量节点的效率可见是低下的。所以,这里介绍另一个解决方案:dojo/querydojo/query模块使用类似CSS查询方式(你常在样式表里使用的方式)来检索一列节点,模块也支持高级的CSS3选择器!

查询

为了举例说明一些最常用的查询,我们将用到下面的HTML,如果在你的网站里用到一列的链接,那么你可能会使用到下面的HTML

<ul id="list"><li class="odd"><div class="bold"><a class="odd">Odd</a></div></li><li class="even"><div class="italic"><a class="even">Even</a></div></li><li class="odd"><a class="odd">Odd</a></li><li class="even"><div class="bold"><a class="even">Even</a></div></li><li class="odd"><div class="italic"><a class="odd">Odd</a></div></li><li class="even"><a class="even">Even</a></li>
</ul><ul id="list2"><li class="odd">Odd</li>
</ul>

你第一件想做的事就是获取整个列表。我们从前面的知识知道,你可以使用 dom.byId,但这里你可以用 query,乍一看,这种方式的作用并不明显,但我们可以从下面的例子中学到更多:

// require the query and domReady modules
require(["dojo/query", "dojo/domReady!"], function(query) {// retrieve an array of nodes with the ID "list"var list = query("#list")[0];
})

通过在某个标识符前面加个 "#",我们告诉query去查找包含这个ID属性的节点集。这种匹配习惯和CSS相似。需要注意的是: query始终返回数组对象。在后面我们将进一步了解这种数组,但是我们知道,只有一个(也只能有一个)节点的ID为"list",我们将他从数组中取出。

根据ID获取节点是不错的一个方式,但使用 dom.byId的效率将更好。但query允许你通过css样式名来选择节点。例如我们想获取那些样式为"odd"的节点:

// retrieve an array of nodes with the class name "odd"
var odds = query(".odd");

通过在标识符前面加上 ".",我们告诉query去查找那些样式名包含标识符的节点。再次说明,这个样式表匹配相似。在上面的例子中,query将会返回一个包含4个li节点和3个a节点。

限定你的查询

你可能已经注意到上一个例子中的odds查找出的结果中包含了两个列表中的节点。如果我们只想获取第一个列表中的odds节点,我们有两种方式:

// retrieve an array of nodes with the class name "odd"
// from the first list using a selector
var odds1 = query("#list .odd");// retrieve an array of nodes with the class name "odd"
// from the first list using a DOM node
var odds2 = query(".odd", document.getElementById("list"));

不同的方式获取的两个数组中包含同样的结果:第一种是通过选择语法在所有DOM中限制结果输出,第二种是限制查询引擎在特定的DOM中查找结果。

当query执行时不带第二个参数,它将搜索整个DOM结构,便利html标签下的所有节点。当第二个参数制定为某个节点时,它将搜索范围限制在这个节点下。

如果你的DOM相对比较小,就像例子中的,省略第二个参数是可行的。但当页面中的DOM结构相当大是,最好加入第二个参数来限制查询范围。这样做比在整个文档中查找得更快。

剩下的例子中,我们将省略第二个参数,但在使用query的时候请注意--保持你的代码运行得更快和更好的用户体验。

高级查询

我们前面的查询结果中混合了li标签和a标签,但如果我们只关心a标签时怎么做呢?你可以将标签名和样式名合并起来:

var oddA = query("a.odd");

对比分割标识符(代表了等级关系),你可以将标识符和目标节点合并起来;这里包含样式名称,可以使用query查询

另一种选择器可以跨浏览器,但不是在所有样式里都支持,就是">",这中选择器只查询第一个选择器下的第二个选择器。举个例子:

// Retrieve an array of any a element that has an
// li as its ancestor.
var allA = query("li a");
// Retrieve an array of any a element that has an
// li as its direct parent.
var someA = query("li > a");

查看Demo

allA包含6个a标签而someA将只包含2个a标签,任何一个选择器都可以在">"的右边,包括CSS选择器。我们现在只涉及到了一些常用选择器,query完全支持CSS3并且兼容你自己可能会遇到的其他选择器

节点集合

我们之前提到过,query返回一个符合选择器的节点数组;这个数组就是 dojo/NodeList并且数组包含可以和节点交互的方法。上一个例子就用到了几个方法,现在让我们看看一些你很可能在你程序里用到的方法。为了辅助例子,我们需要以下的HTML:

<div id="list"><div class="odd">One</div><div class="even">Two</div><div class="odd">Three</div><div class="even">Four</div><div class="odd">Five</div><div class="even">Six</div>
</div>

dojo/NodeList拥有一些和Dojo array helper相似的方法。例如ForEach,它会为数组中的每个节点都运行一次函数。

// Wait for the DOM to be ready before working with it
require(["dojo/query", "dojo/dom-class", "dojo/domReady!"],function(query, domClass) {query(".odd").forEach(function(node, index, nodelist){// for each node in the array returned by query,// execute the following codedomClass.add(node, "red");});});

一个函数会传给forEach,通常叫做回调函数,数组中的每个元素都会调用这个函数,并且带入下面的参数:node代表当前节点,index代表节点的索引,NodeList则代表这个数组。对于大部分开发组来说,第三个参数可以忽略;但在某些数组不太容易获取的情况下(例如本例中),第三个参数则有助于获取数组中的其他元素。forEach方法也可以接收第二个参数来制定回调函数的执行域。

其他的一些NodeList的array helper方法为:map,filter,every和some。除了every和which返回的是布尔类型外其他的方法返回的都是NodeList。

还有一些扩展模块通过增加其他的方法到NodeLists来扩展NodeLists的能力。class和style帮助方法在 dojo/NodeList-domdojo/NodeList-dom提供了一些符合Dojo操作DOM的方法,所以之前的例子可以简化:

require(["dojo/query", "dojo/NodeList-dom", "dojo/domReady!"], function(query) {// Add "red" to the className of each node matching// the selector ".odd"query(".odd").addClass("red");// Add "blue" to the className of each node matching// the selector ".even"query(".even").addClass("blue");
});

事件

NodeList提供的另一个快捷方法是on,用来连接DOM的事件。尽管写一篇文章将讲到DOMN事件,我们这里了解一下使用NodeList的on方法。这里需要注意的是尽管这是一个方便的方法,但尽量不要在包含大量节点的节点数组中使用这种方法;一种叫 event delegation的技术可以在那种情况下使用,这种方法将在events tutorial中讲到。

<button class="hookUp demoBtn">Click Me!</button>
<button class="hookUp demoBtn">Click Me!</button>
<button class="hookUp demoBtn">Click Me!</button>
<button class="hookUp demoBtn">Click Me!</button>
<script>// Wait for the DOM to be ready before working with it
    require(["dojo/query", "dojo/domReady!"], function(query) {query(".hookUp").on("click", function(){alert("This button is hooked up!");});});
</script>

查看Deom

on方法为query返回的每个节点绑定事件。

总结

正如你所看到的,操作DOM的节点是相当的容易。使用query,我们可以既快速又方便地获取到那些我们想要操作的节点集。修改样式也同样也很容易。我们展示了一个绑定点击事件到节点的简单实例,在下一篇文章中,我们将深入理解Dojo的事件机制。

转载于:https://www.cnblogs.com/ruowind/p/3542530.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408104.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux内核】虚拟地址空间布局架构

虚拟地址空间布局架构(Linux内核学习) 1.Linux内核整体架构及子系统 内核对下管理硬件,对上通过运行时库对应用提供服务 用户空间 使用malloc()分配内存通过free()释放内存 内核空间 虚拟进程负责从进程的虚拟地址空间分配虚拟页,sys_brk来扩大或收缩堆,sys_mmap负责在内存映…

天凉了,大家多穿衣服

这两天天气转凉&#xff0c;我还穿夏天的衬衫&#xff0c;结果今晚回来发现喉咙不舒服&#xff0c;只好去买药了。大家要保重身体呀&#xff01;

[开源]C#中开源软件大汇总(外国的)

一、博客类项目 1.SubText 项目介绍&#xff1a;Subtext 是一个个人博客发布平台&#xff0c;详细的介绍请进SubText 项目分类&#xff1a;博客 项目license:BSD License 项目主页&#xff1a;http://subtextproject.com/ 2.BlogEngine.net 项目介绍&#xff1a;详细的介绍请进…

【Linux内核】内存映射原理

【Linux内核】内存映射原理 物理地址空间 物理地址是处理器在总线上能看到的地址,使用RISC(Reduced Instruction Set Computing精简指令集)的处理器通常只实现一个物理地址空间,外围设备和物理内存使用统一的物理空间, 有些架构的处理器把分配给外围设备的物理地址称为设备内存…

react学习(59)--this.props语法糖

{...this.props}是props所提供的语法糖&#xff0c;可以将父组件的所有属性复制给子组件

我的名字

李桃春风有名流龙翔长空耀九州昌隆盛世舞文墨无拘无束无忧&#xff08;小弟自吹自擂&#xff0c;虚荣一番&#xff09;转载于:https://blog.51cto.com/73945/7773

div 居中嵌套

将一个 DIV 嵌套进另一个 DIV 容器&#xff0c;并保持水平居中、垂直居中&#xff0c;可使用以下代码&#xff1a; <html> <head><title>div居中嵌套</title><style type"text/css">.big{width: 800px;height: 500px;background: #333…

javascript学习系列(1):数组中的map方法

最好的种树是十年前,其次是现在。歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主 放弃很容易但是坚持一定很酷 我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的鼓励 1前言 在我们的日常开发中 不免会有很多需要处理数据的方法 本节主要说一说m…

spoolsv.exe占cpu 99%的解决方法(转)

前几天&#xff0c;太太的笔记本遇到了spoolsv.exe占cpu 99%的的问题&#xff0c;要我帮她重新安装操作系统。我是懒得重装的&#xff0c;所以在网上搜索了一下&#xff1a;大部分关于这个问题的文章都是将相关打印后台服务给禁用解决的&#xff0c;可是这样就不能打印了&#…

【Linux内核】物理内存组织结构

【Linux内核】物理内存组织结构 系统调用mmap 物理内存组织结构 体系结构 目前多处理器系统有两种体系结构&#xff1a; 1&#xff09;非一致内存访问&#xff08;Non-Unit Memory Access&#xff0c;NUMA&#xff09;&#xff1a;指内存被划分成多个 内存节点的多处理器系…

thinkphp __PUBLIC__的定义 __ROOT__等常量的定义

__TMPL__ > APP_TMPL_PATH, // 项目模板目录__ROOT__ > __ROOT__, // 当前网站地址__APP__ > __APP__, // 当前项目地址__GROUP__ > defined(GROUP_NAME)?__GROUP__:__APP__,__ACTION__ > __ACTION__, // 当前操…

面试准备勿重“难”轻“易”

眼下&#xff0c;有些大中专毕业生在做应聘面试准备时&#xff0c;往往把事情想得太复杂&#xff0c;把用人单位考官提出的问题想得过于难&#xff0c;于是在做面试准备时重“难”轻“易”&#xff0c;把精力都放在了高难度问题上&#xff0c;而忽视了基础性的理论和技术知识。…

react学习(60)--ant design中getFieldDecorator

<From><FormItem>//JS代码书写时需要用 { } 包裹起来&#xff0c;不能直接写在代码块中 {getFieldDecorator(userName,{initialValue:Jack,rules:[{required:true,message:用户名不能为空},{min:5,max:10,message:长度不在范围内},{pattern:new RegExp(^\\w$,g),m…

Binder 和parcel 讲解

http://blog.csdn.net/asd1031/article/details/16880071 http://www.cnblogs.com/plokmju/p/android_Service_aidl_CustomType.html //传递复杂对象&#xff0c;里面有详细的sample 说明转载于:https://www.cnblogs.com/wudizbb/p/3557896.html

C#面试题——附答案

下午随便在几个网站上转了转&#xff0c;发现了些C#的面试题&#xff0c;以csdn的一篇帖子收集最全&#xff0c;但是&#xff0c;没有答案&#xff0c;就自己做了一下&#xff0c;发上来&#xff0c;后续一些关于概念机制的题目&#xff0c;我继续做&#xff0c;先发点程序的&a…

类模板(参考《C++ Templates 英文版第二版》)

类模板(参考《C Templates 英文版第二版》) Chapter 1 类模板 与函数相似,类也可以被一个或者多个类型参数化 在这章,我们使用栈作为例子 2.1 类模板stack的实现 #include <vector> #include <cassert>template<typename T> class Stack { private:std…

react学习(61)--js contact

定义和用法 concat() 方法用于连接两个或多个数组。 该方法不会改变现有的数组&#xff0c;而仅仅会返回被连接数组的一个副本。

iPhone将NSString转换编码集为gb2312或者gbk的方法

很多时候软件读取的中文网页编码集是gb2312&#xff0c;所以显示出来的是乱码。这时需要将NSString文字编码转换。你可以试试以下代码 NSURL *url [NSURL URLWithString:urlStr]; NSData *data [NSData dataWithContentsOfURL:url]; NSStringEncoding enc CFStringConvertEn…

脱离 Rails 看 Ruby

在开始这篇文章之前&#xff0c;我需要澄清一些事情。首先&#xff0c;这不是一篇关于 Ruby on Rails 的文章。如果您希望了解 Rails&#xff0c;每周&#xff08;甚至每小时&#xff09;都有相关的文章和 blog 出现&#xff0c;它们都对这个令人兴奋的框架的众多特性大加推崇&…