DOM之节点操作

 一、节点操作

  1. html元素和body元素

    document.documentElement来获取html元素,document.head来获取头部元素,document.body来获取body元素。

  2、获取父节点

  方法:元素.parentNode 得到已知节点父节点

  每个节点都有一个parentNode属性,这个属性指向文档树中的父节点。对于一个节点来说,它的父节点只能是三种类型element节点,document节点,documentFragment节点,如果不存在的话,返回null。属性节点是没有父节点的。

  3、获取子节点

  方法:元素.childNodes 得到已知节点的所有子节点

  childNodes元素身上第一层子节点,是一个类数组对象NodeList,它保存着这个节点的第一层子节点。children是一个类数组对象HTMLCollection对象,它保存的是这个节点的第一层元素子节点。父级.children获取到父级下的第一层子元素,每个子元素都有一个对应的下标,它还有一个length属性,代表着子元素的个数。childElementCount返回子元素的节点的个数,相当于children.length。firstChild第一个子节点,lastChild最后一个子节点。

  4、查找节点

  方法:元素.firstChild 获取第一个子节点;元素.firstElementChild获取第一个元素节点;元素.lastChild获取最后一个子节点;元素.lastElementChild 获取最后一个元素节点;

<body>
    <div id="box">
        <li><span>隐藏1</span></li>
        <li><span>隐藏2</span></li>
        <li><span>隐藏3</span></li>
    </div>
    <script>
        var box = document.getElementById('box');
        var lis = document.querySelectorAll('li');
        var spans = document.querySelectorAll('span');

        console.log(box.parentNode); //body
        console.log(document.body.parentNode); //html
        console.log(document.parentNode) / null


        console.log(box.childNodes); //NodeList(7) [text, li, text, li, text, li, text]
        console.log(box.children) //HTMLCollection(3) [li, li, li]
        console.log(box.tagName == box.nodeName) //true tagName标签名称,只有元素节点才有这个属性

        //点击隐藏父节点
        for (var i = 0; i < spans.length; i++) {
            spans[i].onclick = function () {
                this.parentNode.style.display = 'none';
            }
        }
    </script>
</body>

  5、获取相邻节点

  方法:元素.nextSibling已知节点后一个节点;元素.previousSibling已知节点前一个节点。

<body>
    <div id="box">
        <li><span>green</span></li>
        <li><span>pink</span></li>
        <li><span>blue</span></li>
        <li><span>yellow</span></li>
    </div>
    <script>
        var box = document.getElementById('box');
        var lis = document.querySelectorAll('li');
        var spans = document.querySelectorAll('span');

        lis[2].previousElementSibling.style.background = 'pink';
        console.log(lis[0].previousElementSibling) //null
        //用法:父级.firstElementChild
        box.firstElementChild.style.background = 'green';
        box.lastElementChild.style.background = 'yellow';
    </script>
</body>

  元素.offsetParent获取离元素最近的有定位的父级(body是没有offsetParent)、元素.offsetLeft找到元素最左边离有定位的父级之间的距离不带单位且不带边框、元素.offsetTop找到元素最上边离有定位的父级之间的距离,不带单位,且不带边框(如果没有定位的父级,那默认是到html的距离,所以要遵循一个原则,给父级定位或者是把清除默认样式)。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
    <style>
        body {margin: 0;}
        .text strong {color: red;cursor: pointer;}
        #tips {position: absolute;display: none;background: white;}
    </style>
</head>
<body>
    <div class="text">
        前端开发是创建Web页面或app等前端界面呈现给用户的过程,通过<strong>HTML</strong>,<strong>CSS</strong>及<strong>JavaScript</strong>
        以及衍生出来的各种技术、框架、解决方案,来实现互联网产品的用户界面交互。
    </div>
    <div id="tips"></div>
    <script>
        var strongs=document.querySelectorAll('strong');
        var tips=document.getElementById('tips');
        var arr = [
                'HTML称为超文本标记语言,是一种标识性的语言。',
                '层叠样式表。',
                'JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。'
            ];
            for (var i = 0; i < strongs.length; i++) {
                strongs[i].index = i;
                strongs[i].onmouseover = function () {
                    tips.style.display = 'block';   //显示
                    tips.innerHTML = arr[this.index];

                    tips.style.left = this.offsetLeft + 'px';
                    tips.style.top = this.offsetTop + 30 + 'px';
                }
                strongs[i].onmouseout = function () {
                    tips.style.display = 'none';    //隐藏
                }
            }
    </script>
