Dojo学习笔记(三):使用dojo/query

前端之家收集整理的这篇文章主要介绍了Dojo学习笔记(三):使用dojo/query前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

操作dom时,可以使用dom.byId,缺陷是需要为每一个元素指定唯一ID,是一个可怕的和不切实际的工作。另一个解决方案,采用dojo/query模块。dojo/query使用我们熟悉的css选择器 检索一系列的节点。包括对先进的CSS3 选择器的支持

1、查询

css/demo.css文件

  1. body {
  2. margin: 0;
  3. padding: 2em;
  4. font-family: Lucida Sans,Lucida Grande,Arial !important;
  5. font-size: 13px !important;
  6. background: white;
  7. color: #333;
  8. }
  9. button {
  10. background-color: #E4F2FF;
  11. background-image: url("//dijit/themes/claro/form/images/buttonEnabled.png");
  12. background-position: center top;
  13. background-repeat: repeat-x;
  14. border: 1px solid #769DC0;
  15. padding: 2px 8px 4px;
  16. font-size:1em;
  17. }
  18. button:hover {
  19. background-color: #AFD9FF;
  20. color: #000000;
  21. }
  22. .add-borders ul {
  23. border: 1px solid red;
  24. padding: 2px;
  25. }
  26. .add-borders li {
  27. border: 1px solid blue;
  28. padding: 2px;
  29. }
  30. .add-borders a {
  31. border: 1px solid black;
  32. padding: 2px;
  33. }
  34. .bold {
  35. font-weight: bold;
  36. }
  37. .italic {
  38. font-style: italic;
  39. }
  40. .highlight {
  41. background-color: yellow;
  42. }
  43. .red {
  44. background-color: red;
  45. }
  46. .blue {
  47. background-color: blue;
  48. }

query.html文件

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <Meta charset="UTF-8">
  5. <title>Using dojo/query</title>
  6. <link rel="stylesheet" href="css/demo.css">
  7. <script src="dojo/dojo.js" data-dojo-config="async: true"></script>
  8. </head>
  9. <body>
  10. <button class="queryButton">#list</button>
  11. <button class="queryButton">.odd</button>
  12. <button class="queryButton">#list .odd</button>
  13. <button class="queryButton">a.odd</button>
  14. <button class="queryButton">li a</button>
  15. <button class="queryButton">li &gt; a</button>
  16. <button class="queryButton">.italic &gt; a</button>
  17. <div class="add-borders">
  18. <ul id="list" class="">
  19. <li class="odd">
  20. <div class="bold">
  21. <a class="odd">Odd</a>
  22. </div>
  23. </li>
  24. <li class="even">
  25. <div class="italic">
  26. <a class="even highlight">Even</a>
  27. </div>
  28. </li>
  29. <li class="odd">
  30. <a class="odd">Odd</a>
  31. </li>
  32. <li class="even">
  33. <div class="bold">
  34. <a class="even">Even</a>
  35. </div>
  36. </li>
  37. <li class="odd">
  38. <div class="italic">
  39. <a class="odd highlight">Odd</a>
  40. </div>
  41. </li>
  42. <li class="even">
  43. <a class="even">Even</a>
  44. </li>
  45. </ul>
  46. <ul id="list2">
  47. <li class="odd">Odd</li>
  48. </ul>
  49. </div>
  50. </body>
  51. </html>


事件:

  1. <script>
  2. require(["dojo/query","dojo/NodeList-dom","dojo/domReady!"],function(query){
  3. function executeSeletor(button){
  4. query(".highlight").removeClass("highlight");
  5. query(button.innerHTML.replace("&gt;",">")).addClass("highlight");
  6. }
  7. query(".queryButton").on("click",function(e){
  8. //console.dir(e);
  9. executeSeletor(e.target);
  10. })
  11. var list = query("#list");
  12. console.dir(list);
  13. });
  14. </script>


使用ID查询

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

"#"标示符告诉query方法去查找拥有此Id属性的节点,与dom.byId功能类似。需要记住的一件事是:query 总是返回一个数组。通过ID抓取节点非常的好,但是他用起来没有 dom.byId强大,但是query允许你使用类名称来选取节点,如果我们只想检索拥有 "odd" 类名称的节点。

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

