在本讲义中,我们将学到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片段)
- <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>
针对上述的HTML片段,能想到的第一个操作通常是如何获取到整个列表的一个句柄. 当然你可以用dojo.byId, 但dojo.query 也可以达到同样目的. 虽然初看起来,你会觉得在这里dojo.query 不是那么方便,但结合后面的例子你就会发现它的好处。
-
-
var list = dojo.query("#list")[0];
通过在参数中加入"#", 我们告诉dojo.query 去查找节点的"ID"属性。这是从CSS操作中借鉴来的语法。 需要注意的是dojo.query 的返回值永远是一个数组。 在这个例子中,因为只有一个ID叫"list" 的节点,所以我们直接取出了该数组的第一个元素。
上面我们看到了如何通过ID来获取节点,dojo.query 可不是只有这么点能力。它还支持通过class name来选择节点。假设我们希望能够获取所有class name等于"odd" 的节点:
-
-
var odds = dojo.query(".odd");
通过在参数中加入".", 我们告诉dojo.query 现在是要匹配节点的className属性, 这也是借鉴了CSS的语法。在这个例子中,dojo.query 将会返回包含4个<li> 节点和3个<a>节点 的数组。
限定查询条件的作用域
你可能已经发现了,在上一个例子中的得到odds数组同时包含了来自两个列表的节点。 假设我们只需要获取第一个列表中的odd节点呢? 有两种方法
-
-
var odds1 = dojo.query("#list .odd");
-
-
-
var odds2 = dojo.query(".odd", dojo.byId("list"));
这两种方法返回的都是相同的元素, 第一个方法使用了选择器的语法,限制了查询的结果在ID为list的元素内,而第二个方法则将一个节点作为限定查询参数传入query。
当dojo.query 方法不包含第二个参数时,它会搜索整个DOM树结构,遍历<HTML>标签中包含的每个节点。 如果该方法调用时包含了一个DOM节点作为第二参数,这个节点就是查询的作用域, 查询的结果一定是该节点或其子节点。
如果你的页面的DOM树结构比较小,比如像我们这里使用的列表的例子,那么省略第二参数的做法是可以的,也不会过分影响效率。但是如果页面很复杂,那么强烈建议你在使用dojo.query是明确指定第二参数来限定查询的作用域.这会大大减少无谓的对整个页面进行搜索操作从而提升速度和性能。
为了方便,在接下来的例子中,我们都会省略第二个参数,不过请你一定要记住:在真实应用中你应该尽可能的制定作用域来让查询操作快速高效。
更多高级的查询
前面的例子中,我们查询得到的结果集包含了<li> 节点和<a> 节点两种,如果我们只想要其中的<a> 节点该如何做呢? 在dojo.query 查询时我们可以将 标签名和class 名组合作为查询条件:
- var oddA = dojo.query("a.odd");
dojo.query 还支持另一种选择器, ">". CSS中使用">" 并不被所有浏览器支持,但是在dojo.query中却可以通用.
使用这个选择器,查询会
-
-
var allA = dojo.query("li a");
-
-
var someA = dojo.query("li > a");
查看示例
在我们的例子中,allA会查询出6个<a>节点,而someA只会包含2个<a>。 在">" 两侧可以使用任意的其他选择器,包括class 选择器。这里我们只是介绍了几种最常用的选择器,但dojo.query 是完全兼容CSS3的,还能够支持很多其他的选择器 .你可以自己进一步学习掌握.
NodeList(操作dojo.query返回的结果集)
前文提到,dojo.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 数组辅助方法. 例如forEach, 它可以对数组中的每个元素执行一个函数:
- dojo.query(".odd").forEach(function(node, index, nodelist){
-
-
dojo.addClass(node, "red");
- });
被传入forEach的函数是一个回调函数,该回调函数支持3个参数: 当前正在操作的节点,该节点在数组中的位置序号,以及当前正在遍历的结果集(是一个dojo.NodeList 对象)
对大多数开发者而言,第三个参数一般用不到, 仅当你在回调函数中需要去操作结果集中的其他节点时需要用到这个参数. forEach方法还可以接受第二个参数,作为回调函数调用的作用域(Scope)
dojo.NodeList中内建的其他数组辅助方法还包括: map,filter,every, 和 some. 大多方法都返回一个dojo.NodeList 对象,因此很容易串联使用. some 和every是例外,它们返回值是布尔值(boolean)
dojo.NodeList还内建了一些方面DOM操作的方法, 上一个例子还可以进一步简化为
-
-
dojo.query(".odd").addClass("red");
-
-
dojo.query(".even").addClass("blue");
这些DOM操作方法会在dojo.NodeList中每个节点上执行,同事返回值仍然是一个dojo.NodeList,可以串联使用.例如
-
-
dojo.query(".odd").removeClass("red").addClass("blue");
其他dojo.NodeList 的DOM操作方法还包括: style, toggleClass,replaceClass, place 和empty. 所有这些方法都会返回dojo.NodeList,供串联使用.
-
-
dojo.query(".even").style("color", "white").addClass("italic");
事件
dojo.NodeList 上提供的另一重要方法是connect,用来连接DOM事件. 关于如何在Dojo中处理DOM事件会在下一个讲义中详细讨论,我们这里要解释一下如何使用dojo.NodeList的connect方法.
特别要注意的是,虽然在dojo.NodeList上使用connect很方便,但是并不适用于dojo.NodeList 包含大量节点的情形, 这种情况下应该使用一种称为事件代理(event delegation)的技巧.关于这一技巧我们会在未来的讲义中探讨.
- <button class="hookUp demoBtn">Click Me!</button>
-
<button class="hookUpToo demoBtn">Click Me!</button>
-
<button class="hookUpToo demoBtn">Click Me!</button>
-
<button class="hookUp demoBtn">Click Me!</button>
-
<mce:script type="text/javascript"><!--
-
-
dojo.ready(function(){
-
-
dojo.query(".hookUp").connect("onclick", function(){
-
alert("This button is hooked up!");
- });
-
-
dojo.query(".hookUpToo").onclick(function(){
-
alert("This button is hooked up too!");
- });
- });
-
上面的例子中我们演示了两种将dojo.NodeList连接到DOM事件的方法:
通用的connect 方法, 参数中指定事件名称和回调函数
使用一系列预定义的onXXXX 方法, 完整的方法列表 可以在参考手册中查找
第二种做法更加简洁一些,但是内建的onXXX方法仅包含了标准的DOM事件, 对于一些非标准事件例如 DOMAttrModified, 则只能使用第一种方法.
小结
利用dojo.query 以及dojo.NodeList,对批量的DOM节点进行操作是很简单的:
使用dojo.query 查询到你所需要操作的节点,再使用dojo.NodeList的内建方法对这些节点进行修改操作. 下面一章我们将会进一步介绍如何使用Dojo向页面中添加互动,如何使用dojo中的事件机制。
分享到:
相关推荐
例如,`dojo/query`用于选择和操作DOM元素,`dojo/on`用于事件监听。 3. **dojo/domReady!**:这个模块确保了DOM加载完成后再执行后续的代码,避免了在DOM未准备好的情况下运行JavaScript引发的问题。 4. **dijit*...
2. **dojo.NodeList**: dojo.query返回的是一个dojo.NodeList对象,它扩展了Array原型,提供了许多便利的方法,如`forEach`、`filter`、`map`等,使得遍历和操作DOM节点变得更加简单。此外,NodeList还支持样式操作...
2. **Dojo Toolkit Core**:这是Dojo的基础部分,包含了大量的实用函数和类,用于DOM操作、事件处理、Ajax请求、动画效果等。1.6版对这些核心功能进行了优化,提高了性能和兼容性。 3. **AMD(Asynchronous Module ...
1. **Dojo基础**:首先,读者会了解到Dojo的核心概念,如dojo.js加载器、dojo.declare用于类定义、dojo.connect用于事件处理,以及dojo.query用于DOM查询。这些基础知识是理解Dojo工作的关键。 2. **模块系统(AMD...
`dojo/query`类似jQuery的选择器,可以方便地选取DOM元素,进行批量操作。 4. **dojo/ready与dojo/aspect**:`dojo/ready`在DOM加载完成后执行代码,是Dojo中的"$(document).ready()";`dojo/aspect`则用于面向切面...
此外,Dojo还提供了一套强大的DOM操作API,如dojo.create、dojo.destroy和dojo.style,使得在JavaScript中操作DOM变得简单易行。 在数据交互方面,Dojo的dojo.xhr系列函数(如dojo.xhrGet、xhrPost)实现了与服务器...
这些API可能包括了dojo.query(用于查询DOM元素)、dojo.fx(动画效果)、dojo.data(数据存储)等。中文注解使得理解这些API的功能和用法更加容易,帮助开发者快速上手并有效利用Dojo进行项目开发。 学习Dojo,你...
Dojo 是一个强大的JavaScript工具包,它为Web开发提供了丰富的功能和组件,包括DOM操作、事件处理、Ajax交互、动画效果、模块化编程等。在"dojo-release-1.9.0-src.zip"这个压缩包中,我们获取的是Dojo 1.9.0版本的...
Dojo 是一个强大的JavaScript工具库,它为Web开发提供了丰富的功能和组件,涵盖了从DOM操作、事件处理到AJAX通信等多个方面。Dojo的核心在于它的模块化系统,这使得开发者可以按需加载代码,提高应用的性能和可维护...
### Dojo常用方法总结 Dojo是一个开源的JavaScript框架,用于...通过这些方法,开发者可以更高效地进行DOM操作和事件处理,从而提高Web应用的性能和用户体验。希望这些总结能够帮助你在实际项目中更好地利用Dojo框架。
5. **DOM操作 (dojo.query and dojo.place)**:Dojo 提供了强大的DOM操作工具,如`dojo.query`可以像jQuery一样选择DOM元素,而`dojo.place`则可以方便地在文档中移动或插入元素。 6. **事件处理 (dojo.connect)**...
其中,`dojo/dom`和`dojo/query`模块用于DOM操作,`dojo/on`处理事件监听,`dojo/Deferred`则用于异步编程,而`dojo/request`则负责AJAX通信。 **3. UI组件** DOJO的`dijit`模块提供了大量的UI组件,如按钮、表格...
2. **DOM操作**:Dojo提供了一套完整的DOM操作API,如`dojo/query`用于选择元素,`dojo/dom-geometry`用于获取元素几何信息,`dojo/dom-style`用于处理样式。这些工具使DOM操作更为便捷。 3. **事件处理**:Dojo的...
`dojo.forEach`的灵活性在于它可以与其他Dojo函数结合使用,尤其是`dojo.query`,方便地处理DOM元素。例如,以下代码将禁用页面所有选择框: ```javascript dojo.forEach(dojo.query("select"), function(selectTag...
`dojo/dom`用于获取、设置和操作DOM元素,而`dojo/query`则类似于jQuery的选择器,能方便地选取页面中的多个元素。 4. **dojo/NodeList**:`dojo/query`返回的结果集是一个NodeList,它提供了类似于数组的方法,如...
Dojo 是一个强大的JavaScript工具包,它为Web开发提供了丰富的功能和组件,涵盖了从DOM操作到数据管理,从动画效果到AJAX通信等各个方面。在Dojo 1.10版离线参考手册中,我们可以深入了解到这个版本的详细信息和使用...
2. **DOM操作**:Dojo提供了`dojo/dom`和`dojo/query`模块,用于选择和操作DOM元素,类似于jQuery的功能,但更注重性能和跨浏览器兼容性。 3. **事件处理**:Dojo的`dojo/on`模块提供了一种简单的方式来监听和处理...
2. **DOM操作**:Dojo提供了`dojo/dom`和`dojo/query`模块来操作和查找HTML元素。`dojo/dom-geometry`用于获取元素的位置和尺寸,而`dojo/dom-class`和`dojo/dom-style`则用于处理CSS类和样式。 3. **事件处理**:`...
除此之外,Dojo 还有强大的工具集,如`dojo/query`用于DOM查询,类似于jQuery的选择器;`dojo/dom-geometry`用于获取和设置元素的位置和尺寸;`dojo/on`用于事件监听等。 在Dojo 1.9中,值得注意的一个变化是Dojo ...