</body>
</html>

  6、创建节点

  方法:document.createElement() 创造一个节点;document.createTextNode()  创建文本节点

  document.createElement(tagName)通过标签名的形式来创建一个元素,这个方法接受一个参数,即要创建元素的标签名。返回创建的标签元素,需要注意的是只能用来创建元素节点,不能创建文本注释节点。createElement前面的主语只能是document。

  7、添加节点

  方法:parentNode.appendElement(childNode) 给一个父节点添加一个子节点;parentNode.insertBefore(childNode1,childNode2) 在某个节点前插入节点

  parentNode.appendElement(childNode)方法用于向childNodes列表的末尾添加一个节点,并还回新增的节点。只能添加标签节点不能添加其它节点。  

  parentNode.insertBefore(newNode,referenceNode)插入节点,把newNode插入到referenceNode的前面。这两个参数要同时存在不然会报错。如果第二个参数为null或者是undefined,insertBefore的作用相当于appendChild。返回要插入的那个元素(newNode)。如果插入的节点已经是文档的一部分,那结果就是将这个节点从原来的位置转移到新的位置。

 <input type="button" id="btn" value="创建元素">
    <script>
        var btn = document.getElementById('btn1');
        btn.onclick = function () {
            var p = document.createElement('p');  //创建一个p标签
            p.innerHTML = '这里是一段文字';
            console.log(p);//<p>这里是一段文字</p>
            var appendNode = document.body.appendChild(p);//给页面添加p标签
        }
    </script>
  <ul class="list" id="list">
        <li>1</li>
        <li >2</li>
        <li >3</li>
    </ul>
    <script>
        var ul = document.getElementById('list');
        var li = document.createElement('li');
        li.style.background='red';
        ul.insertBefore(li, null);
        var num = -1;
        var max = ul.children.length;
        function fn() {
            num++;
            ul.insertBefore(li, ul.getElementsByTagName('li')[num]);
            if (num == max) {
                num = -1;
            }
            if (num == 0) {
                num = 1;
            }
            setTimeout(fn, 1000);
        }
        setTimeout(fn, 1000);
    </script>

  8、删除节点

  方法:parentNode.removeChild(childNode)方法用于从父级中移除指定元素。参数为要删除的那个元素,返回被删除的那个元素。

  方法:remove()删除节点,这个方法不调用父节点,直接在当前节点使用remove()方法就可以删除这个节点,无返回值。

<button id="btn">删除节点</button>
    <ul>
        <li >1</li>
        <li >2</li>
        <li >3</li>     
    </ul>
    <script>
    var ul = document.querySelector('ul');
    var btn=document.getElementById('btn');
    function fn(){
        //获取oList中子元素的个数
        var len = ul.getElementsByTagName('li').length;
        //如果长度不为0
        if(len){
            //删除最后一个子元素
            ul.removeChild(ul.getElementsByTagName('li')[len-1]);
            //再次调用计时器
            setTimeout(fn,1000);    
        }
    }
    btn.onclick = function(){
        //1s后执行函数incrementNumber
        setTimeout(fn,1000);    
    }
    </script>
 <div id="box">123</div>
    <script>
        //console.log(box.childNodes[0]) //'123'
        console.log(box.childNodes[0].remove()) //undefined
        console.log(box.childNodes[0]) //undefined
    </script>

  9、复制节点

  方法:要克隆的节点.cloneNode(boolean)克隆一个节点。参数为true时克隆元素和元素所包含的子孙节点,false克隆元素不包含子孙节点,当没有写参数时,默认为false。返回被克隆节点。注意的是克隆只克隆html、css,js是不会克隆,如果克隆元素身上有js的功能,那克隆后的元素是不具备的。如果克隆的元素本身有id,那克隆后的元素也会有id,两个一样,这样不符合标准,我们需要手动修改id

