zoukankan      html  css  js  c++  java
  • DOM基础(四)

      每次写DOM的时候,就觉得好像没什么好写,因为涉及到知识点的方面的确不多,对于DOM来说,更多的还是练习为主。在练习的时候,最好能结合着js基础语法的知识点来学习。这样,在学习DOM的时候就不会那么枯燥了。

      在DOM基础(三)里我提到了追加子元素的概念,也就是appendChild()方法,这个方法是用来给节点的子节点中的最后添加一个元素。之前我提到的是把克隆的节点添加到节点的末尾。但是,如果我们对原本就存在的节点使用这种方法呢?比如下述代码:

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
    <ul id="ul">
        <li>111111</li>
        <li>222222</li>
        <li id="li3">333333</li>
        <li>444444</li>
    </ul>
    <script>
        var ul = document.getElementById("ul");
        var lis = ul.children;
        ul.appendChild(lis[2]);
    </script>
    </body>
    </html>

      这段代码在页面中打印的结果为

     

      我们可以看到,原本应该是333333的位置变成了444444,而333333却到了最后。这是因为appendChild()这个实际上是剪切一个元素。也就是说,在执行的过程中,appendChild()方法先把第三个li剪切了一份,然后再放到了ul的最后。要使得他不被剪切的方法就是先复制一份,然后再加到ul的最后。也就是:

    ul.appendChild(lis[2].cloneNode(true));

      这样,我们就实现了复制一次第三行代码,然后把他追加到了ul的最后。

      不过这种方法有他的局限性,那就是我们只能把剪切下来的元素放到最后一个位置,而不能放到任意位置。这时候,我们就要用到另一个方法了,就是insertBefore();这个方法有两个参数,第一个参数是用来控制要插入的内容的,而第二个参数则是用来控制要插入的位置的。

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
    <ul id="list">
        <li>111111</li>
        <li>222222</li>
        <li>333333</li>
        <li>444444</li>
    </ul>
    <script>
        var ul = document.getElementById("list");
        var lis = ul.children;
        var n1 = lis[2];
        ul.insertBefore(n1, lis[0]);
    </script>
    </body>
    </html>

      这段代码在页面中的输出结果为

     

      我们可以看到,跟appendChild一样,他也是把节点直接剪切到了第一个元素前面。所以,要解决这个问题就只能让元素先克隆一份,然后在追加到ul的最前面。也就是改变n1的值。

    var n1 = lis[2].cloneNode(true);

      这样,我们就能实现元素添加到任意位置了。

      好了,解决了之前遗留的问题,接下来就可以说说其他的知识了。DOM除了可以获取和改变页面中的元素之外,还可以动态的创建元素,而且在创建了元素之后,还可以动态的给元素添加属性和方法。其实在我之前的文章中,就已经有涉及到过一些动态创建元素的概念了。document.write();这个方法是直接向页面中输出一句话,不过除了它输出普通的字符串之外,还能输出其他的内容:

    document.write("<input type='text' value='456'>");

      这句话在页面打印的结果为一个值为456input输入框。因为在解析的时候,页面自动把这句话进行了转译,解析成了一个input标签,所以我们才能在页面上看到一个文本框。

    除了document.write()之外,我们还可以用innerHTML的方式给页面添加元素。

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
    <div id="d"></div>
    <script>
        var d = document.getElementById("d");
            for (var i = 0; i < 10; i++) {
                d.innerHTML += "<input type='text' value='123'><br/>"; 
        }
    </script>
    </body>
    </html>

    上述代码在页面中循环打印了是个input标签。我们在开发人员工具中查看页面结构

     

      从上图我们可以看到,这些input标签都被放在idd的这个div下面了,它作用的原理跟document.write()相同,都是把d.innerHTML的内容转译成了html的标签。使它能在页面中打印出来。

      除了上述两种动态创建元素的方法外,DOM还给我们提供了内置的方法来动态的创建元素。document.createElement(),这个方法直译过来就是在文档中创建元素,所以看着这么一串其实记忆起来并不难,它的作用是在内存中生成一对标签。既然是生在内存中,我们就要用一个变量去接收他

    var ul = document.createElement("ul");

      在这里,我动态的生成了一个ul标签,括号直接填写要生成的标签的标签名就好了,并用双引号引起来,然后把他赋给一个变量。这样,我们就动态的生成了一个ul标签。生成了之后要怎么把他添加到页面中呢?这时候,就要用到appendChild方法了。下面是一个完整的例子:

    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
    <div id="d"></div>
    <script>
        var ul = document.createElement("ul"); 
        var li1 = document.createElement("li");
        var li2 = document.createElement("li");
        var d = document.getElementById("d");
        d.appendChild(ul);  
    
        ul.appendChild(li1);
        ul.appendChild(li2);
        li1.innerHTML = "这是动态创建的元素";
        li2.innerHTML = "这是动态创建的元素";
    </script>
    </body>
    </html>

      上述例子中,我动态的生成了一个ul标签,两个li标签,然后把ul标签剪切到了idddiv盒子的末尾。在把两个li标签添加到了ul中。最后再给两个li标签设置了内容。这段代码,在页面中打印的结果为

     

      我们在来看看它的页面结构

     

      在页面中,也动态的生成了ul标签和li标签,这样,动态的创建元素就完成了。

  • 相关阅读:
    【log】AOP配置日志
    【AOP】【log】Spring AOP 完成日志记录
    【java】staitc
    【spring】Spring3注释装配的最佳实践持久层
    【LDA】lda模型和java代码
    【tomcat】tomcat使用jndi,hibernate自动生成的DAO类用了jndi
    【spring】Spring基于 Annotation 的简单介绍
    【bayes】贝叶斯学派和频率学派
    【phi】balance
    【spring】【log】spring mvc 中使用log4j
  • 原文地址:https://www.cnblogs.com/wqc5730/p/5755548.html
Copyright © 2011-2022 走看看