<html id="myhtml">
<head >
<title>adsfaf</title>
</head>
<body>
<div>dasf<em>dsfa</em>dfsaf</div>
<script language="javascript">var myall=new Array();
function addtomyall(element){
myall[myall.length]=element;
for(var i=0; i<element.children.length; i++)
addtomyall(element.children[i]);}addtomyall(myhtml);var s="";
for(i=0; i<myall.length; i++)
s +=myall[i].tagName + " ";
alert(s);
</script>
</body>
</html>
中的script代码该怎样理解?element是变量吗?还是一直被赋值为myhtml?其中myall[myall.length]=element;中的myall.length是怎么样计数的?还有就是结果中的html这个元素为什么不是显示的myhtml这个元素?

解决方案 »

  1.   

    首先要注意
    <html id="myhtml">然后就是
    addtomyall(myhtml); addtomyall这个函数就是一个递归的调用,一直把html及其下所有子元素放到myall这个数组里面,element这个变量在递归依次为HTML HEAD TITLE BODY DIV EM SCRIPT 这几个元素(当然这也是运行结果)由于数组的第一个元素的下标为0,而数组的长度是从1开始计起的,myall[myall.length]=element就是动态地增加myall这个数组还有就是结果中的html这个元素为什么不是显示的myhtml这个元素?这句我还不懂你问什么。
      

  2.   

    既然element是变量,在这里我假如这句addtomyall(element.children[i]);经过第一次运算后得到的结果是addtomyall(head);那么这个值就应该要重新赋给element,在第二次的循环中for(var i=0; i<element.children.length; i++)中的这个element也会变为head啊,这样它的子元素个数就会变化,为什么没变呢?
    还有就是结果中的html这个元素为什么不是显示的myhtml这个元素?这个问题就是说在element这个变量被赋予myhtml后在后面的myall[myall.length]=element;中最后运行的结果应该是myall[0]=myhtml啊,怎么会是元素标签html呢?除非是后面的tagname在起作用,将这个id=myhtml又变成了html
      

  3.   

    1.element是函数的参数,又不是一个全局的变量,每次函数执行时当然不会变,一但递归完成一层回到上一层时又变成上一层的参数值
    2.确实是tagname在起作用PS:建议你安装firefox+firebug吧
      

  4.   

    <html id="myhtml"> 
    <head >
    <title>
    adsfaf
    </title>
    </head>
    <body>
    <div>
    dasf
    <em>
    dsfa
    </em>
    dfsaf
    </div>

    <script language="javascript">
    <!--
    var myall=new Array();
    function addtomyall(element){
    myall[myall.length]=element;
    for(var i=0; i<element.children.length; i++)
    addtomyall(element.children[i]);
    }
    addtomyall(myhtml); var s="";
    for(i=0; i<myall.length; i++)
    s +=myall[i].tagName + " ";
    alert(s);
    -->
    </script>
    </body>
    </html>
    注释:
    1、在DOM中HTML文档的潜入标记的层级结构表示成对象的一棵树,HTML的这棵树的表示包含了表示HTML标记和元素的节点,以及表示文本的串的节点。
    2、直接位于一个结点的下层的节点是该结点的子节点,也就是children。
    3、Element是一个文档树的根结点,tagName是Element的标记名,id属性给该元素指定唯一的一个名称,让我们可以找到它。
    4、所有Node对象文档都有一个childrenNodes[]的数组,该数组包含那个节点的子节点,但是IE4不支持该数组,它提供了一个跟该数组很类似的一个数组children[],也就是你上面程序出现的。
    5、myall.length是你创建的那个数组对象myall[]的长度,因为数组的下标是从0开始的,所以数组中的最后一个元素是myall[myall.length-1],myall[myall.length]=element;就是给这个数组增加了一个元素。
    下面跟你说说运行过程:
    第一步:创建一个数组,定义一个函数,函数的参数为文档树的节点,然后调用该函数addtomyall(myhtml),通过“myhtml”找到了节点html;
    第二步:节点html作为elemnt的值传函数,数组有了一个元素html,然后进入for循环,此时element.children.length=2;当1=0时,节点html的第一个孩子head作为作为elemnt的值传函数,数组有了二个元素head。
    第三步:head有又孩子title,然后有递归调用addtomycall()函数,title下面的孩子已经不是element对象了,而是text对象,所以结束这一层递归,回到head那一层,执行i++,i就等于1,head只有一个element对象的孩子,此时i不小于element.children.length,退出回到head那一层,执行i++,i=1<2,所以就开始body那边的递归了,然后是script,跟head这边是一样的,我就不多说了。。
    最后一步:就是将数组中每个元素的值(也就是给文档树的每个节点:html,head,title。body,div,em,script)的tagName属性,就是他们的元素名称赋给字符串s返回。
    说了这么多,希望对楼主有帮助。