+发表新主题
查看: 1708|回复: 0

[代码片段] js 遍历节点树API

[复制链接]

[代码片段] js 遍历节点树API

[复制链接]
雪铁龙 发表于 2016-1-12 19:53:15 浏览:  1708 回复:  0 [显示全部楼层] |只看大图 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
一. 遍历API,2个:

     1. NodeIterator:按照深度优先的原则向上或向下遍历节点

                   每次只引用一个节点对象

          如何使用:2步:

          1. 创建迭代器对象:

              var iterator=document.createNodeIterator(

                                              开始的节点对象,

                           遍历节点的类型,//NodeFilter.SHOW_ALL

                                              //NodeFilter.SHOW_ELEMENT                                                                                 null,false

                                          );

          2. 跳到下一个节点对象:var next=iterator.nextNode();

                      如果没有下一个节点,就返回null

            退一步,返回上一个节点:var prev=iterator.previousNode();

                 获得当前正在站的节点:iterator.referenceNode

例如:使用API遍历节点数

  1. <!DOCTYPE HTML>

  2. <html>

  3. <head>

  4. <title>使用遍历API遍历节点或元素树</title>

  5. <meta charset="utf-8"/>

  6. <script src="js/5.js"></script>

  7. </head>

  8. <body>

  9. <span class="msg">Hello World !</span>

  10. <ul>

  11. <li>综艺</li>

  12. <li>电影

  13. <ul>

  14. <li>水浒传</li>

  15. <li>东游记</li>

  16. <li>西游记</li>

  17. </ul>

  18. </li>

  19. <li>剧集</li>

  20. </ul>

  21. </body>

  22. </html>
复制代码
下面是js文件:

  1.       window.onload=function(){

  2. var tabs=["|-"];

  3. //Step1: 创建迭代器对象:

  4. var iterator=document.createTreeWalker(

  5. document,//开始节点

  6.             NodeFilter.SHOW_ELEMENT,

  7. null,false);

  8. //Step2: 使用循环,推动迭代器跳向下一个节点

  9. var node;

  10. while((node=iterator.nextNode())!=null){

  11. console.log(tabs.join("")+

  12. (node.nodeType!=1&&node.nodeType!=9&&node.nodeType!=10?

  13. node.nodeValue:

  14. node.nodeName)

  15. );

  16. if(node.childNodes.length!=0){//如果当前节点有子节点

  17. tabs.unshift("t"); //压入缩进

  18. }else{//如果没有子节点,才考虑退格

  19. //下一个节点不是自己的兄弟

  20. var next=iterator.nextNode();

  21. if(next==null){break;//已经是最后节点,就退出

  22. }else if(node.nextSibling!=next){

  23. tabs.shift();

  24. }

  25. iterator.previousNode();

  26. }

  27. }

  28. }
复制代码
这是控制台的显示效果:

   193731dfr6puw6rdwtn610.png      


    2.TreeWalker,自由遍历:保证基本深度优先功能的基础上

                 添加了向任意方向跳转的额外方法

        如何使用:和NodeIterator基本功能完全一样

        额外方法:parentNode(), firstChild(), lastChild()

                 nextSibling(), previousSibling()


二. 查找,2大类:

      1. getXXX: 4个:

           按id查找1个元素对象:

                    var elem=document.getElementById("id");

           按标签名查找多个子元素对象:

            var nodeList=parent.getElementsByTagName("标签名");

             何时使用:获取某个父对象下指定子元素时使用

            优点:可以屏蔽空文本的干扰

          按name属性查找多个子元素对象:

           var nodeList=parent.getElementsByName("name属性名");

           按类名查找多个子元素对象:HTML5新增,IE9及以上支持

        var nodeList=parent.getElementsByClassName("样式类名");

          何时使用:只查找一次时


      2. Selector API:用CSS选择器选择元素——》JQuery的核心

          2个:

          1. 仅选择第一个符合条件的元素:

                 var elem=parent.querySelector("选择器");

          2. 选择所有符合条件的元素:

                 var elems=parent.querySelectorAll("选择器");

          强调:elems是非动态集合:包含了完整DOM对象和属性

     比较:

        getXXX   vs    Selector API

        返回值:getXXX 返回动态集合

                Selector API 返回非动态集合

        效率:getXXX 效率高

              Selector API  效率低

           何时使用:通过多级查找才能获得想要的元素时

例如:

  1. <!DOCTYPE HTML>

  2. <html>

  3. <head>

  4. <title>实现购物车客户端计算</title>

  5. <meta charset="utf-8" />

  6. <style>

  7. table{width:600px; text-align:center;

  8. border-collapse:collapse;

  9. }

  10. td,th{border:1px solid black}

  11. td[colspan="3"]{text-align:right;}

  12. </style>

  13. <script src="js/6_2.js"></script>

  14. </head>

  15. <body>

  16. <table id="data">

  17. <thead>

  18. <tr>

  19. <th>商品名称</th>

  20. <th>单价</th>

  21. <th>数量</th>

  22. <th>小计</th>

  23. </tr>

  24. </thead>

  25. <tbody>

  26. <tr>

  27. <td>iPhone6</td>

  28. <td>?4488</td>

  29. <td>

  30. <button onclick="calc(this)">-</button>

  31. <span>1</span>

  32. <button onclick="calc(this)">+</button>

  33. </td>

  34. <td>?4488</td>

  35. </tr>

  36. <tr>

  37. <td>iPhone6 plus</td>

  38. <td>?5288</td>

  39. <td>

  40. <button onclick="calc(this)">-</button>

  41.     <span>1</span>

  42. <button onclick="calc(this)">+</button>

  43. </td>

  44. <td>?5288</td>

  45. </tr>

  46. <tr>

  47. <td>iPad Air 2</td>

  48. <td>?4288</td>

  49. <td>

  50.     <button onclick="calc(this)">-</button>

  51. <span>1</span>

  52. <button onclick="calc(this)">+</button>

  53. </td>

  54. <td>?4288</td>

  55. </tr>

  56. </tbody>

  57. <tfoot>

  58. <tr>

  59. <td colspan="3">Total: </td>

  60. <td>?14064</td>

  61. </tr>

  62. </tfoot>

  63. </table>

  64. </body>

  65. </html>
复制代码
下面是js文件:

    <blockquote>//html属性中定义事件处理函数:

复制代码
193731dfr6puw6rdwtn610.png 193731dfr6puw6rdwtn610.png

回复

使用道具 举报


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版| 赣南网

© 2013-2016 Comsenz Inc. Powered by Discuz! X3.4

用微信扫一扫

赣南网