JS基础-DOM

作者: 壹枕星河 | 来源:发表于2019-02-28 15:10 被阅读10次
    DOM(Document Object Model 文档对象模型)

    DOM定义了表示和修改文档所需的对象、行为和属性,以及这些对象之间的关系。

    获取DOM节点

    1、 document.getElementById(id名)

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

    2、getElementsByTagName(标签名)
    得到的是一个集合(不止一个,是一堆)

    var aLi = document.getElementsByTagName("li");
    

    3、getElementsByName( ) 通过Name值获取元素,返回值是集合,通常用来获取有name的input的值;
    注:1不是所有的标签都有name值;
    2低版本的浏览器会有兼容问题;

    var input = document.getElementsByName("input");
    

    4、 children属性,获得DOM元素的所有子元素;返回值是集合

    var aLi = ul.children;
            console.log(aLi);
    

    5、parentNode属性,获得DOM元素的父级元素

    console.log(ul.parentNode);
    

    6、getElementsByClassName(class名称)
    但是:IE8以下不能用

    var input = document.getElementsByName("input");
            console.log(input);
    

    7、ES5选择器:
    document.querySelector () > 一旦匹配成功一个元素,就不往后匹配了

    console.log(document.querySelector("#ul"));
    

    document.querySelectorAll () >>>> 强大到超乎想象;匹配到所有满足的元素, 支持IE8+

    console.log(document.querySelectorAll(".li"));
    
    属性获取和操作

    1、getAttribute( )获取元素的属性值,他是节点的方法!所以前缀必须是节点!
    document.getElementById( ID值 ).getAttribute( )

    什么是元素属性呢? class就是元素属性,写在标签内的所有东西都是标签属性, 比如link的href比如img的src....都是元素属性。
    元素自带的属性可以直接用 . 语法获取,但是自定义属性需要 getAttribute() 和 setAttribute( ) 方法

    var div = document.querySelector("div");
            console.log(div);
            console.log(div.className);
            div.setAttribute("date-ddd", 123);
            console.log(div.getAttribute("date-ddd"));
    

    2、setAttribute( )设置元素的属性。同上;
    有些小小的兼容性问题,低版本IE不兼容;
    设置的属性永远都是字符串类型

    div.setAttribute("date-ddd", 123);
    

    3、removeAttribute( )删除属性;同上;
    兼容性问题同上;

    div. removeAttribute("date-ddd", 123);
    
    DOM元素类型(元素、文本和属性)
     nodeObj.nodeName // 节点名称  
    /*
        元素节点:标签名(大写)
    
        属性节点:属性名称
    
        文本节点:#text
    */
    nodeObj.nodeType // 1 ==> 元素节点  2 ==> 属性节点  3 ==> 文本节点
    
    console.log(div.childNodes[0].nodeType);
    console.log(div.childNodes[0].nodeName);
    
    操作DOM

    创建节点
    var oDiv = document.createElement("div");

    var h1 = document.createElement("h1");
    h1.innerHTML = 2334;
    div.appendChild(h1);
    

    克隆节点
    clonedNode = Node.cloneNode(boolean) // 只有一个参数,传入一个布尔值,true表示深客隆,复制该节点下的所有子节点;false表示浅克隆,只复制该节点

    var hh = h1.cloneNode(true);
            div.appendChild(hh);
    

    插入节点
    parentNode.appendChild(childNode); // 将新节点追加到子节点列表的末尾
    parentNode.insertBefore(newNode, targetNode); //将newNode插入targetNode之前

    div.appendChild(h1);
    div.insertBefore(hhh,span);
    

    替换节点
    parentNode.replaceChild(newNode, targetNode); //使用newNode替换targetNode

    div.replaceChild(span,hhh);
    

    移除节点
    parentNode.removeChild(childNode); // 移除目标节点
    node.parentNode.removeChild(node); //在不清楚父节点的情况下使用
    childNode.remove() //IE不支持

    div.removeChild(hh);   
    h1.parentNode.removeChild(h1);
    span.remove
    
    文档碎片
    <script>
                var ul = document.querySelector("ul");
                var cache = document.createDocumentFragment();
                for(var i = 0; i < 20; i++){
                    var li = document.createElement("li");
                    li.className = "box";
                    li.innerHTML = i;
                    cache.appendChild(li);
                    
                }
                ul.appendChild(cache);
            </script>
    
    node节点(更详细的获取(设置)页面中所有的内容)

    根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点:
    元素是节点的别称,节点包含元素当然节点还有好多细化的种类
    根节点:root>>>>HTML没有父节点;
    节点操作(通过父子系关系)
    childNodes 获取当前元素的所有子节点;
    nodeType 节点种类,返回值是数字;
    nodeValue 获取(文字)节点的文本内容;
    nodeName 返回node节点名称(#text,注释, 标签....);


    nodetype.png
    <ul>
            qwwertrt
            <li class="li" id="li" date-index="1"><a>hhbb</a></li>
            <li>zxxc</li>
        </ul>
        <script>
            var ul = document.querySelector("ul");
            console.log(ul.childNodes);//查找获取当前元素的所有子节点
            console.log(ul.childNodes[0].nodeValue);//文本有nodevalue
            console.log(ul.childNodes[1].nodeValue);//null 元素节点的nodevalue为空
            console.log(ul.childNodes[1].innerHTML);//<a>hhbb</a> innerHTML会将标签解析
            console.log(ul.childNodes[1].innerText);//hhbb 只输出文本
            ul.childNodes[1].innerHTML = "<a>123</a>";
            ul.childNodes[1].innerText = "<a>345</a>";//<a>345</a> 不会解析标签
            console.log(ul.childNodes[1].outerHTML);//<li class="li" id="li" date-index="1">&lt;a&gt;345&lt;/a&gt;</li>
            console.log(ul.childNodes[1].attributes);//获取所有,该节点的属性信息
            console.log(ul.childNodes[1].attributes[0]);//返回属性节点个数
            console.log(ul.childNodes[1].attributes["id"]);//返回属性为 id 的节点
        </script>
    

    innerHTML会将标签解析;
    nodeValue不会进行解析,会将标签名转译成字符串,直接输出.

    attributes属性
     var oBox = document.getElementById('box');
    
            console.log(oBox.attributes)//获取所有,该节点的属性信息;
            console.log(oBox.attributes.length);//返回属性节点个数
            console.log(oBox.attributes[0]);//返回第一个属性节点
            console.log(oBox.attributes[0].nodeType);//2,属性
            console.log(oBox.attributes[0].nodeValue);//属性值
            console.log(oBox.attributes['id']);                              //返回属性为 id 的节点
            console.log(oBox.attributes.getNamedItem('id'));// 获取 id 的节点;
    
            attributes属性 一般只用作获取,设置使用setAttribute()
    
     childNodes 获取当前元素节点的所有子节点
    
    firstChild 获取当前元素节点的第一个子节点
    
    lastChild 获取当前元素节点的最后一个子节点
    
    previousSibling 获取当前节点的前一个同级节点
    
    nextSibling 获取当前节点的后一个同级节点
           ****以上五中方法都包含空白文本节点
    
    firstElementChild   获取当前元素节点的第一个元素子节点
    
    lastElementChild  获取当前元素节点的最后一个元素子节点
    
    ownerDocument 获取该节点的文档根节点,相当与 document
    
    parentNode 获取当前节点的父元素
    
    <ul>
                rgdtfre
                <li class="li" id="li" data-index="1"><a>dgrsdc</a></li>
                <li>dgrsdc</li>
            </ul>
            <script>
                var ul = document.querySelector("ul");
                
                console.log(ul.childNodes);// 获取当前元素节点的所有子节点
    
                console.log(ul.firstChild);// 获取当前元素节点的第一个子节点
    
                console.log(ul.lastChild);// 获取当前元素节点的最后一个子节点
    
                console.log(ul.firstElementChild);//  获取当前元素节点的第一个元素子节点
    
    
                console.log(ul.lastElementChild);// 获取当前元素节点的最后一个元素子节点
    
    
                console.log(ul.lastElementChild.previousSibling); 获取当前元素节点的最后一个元素子节点的前一个同级节点
    
                console.log(ul.lastElementChild.previousElementSibling);获取当前元素节点的最后一个元素子节点的后一个同级节点
            </script>
    
    ++DOM尺寸和位置

    DOM尺寸


    DOM尺寸.png
    • 获取非行内样式(兼容问题)
     function getStyle(obj,attr){    //获取非行间样式,obj是对象,attr是值
          if(obj.currentStyle){   //针对ie获取非行间样式
                return obj.currentStyle[attr];
          }else{
                return getComputedStyle(obj,false)[attr];   //针对非ie
          };
    };
    
    位置坐标
    位置坐标.png
    offsetParent 这个属性的返回值是它根据谁定位的,如果它的所有父元素都没有定位,那么返回body.
    案例:
    1.位置移动动画
    <body>
            <div style="width: 200px;height: 200px;background: red;position: absolute;">box</div>
            <script>
                var div = document.querySelector("div");
                div.onclick = function(){
                    var timer = setInterval(function(){
                        div.style.left = div.offsetLeft + 9 + "px";
                        if(div.offsetLeft >= 500){
                            clearInterval(timer);
                            div.style.left = "500px";
                        }
                    },30);
                }
            </script>
        </body>
    

    2.全选和反选

    <body>
            全选:<input type="checkbox" id="checkAll">
            <div id="content">
                <input type="checkbox">
                <input type="checkbox">
                <input type="checkbox">
                <input type="checkbox">
            </div>
            <script>
                var checkAll = document.querySelector("#checkAll");
                var aCheck = document.querySelector("#content").children;
                var n = 0;
                checkAll.onchange = function(){
                    //console.log(checkAll.checked);
                    n = checkAll.checked ? aCheck.length : 0;
                    
                    for(var i = 0; i < aCheck.length; i++){
                        aCheck[i].checked = checkAll.checked;
                    }
                }
                
                for(var j = 0; j < aCheck.length; j++){
                    aCheck[j].onchange = function(){
                        
                        /* if(this.checked) n++;
                        else n--; */
                        this.checked ? n++ : n--;
                        /* if(n === aCheck.length) checkAll.checked = true;
                        else checkAll.checked = false; */
                        
                        checkAll.checked = n === aCheck.length;
                    }
                }
                
            </script>
        </body>
    

    3.tab选项卡

    <html>
        <head>
            <meta charset="UTF-8">
            <title></title>
            <style>
                *{margin: 0 ;padding: 0;}
                .tab{width: 500px;height: 300px;margin: 20px auto 0;}
                .tab ul{border: 1px solid #ccc;height: 32px;}
                .tab li{width: 33%;height: 30px;list-style: none;float: left; line-height: 30px;text-align: center;font-size: 18px;}
                .tab li.ac{background: #ccc;}
                .tab img{width: 500px;height: 269px;display: none;}
                .tab img.ac{display: inline-block;}
            </style>
            <script src="jquery-1.11.3.js"></script>
        </head>
        <body>
            <div id="tab" class="tab">
                <ul>
                    <li class="ac">item1</li>
                    <li>item2</li>
                    <li>item3</li>
                </ul>
                <div id="content">
                    <img class="ac" src="http://5b0988e595225.cdn.sohucs.com/images/20170729/8dec04ede4894f978ab2b59ff1144699.jpeg" />
                    <img src="http://5b0988e595225.cdn.sohucs.com/q_70,c_zoom,w_640/images/20180726/1a5259dd8b1a42f9b435fa3ea9043cc9.jpeg" />
                    <img src="http://5b0988e595225.cdn.sohucs.com/images/20180401/90674fc5bf9a4ae7bd4d8c424a09c917.jpeg" />
                </div>
            </div>
            <script>
            var aLi = document.querySelector("ul").children;
            var aImg = document.querySelector("#content").children;
            
            for(var i = 0; i < aLi.length; i++){
                aLi[i].index = i;
                aLi[i].onclick = function(){
                    //先全部清空,再给自己加上ac
                    for(var j = 0; j < aLi.length; j++){
                        aLi[j].className = "";
                        aImg[j].className = "";
                    }
                    this.className = "ac";
                    
                    aImg[this.index].className = "ac";
                }
            }
            </script>
        </body>
    </html>
    

    相关文章

      网友评论

        本文标题:JS基础-DOM

        本文链接:https://www.haomeiwen.com/subject/hqohuqtx.html