请老师帮忙看一下哪里错了,我基本是依葫芦画瓢的,依然实现不了

请老师帮忙看一下哪里错了,我基本是依葫芦画瓢的,依然实现不了

完全看不懂啊,我大概能理解一层层往里,从html到title这里能理解,但是for执行完了之后,是怎么跳回去重新再循环一次,打印body之内的节点的呢?


<!DOCTYPE html>

<html>

<head>

  <meta charset="UTF-8">

  <title>节点遍历</title>

</head>

<body>

  <div>

    <p>

      <span>

        <a href=""></a>

        <a href=""></a>

        <a href=""></a>

      </span>

      <span>

        <a href=""></a>

        <a href=""></a>

        <a href=""></a>

      </span>

      <span>

        <a href=""></a>

        <a href=""></a>

        <a href=""></a>

      </span>

    </p>

  </div>

    <script>

        myReady(function(){

          var s="";

          function travel(space,node){

              if(node.tagName){

                  s+=space+node.tagName+"<br/>";

              }

              var len=node.childNodes.length;

              for(var i=0;i<len;i++){

                  travel(space+"*",node.childNodes[i])

              }

          }

          travel("",document);

          document.write(s)

        })

    </script>

</body>

</html>


正在回答

登陆购买课程后可参与讨论,去登陆

3回答

同学你好,

课程中老师将script标签添加在了head中,按照文档加载顺序,DOM还没有加载完就会执行,元素可能获取不到。所以老师封装了一个方法。

domReady.js中是老师封装了一个myReady , 这个方法实际上实现的效果就是$(document).ready(function(){}) , 让DOM加载完后再去执行js代码 。

因为现在还没有学习到jQuery , 所以这里老师为了方便课程讲解自己封装了一个类似的方法 。这里同学对 domReady.js简单了解一下即可,不需要深入研究。后期学了jQuery,使用$(document).ready(function(){}) 就可以啦 。

如果要使用的话在下载源码即可。如果不使用这个封装方法,将script标签放在body底部即可。

祝学习愉快!

好帮手慕星星 2019-08-16 10:28:38

同学你好,

1、在2-1视频中老师引入了一个js文件:

http://img1.sycdn.imooc.com//climg/5d5613140001d9b416900691.jpg

这个文件中封装了文档就绪函数,也就是myReady,需要将代码写在这个方法中。

如果同学想要这个函数的话,可以从源码中下载进行使用:

http://img1.sycdn.imooc.com//climg/5d5613b80001858204590366.jpg

引入js文件之后才能用这个函数哦,否则就会报错。

2、同学的代码中因为没有引入课程中的js文件,直接用了封装了函数,所以没有效果,可以将函数去掉。script标签在body底部,DOM结构加载完成之后才会执行,所以不写文档就绪函数也是可以的。去掉函数之后效果就没有问题了:

http://img1.sycdn.imooc.com//climg/5d5614480001bb0f01490447.jpg

3、可以参考下面的解释:

    // myReady(function() {

    var s = "";

    function travel(space, node) {

        if (node.tagName) {

            s += space + node.tagName + "<br/>";

        }
        console.log(node.childNodes)

        var len = node.childNodes.length;

        for (var i = 0; i < len; i++) {

            travel(space + "*", node.childNodes[i])

        }

    }

    travel("", document);

    document.write(s)

    //开始传入的节点是document,没有节点名称,所以会跳过if执行下面代码,获取子节点长度为2,一个文档声明,一个html节点,长度为2,进行for循环,调用travel方法,
    //文档声明没有节点名称所以会跳过if判断,也没有子节点,所以会跳过for循环结束;html有节点名称,进入if判断进行拼接:s=''*+html+换行。html的子节点有3个head,text(换行),body,然后进行for循环调用travel方法。
    //首先是head节点,travel中传入的参数为(''**,head),''*是html调用travel函数的时候传入的第一个参数,所以后面再拼接一个*,head有节点名称,s=''*+html+换行+''**+head+换行。head有5个子节点:文本(换行),meta,文本(换行),title,文本(换行).文本节点没有名称也没有子节点,所以跳过。meta和title就会执行travel函数,最后一个文本节点也会跳过。
    //head中子节点执行完毕了,就会执行html中第二个子节点,也就是文本节点,跳过.
    //最后是body节点,依次类推
    //

    // })
    </script>

因为一开始html有3个子节点,当head节点中子节点执行完毕之后,就会执行html中第二个子节点,然后是第二个子节点。

自己再测试理解下,祝学习愉快!

  • 提问者 Elisa呀 #1
    既然不用封装就可以写,为什么讲课的时候,老师要封装一个函数呢?请问老师封装函数是干嘛的呀?
    2019-08-17 01:29:41
提问者 Elisa呀 2019-08-15 23:32:38

还有,老师,myReady()是什么意思呀?好像也没讲过吧???创建函数不是function(){}吗??

为啥外边还要写个 myReady( )?

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师