使用"."标示符我们告诉query去查找拥有此类名称属性的节点,将返回一个拥有4个<li>和3个<a>的数组。


2、限制你的查询

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

使用两种方法,最终效果是一样的。第一种方法是通过选择器格式通过查询引擎从整个的dom 中限定,第二种是对查询上下文限定到一个特定的DOM上。

方法二中,当query不使用第二个参数执行时,他将在整个DOM结构中查找,查询<html>标签下的每个有效的节点。当一个DOM节点被指定为第二个参数,将限定query到此节点及其子节点上。如果你的DOM相当的小省略第二个参数是可接受的,如果一个页面很大的DOM结构,使用第二个参数限定你 的查询将更好,通过具体的节点范围询将比在整个文档中查询更加的高效,能提供更好的用户体验。


3、更高级的选择

前面的查询包含了<li>和<a>标签,如果我们只想查询<a>标签要怎么办呢,你可以将一个标签名字和一个类名字合并:

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

选择li下所有a元素:

  1. // Retrieve an array of any a element that has an
  2. // li as its ancestor.
  3. var allA = query("li a");

选择li下第一个子元素为a的所有a元素:

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



4、节点列表

前面提到query返回符合选择器的一个节点数组,这是一个特殊的数组叫做dojo/NodeList。

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <Meta charset="UTF-8">
  5. <title>Using dojo/query</title>
  6. <link rel="stylesheet" href="css/demo.css">
  7. <script src="dojo/dojo.js" data-dojo-config="async: true"></script>
  8. <script>
  9. // Wait for the DOM to be ready before working with it
  10. require(["dojo/query","dojo/dom-class",function (query,domClass) {
  11. query(".odd").forEach(function (node,index,nodelist) {
  12. // for each node in the array returned by query,// execute the following code
  13. domClass.add(node,"red");
  14. });
  15. });
  16. </script>
  17. </head>
  18. <body>
  19. <div id="list">
  20. <div class="odd">One</div>
  21. <div class="even">Two</div>
  22. <div class="odd">Three</div>
  23. <div class="even">Four</div>
  24. <div class="odd">Five</div>
  25. <div class="even">Six</div>
  26. </div>
  27. </body>
  28. </html>

传递给foreach的函数是一个回调函数,被数组中的每个条目所调用,该回调函数包含三个参数:当前的节点,节点的索引,需要迭代的节点列表。

对大多数开发者,第三个参数可以忽略。如果数组未被保存在一个容易访问的变量中,使用第三个参数访问数组中的其他元素很有用的。

dojo/NodeList-dom 提供便利的方法来搭配dojo中的各种dom方法,上面的示例等效于:

  1. <script>
  2. require(["dojo/query",function(query) {
  3. // Add "red" to the className of each node matching
  4. // the selector ".odd"
  5. query(".odd").addClass("red");
  6. // Add "blue" to the className of each node matching
  7. // the selector ".even"
  8. //query(".even").addClass("blue");
  9. });
  10. </script>


支持链式访问:

样例一:

  1. // Remove "red" from and add "blue" to the className
  2. // of each node matching the selector ".odd"
  3. query(".odd").removeClass("red").addClass("blue");

样例二:

  1. // Change the font color to "white" and add "italic" to
  2. // the className of each node matching the selector ".even"
  3. query(".even").style("color","white").addClass("italic");


5、事件

节点列表提供的另一个便利方法是:on 连接到DOM 事件。需要注意的是 虽然这是一个 便利的格式,但是这种方法不应该应用在一个包含大量的节点的一个节点列表上,在这种情况下我们将使用事件委托。

  1. <button class="hookUp demoBtn">Click Me!</button>
  2. <button class="hookUp demoBtn">Click Me!</button>
  3. <button class="hookUp demoBtn">Click Me!</button>
  4. <button class="hookUp demoBtn">Click Me!</button>
  5. <script>
  6. // Wait for the DOM to be ready before working with it
  7. require(["dojo/query",function(query) {
  8. query(".hookUp").on("click",function(){
  9. alert("This button is hooked up!");
  10. });
  11. });
  12. </script>

猜你在找的Dojo相关文章