Go to comments

JavaScript DOM课后作业

课后作业

1、封装函数insertAfter()功能类似insertBefore();

系统提供了insertBefore()方法,想实现一个系统没提供insertAfter()功能。

之前可以把"p"标签放到"b"标签前面,可以用insertAfter(p, b)方法,现在把"p"标签插入到"b"标签后面,没有直接的方法可以间接的实现,

"b"标签的后面就是"span"标签的前面,找到下一个兄弟元素节点,放到下一个兄弟元素节点的insertAfter(p, span)就实现了insertAfter功能

<p></p>

<div>
    <i></i>
    <b></b>
    <span></span>
</div>

现在要把"p"标签插入到"i"标签后面,就等于插入到"b"标签前面,插入到"b"标签前面有insertBefore方法,这是一个同等转化的问题。

同等转化不能解决所有的问题,比如把p标签插入到span标签后面呢,找不到是什么标签的前面了,这种情况怎么解决?插入到最后一位用appendChild()方法,只要判断一下插入的位置是不是最后一位就OK。

insertAfter方法要到父级上找这个方法,所以写到原型链上。

<div>
    <i></i>
    <b></b>
    <span></span>
</div>

<script>

    Element.prototype.insertAfter = function (targetNode ,afterNode) {

        var beforeNode = afterNode.nextElementSibling; // 比如,在b标签后面插入,要把span求出来
        this.insertBefore(targetNode, beforeNode);  // 把p标签插入到b标签后面
    }

    var div = document.getElementsByTagName('div')[0];
    var p = document.createElement('p');
    var b = document.getElementsByTagName('b')[0];

    div.insertAfter(p, b); // 第一种情况下插入操作完了
    
    /*
    <div>
        <i></i>
        <b></b>
        <p></p>
        <span></span>
    </div>
    */
</script>

第二种情况是beforeNode是null

<div>
    <i></i>
    <b></b>
    <span></span>
</div>

<script>

    Element.prototype.insertAfter = function (targetNode ,afterNode) {

        var beforeNode = afterNode.nextElementSibling;

        if(beforeNode == null){
            this.appendChild(targetNode); // 如果beforeNode是null直接appentChild
        }else{
            this.insertBefore(targetNode, beforeNode); // 如果不是null是第一种情况
        }

    }

    var div = document.getElementsByTagName('div')[0];
    var p = document.createElement('p');
    var b = document.getElementsByTagName('b')[0];
    var span = document.getElementsByTagName('span')[0];

    // div.insertAfter(p, b);
    
    div.insertAfter(p, span);
    /*
    <div>
        <i></i>
        <b></b>
        <span></span>
        <p></p>
    </div>
    */
</script>

要学会在原型链上编程,在原型链上编程最好的一点是,this可以指代任何一个想调用的对象,如果不用this用function封装,this要变成一种参数被传进来,再有可以实现继承,下面的都可以用一劳永逸。

3、将目标节点内部的节点顺序,逆序

<div>
    <i></i>
    <b></b>
    <span></span>
</div>

<script>


/*
<div>
    <i></i>
    <b></b>
    <span></span>
</div>

怎么逆序逆序?

01/
先把b标签剪切到下面
<div>
    <i></i>
    
    <span></span>
    <b></b>
</div>

02/
再把i标签剪切到最下面来,就完成逆序了。怎么实现剪切?用appendChild()方法
<div>
    
    
    <span></span>
    <b></b>
    <i></i>
</div>



-----------------------------------------



第一次先操作倒数第二个,第二次操作倒数第三个
<div>
    <i></i>

    <span></span>
    <b></b>
</div>

第一次操作倒数第二个把b放到最下面了,这个i还是倒数第三个

<div>
    <i></i>
    
    <span></span>
    <b></b>
</div>

再操作倒数第三个i,放到最下面就ok

<div>
    
    
    <span></span>
    <b></b>
    <i></i>
</div>

写一个for循环转一圈,查好倒数第几个
*/



Leave a comment 0 Comments.

Leave a Reply

换一张