在本讲义中,我们将学到DOM的查询,以及如何使用dojo.query来方便的查找并操作DOM节点。
难度:初学者 适用的Dojo 版本: 1.6
作者:Bryan Forbes
译者: feijia
原文连接:http://dojotoolkit.org/documentation/tutorials/1.6/using_query/
入门
对DOM编程的一个关键要素是能够快速高效的获取到你所要使用的节点。之前我们曾经介绍过使用dojo.byId来查找DOM节点的方法。但是,这种方法的局限性也很明显。你很难为页面上每个节点都起一个唯一的ID;而且通过dojo.byId查找得到的总是单个节点,当你需要对一组节点做同样的动作时,dojo.byId 就无能为力了。解决这些局限的方法就是我们今天将要介绍的:dojo.query 。 dojo.query 方法使用了类似CSS查询的方式来获取一组节点,在新版的dojo当中,它甚至已经完全可以支持高级的CSS3 选择器(selector )了。
常用查询
为了演示一些最常用的DOM查询示例,我们假设了如下的一个HTML页面片段. (这是常见的包含一系列链接的HTML片段)
针对上述的HTML片段,能想到的第一个操作通常是如何获取到整个列表的一个句柄. 当然你可以用dojo.byId, 但dojo.query 也可以达到同样目的. 虽然初看起来,你会觉得在这里dojo.query 不是那么方便,但结合后面的例子你就会发现它的好处。
通过在参数中加入"#", 我们告诉dojo.query 去查找节点的"ID"属性。这是从CSS操作中借鉴来的语法。 需要注意的是dojo.query 的返回值永远是一个数组。 在这个例子中,因为只有一个ID叫"list" 的节点,所以我们直接取出了该数组的第一个元素。
上面我们看到了如何通过ID来获取节点,dojo.query 可不是只有这么点能力。它还支持通过class name来选择节点。假设我们希望能够获取所有class name等于"odd" 的节点:
通过在参数中加入".", 我们告诉dojo.query 现在是要匹配节点的className属性, 这也是借鉴了CSS的语法。在这个例子中,dojo.query 将会返回包含4个<li> 节点和3个<a>节点 的数组。
限定查询条件的作用域
你可能已经发现了,在上一个例子中的得到odds数组同时包含了来自两个列表的节点。 假设我们只需要获取第一个列表中的odd节点呢? 有两种方法
这两种方法返回的都是相同的元素, 第一个方法使用了选择器的语法,限制了查询的结果在ID为list的元素内,而第二个方法则将一个节点作为限定查询参数传入query。
当dojo.query 方法不包含第二个参数时,它会搜索整个DOM树结构,遍历<HTML>标签中包含的每个节点。 如果该方法调用时包含了一个DOM节点作为第二参数,这个节点就是查询的作用域, 查询的结果一定是该节点或其子节点。
如果你的页面的DOM树结构比较小,比如像我们这里使用的列表的例子,那么省略第二参数的做法是可以的,也不会过分影响效率。但是如果页面很复杂,那么强烈建议你在使用dojo.query是明确指定第二参数来限定查询的作用域.这会大大减少无谓的对整个页面进行搜索操作从而提升速度和性能。
为了方便,在接下来的例子中,我们都会省略第二个参数,不过请你一定要记住:在真实应用中你应该尽可能的制定作用域来让查询操作快速高效。
更多高级的查询
前面的例子中,我们查询得到的结果集包含了<li> 节点和<a> 节点两种,如果我们只想要其中的<a> 节点该如何做呢? 在dojo.query 查询时我们可以将 标签名和class 名组合作为查询条件:
dojo.query 还支持另一种选择器, ">". CSS中使用">" 并不被所有浏览器支持,但是在dojo.query中却可以通用.
使用这个选择器,查询会
查看示例
在我们的例子中,allA会查询出6个<a>节点,而someA只会包含2个<a>。 在">" 两侧可以使用任意的其他选择器,包括class 选择器。这里我们只是介绍了几种最常用的选择器,但dojo.query 是完全兼容CSS3的,还能够支持很多其他的选择器
.你可以自己进一步学习掌握.
NodeList(操作dojo.query返回的结果集)
前文提到,dojo.query 返回的是匹配查询结果的所有节点构成的数组;这个数组实际上是一个特殊的数组对象称为dojo.NodeList, 该数组对象内建了一系列可以方便操作其中节点的方法.
下面我们来看一下其中常用的一些方法, 在这个章节我们会使用下面的一个HTML代码片段:
dojo.NodeList 内建了一些Dojo 数组辅助方法. 例如forEach, 它可以对数组中的每个元素执行一个函数:
被传入forEach的函数是一个回调函数,该回调函数支持3个参数: 当前正在操作的节点,该节点在数组中的位置序号,以及当前正在遍历的结果集(是一个dojo.NodeList 对象)
对大多数开发者而言,第三个参数一般用不到, 仅当你在回调函数中需要去操作结果集中的其他节点时需要用到这个参数. forEach方法还可以接受第二个参数,作为回调函数调用的作用域(Scope)
dojo.NodeList中内建的其他数组辅助方法还包括: map,filter,every, 和 some. 大多方法都返回一个dojo.NodeList 对象,因此很容易串联使用. some 和every是例外,它们返回值是布尔值(boolean)
dojo.NodeList还内建了一些方面DOM操作的方法, 上一个例子还可以进一步简化为
这些DOM操作方法会在dojo.NodeList中每个节点上执行,同事返回值仍然是一个dojo.NodeList,可以串联使用.例如
其他dojo.NodeList 的DOM操作方法还包括: style, toggleClass,replaceClass, place 和empty. 所有这些方法都会返回dojo.NodeList,供串联使用.
事件
dojo.NodeList 上提供的另一重要方法是connect,用来连接DOM事件. 关于如何在Dojo中处理DOM事件会在下一个讲义中详细讨论,我们这里要解释一下如何使用dojo.NodeList的connect方法.
特别要注意的是,虽然在dojo.NodeList上使用connect很方便,但是并不适用于dojo.NodeList 包含大量节点的情形, 这种情况下应该使用一种称为事件代理(event delegation)的技巧.关于这一技巧我们会在未来的讲义中探讨.
上面的例子中我们演示了两种将dojo.NodeList连接到DOM事件的方法:
通用的connect 方法, 参数中指定事件名称和回调函数
使用一系列预定义的onXXXX 方法, 完整的方法列表
可以在参考手册中查找
第二种做法更加简洁一些,但是内建的onXXX方法仅包含了标准的DOM事件, 对于一些非标准事件例如 DOMAttrModified, 则只能使用第一种方法.
小结
利用dojo.query 以及dojo.NodeList,对批量的DOM节点进行操作是很简单的:
使用dojo.query 查询到你所需要操作的节点,再使用dojo.NodeList的内建方法对这些节点进行修改操作. 下面一章我们将会进一步介绍如何使用Dojo向页面中添加互动,如何使用dojo中的事件机制。
分享到:
相关推荐
Dojo 是一个强大的JavaScript工具库,它为Web开发提供了丰富的功能和API,包括对DOM(文档对象模型)的操作。在Dojo 1.6版本中,DOM操作是其核心特性之一,它允许开发者高效地创建、修改和管理HTML元素。以下是对...
例如,`dojo/query`用于选择和操作DOM元素,`dojo/on`用于事件监听。 3. **dojo/domReady!**:这个模块确保了DOM加载完成后再执行后续的代码,避免了在DOM未准备好的情况下运行JavaScript引发的问题。 4. **dijit*...
2. **Dojo Toolkit Core**:这是Dojo的基础部分,包含了大量的实用函数和类,用于DOM操作、事件处理、Ajax请求、动画效果等。1.6版对这些核心功能进行了优化,提高了性能和兼容性。 3. **AMD(Asynchronous Module ...
`dojo/query`类似jQuery的选择器,可以方便地选取DOM元素,进行批量操作。 4. **dojo/ready与dojo/aspect**:`dojo/ready`在DOM加载完成后执行代码,是Dojo中的"$(document).ready()";`dojo/aspect`则用于面向切面...
Dojo 是一个强大的JavaScript工具库,它为Web开发提供了丰富的功能和组件,涵盖了从DOM操作、事件处理到AJAX通信等多个方面。Dojo的核心在于它的模块化系统,这使得开发者可以按需加载代码,提高应用的性能和可维护...
20. **dojo.xml、dojo.dom**:DOM操作和XML辅助函数,帮助处理XML文档和DOM树。 21. **dojo.style**:CSS相关的功能,如获取和设置元素样式,与浏览器的盒模型兼容。 在实际使用中,如需使用日期控件,首先需要...
1. **Dojo基础**:首先,读者会了解到Dojo的核心概念,如dojo.js加载器、dojo.declare用于类定义、dojo.connect用于事件处理,以及dojo.query用于DOM查询。这些基础知识是理解Dojo工作的关键。 2. **模块系统(AMD...
5. **DOM操作 (dojo.query and dojo.place)**:Dojo 提供了强大的DOM操作工具,如`dojo.query`可以像jQuery一样选择DOM元素,而`dojo.place`则可以方便地在文档中移动或插入元素。 6. **事件处理 (dojo.connect)**...
Dojo 是一个强大的JavaScript工具包,它为Web开发提供了丰富的功能和组件,涵盖了从DOM操作到数据管理,从动画效果到AJAX通信等各个方面。在Dojo 1.10版离线参考手册中,我们可以深入了解到这个版本的详细信息和使用...
3. **dojo/dom和dojo/query**:这两个模块提供了DOM操作功能,包括查找、修改和操作DOM节点。在源代码中,你会看到如何利用dojo/query选择元素,并使用dojo/dom进行属性修改和事件绑定。 4. **dojo/on和dojo/event*...
"dojo-release-1.3.2-docs"是Dojo框架1.3.2版本的官方文档,对于理解和使用Dojo 1.3.2版本至关重要。 在Dojo 1.3.2的文档中,你会找到以下关键知识点: 1. **Dojo核心**:Dojo的核心包含了基础的JavaScript实用...
3. **dojo/dom** 和 **dojo/query**:`dojo/dom`提供了对HTML DOM元素的操作,如查找、创建和修改元素。而`dojo/query`类似于jQuery的选择器,可以方便地选取DOM元素集合。 4. **dojo/on**:Dojo的事件监听器,支持...
`dojo/dom`用于获取、设置和操作DOM元素,而`dojo/query`则类似于jQuery的选择器,能方便地选取页面中的多个元素。 4. **dojo/NodeList**:`dojo/query`返回的结果集是一个NodeList,它提供了类似于数组的方法,如...
3. **DOJO DOM操作**:DOJO提供了一系列强大的DOM操作函数,比如`dojo.query`用于选择DOM元素,`dojo.create`用于创建新的元素,`dojo.place`用于插入元素等。 4. **DOJO事件处理**:DOJO提供了一套事件处理机制,...
Dojo是一个广泛使用的开源JavaScript库,它为Web开发提供了丰富的功能和工具,尤其在构建交互式的、高性能的用户界面方面表现突出。这个压缩包“dojo-release-1.10.0”包含了Dojo框架的完整资源,使得开发者可以便捷...
- **官方文档**:Dojo的官方文档非常详尽,包含了API参考、教程、示例等内容,是学习Dojo的重要资料。 - **在线示例**:Dojo官方提供了一个在线的Dojo Playground,可以在其中直接编写和运行Dojo代码,方便实践和...
Dojo是一个广泛使用的JavaScript库,它为Web开发提供了丰富的功能和工具,包括AJAX、DOM操作、动画效果、事件处理以及模块化开发等。在本文中,我们将深入探讨“dojo-release-1.1.2-src”这一源码包,揭示Dojo 1.1.2...
### Dojo常用方法总结 Dojo是一个开源的JavaScript框架,用于...通过这些方法,开发者可以更高效地进行DOM操作和事件处理,从而提高Web应用的性能和用户体验。希望这些总结能够帮助你在实际项目中更好地利用Dojo框架。
例如,`dojo/on` 用于事件监听,`dojo/query` 用于DOM选择,`dojo/dom-style` 用于处理CSS样式。 3. **Dojo Toolkit组件**:Dojo提供了一系列可复用的UI组件,如`dijit`和`dojox`。`dijit`包含了一系列用户界面元素...