<ul id="list">
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>
    <script>
        var ul = document.getElementById('list');
        ul.index = 0;
        var deepList = ul.cloneNode(true);
        //成功复制了子节点
        console.log(deepList.children.length);//3
        //但并没有复制属性
        console.log(deepList.index);//undefined
        var shallowList = ul.cloneNode();
        //浅复制不复制子节点
        console.log(shallowList.children.length);//0
    </script>

  10、替换节点

   parentNode.replaceChild(newNode,oldNode)方法用第一个参数替换第二个参数。newNode,oldNode分别是要替换的元素,被替换的元素,这两个参数要同时出现不然会报错。如果用父级里的元素去替换另一个元素,替换的那个元素会跑到被替换的位置,被替换的那个元素会被删除。

 <input type="button" id="btn" value="替换">
    <ul>
        <li>a</li>
        <li>b</li>
        <li>c</li>
        <li>d</li>
    </ul>
    <script>
        window.onload = function () {
            var btn = document.getElementById('btn');
            var ul = document.querySelector('ul');
            var lis = document.querySelectorAll('li');

            btn.onclick = function () {
                ul.replaceChild(lis[3], lis[0]);
            }
        }
    </script>

  appendChild/insertBefore/replaceChild在操作一个已有的元素时,是将已有元素移动,而不是复制一份进行操作(剪切)

  二、属性操作

  1. 创建属性

  方法:document.createAttribute() 对某个节点创建属性,还可以添加属性的值。

    <div></div>
    <script>
        var att=document.createAttribute('id');
        att.value="box";
        document.getElementsByTagName('div')[0].setAttributeNode(att);
    </script>

  方法:元素.getAttribute(属性名)通过属性名称获取某个节点属性的值,如果参数是一个src或者是href那它取到的结果就是引号里面的值(相对地址)。它取不到js的自定义属性,但是它可以取到html标签的自定义属性。

  方法:元素.setAttribute(attr,value)方法设置属性,这里面的两个参数必须同时出现,可以设置自定义属性,也可以设置系统中的属性。

  方法:元素.removeAttribute(属性名)删除属性。

    <div id="box" n="davina" class="color" data-v="davina" style="100px;">
        <img id="pic" src="image/1.jpg" />
    </div>
    <script>
        var box = document.getElementById('box');
        var pic = document.getElementById('pic');
        console.log(box.getAttribute('id'));  //box
        //它取不到js自定义的属性
        box.index = 1;
        console.log(box.getAttribute('index')); //null
        //它可以取到html标签自定义属性
        console.log(box.getAttribute('n')); //davina
        console.log(box.dataset.v);//davina h5新增的,注意要以dat-开始

        //setAttribute
        box.setAttribute('id', 'box2');
        //removeAttribute
        box.removeAttribute('style');
        console.log(box); 
    </script>

   留言板例子

    <style>
        div { 300px;height: 200px; border: 1px solid black;}
    </style>
    <input type="text" class="text">
    <input type="button" id="btn" value="提交">
    <div class="box"></div>
    <script>
        var text = document.getElementsByClassName('text');
        var btn = document.getElementById('btn');
        var box = document.querySelector('div');
        btn.onclick = function () {
            var val = text[0].value;
            //方法1:拼接字符串
            //box.innerHTML+='<span>'+val+'</span>';
            //方法2:用属性操作
            var span = document.createElement('span');
            span.innerHTML = val;
            box.appendChild(span);
            /*innerHTML和DOM的区别:
                innerHTML:它会把原来的内容清空,然后添加新的内容,添加的时候原来的内容已经没有了,只不过是新添加的内容与原来的内容长的一样
                DOM:会把新的内容追加到原来的内容里面,原来的内容所具有的事件依然会存在
           内容有无js事件如果有的话用DOM*/
        }
    </script>

   

 

原文地址:https://www.cnblogs.com/davina123/p/12532548.html