javascript---28--DOM文檔對象模型

節點

  1. 什麼是節點
  • 你好是文本節點
  • <div>元素節點
  • class id value是屬性節點
  • <!--<div>註釋結點</div>-->註釋節點

獲取節點

  1. ele.childNodes獲取元素節點+ 文本節點 但是隻獲取子代不能獲取孫子代
<div id="wrap">
        <div class="position">
            <div id="box">
            你好
            <span>22</span>
            <p>333</p>
            <ul>
                <li>1</li>
                <li>2</li>
                <li>3</li>
            </ul>
            </div>
        </div>
    </div>
<script>
    var oBox =document.getElementById("box");
    console.dir(oBox);
</script>

結果childNodes:NodeList(7) 有七個 其中text有的代表是空格

  1. ele.child只獲取元素節點 但是隻獲取子代不能獲取孫子代
console.dir(oBox.children);

HTMLCollection(3)0: span1: p2: ullength: 3__proto__: HTMLCollection

  1. firstChild只獲取第一個節點 包括文本節點(空格)和註釋節點空格
console.dir(oBox.firstChild);

結果#text

  1. firstElementChild獲取第一個元素節點
console.dir(oBox.firstElementChild);

結果是span

  1. lastChild只獲取最後一個節點
console.dir(oBox.lastChild);

結果#text

  1. lastElementChild獲取最後一個元素節點
console.dir(oBox.lastElementChild);

結果ul

獲取兄弟節點

  1. nextSibling獲取到的是下一個兄弟節點 不換行就是空格
var oSpan =document.getElementsByTagName("span")[0];
    console.dir(oSpan.nextSibling);

結果#text

  1. nextElementSibling獲取兄弟元素節點
console.dir(oSpan.nextElementSibling);

結果是p

console.dir(oSpan.nextElementSibling.nextElementSibling);

結果是ul 可以組合使用

3.previousSibling 獲取上一個兄弟節點 包括文本和註釋節點

console.dir(oSpan.previousSibling);

結果#text

  1. previousElementSibling獲取上一個兄弟元素節點
console.dir(oSpan.previousElementSibling);

結果返回null

獲取父節點

  1. parentNode 獲取父節點
console.dir(oSpan.parentNode);

結果是div#box 2.獲取父節點的兄弟節點

<div id="wrap">
        <div class="position">
            <div id="box">你好
            <span>22</span>
            <p>333</p>
            <ul>
                <li>1</li>
                <li>2</li>
                <li>3</li>
            </ul>
            </div>
            <div id="main"></div>
        </div>
    </div>
    var oSpan =document.getElementsByTagName("span")[0];
console.dir(oSpan.parentElement.nextElementSibling);

結果div#main

  1. 獲取定位父級節點offsetParent) 如果父級沒有定位或者自己沒有定位找的是body
#wrap{
            position: relative;
        }
        #box{
            position: absolute;
        }
 var oBox =document.getElementById("box");
    console.dir(oBox.offsetParent);

結果是div#wrap

獲取子元素的數量

1.childElementCount獲取子元素的個數 孫元素不算

console.log(oBox.childElementCount);

結果爲3

刪除節點

  1. removeChild(節點屬性) 只能從父級開始刪除 不能自己刪除自己

創建節點

  1. createElement 創建元素節點 創建完節點可以直接進行dom操作
  2. appendChild 添加節點 只能從父級節點開始添加 在最後添加節點
<body>
    <div id="wrap">
        <div class="position">
            <div id="box">你好
            <span>22</span>
            <p>333</p>
            <ul>
                <li>1</li>
                <li>2</li>
                <li>3</li>
            </ul>
            </div>
            <div id="main"></div>
            </div>
        </div>
    </div>
</body>
<script>
    var oBox =document.getElementById("box");
    var oP =document.createElement("p");
    oP.innerHTML ="我是一個p";
    oP.onclick = function(){
        alert(1);
    }
    oBox.appendChild(oP)
</script>
  1. 創建文本節點 createTextNode
var text = document.createTextNode("我很好");
 oBox.appendChild(text);

與oBox.innerHTML +="我很好";效果一樣但是這樣做 之前綁定的事件會失效

  1. 替換節點replaceChild 前面(第一個)是新的元素,後面是舊節點
var oBox =document.getElementById("box");
    var oSpan =document.getElementsByTagName("span")[0];
    var oSpan2 =document.createElement("span");
    oSpan2.innerHTML ="我是新的";
    oBox.replaceChild(oSpan2,oSpan);

這樣22就替換成我是新的

  1. 添加節點但是不替換insertBefore 第一個是插入的新元素,後面是那個節點(前添加節點)
var oBox =document.getElementById("box");
    var oSpan =document.getElementsByTagName("span")[0];
    var oSpan2 =document.createElement("span");
    oSpan2.innerHTML ="我是新的";
    oBox.insertBefore(oSpan2,oSpan);

在22前面我是新的

  1. 克隆節點 cloneNode() 克隆只克隆元素本身還有元素節點,不會克隆事件 括號裏可以接受一個布爾類型,true就是克隆子孫元素
<body>
    <div id="wrap">
    <div class="box">nnn</div>
    </div>
</body>
<script>
    var oBox =document.getElementsByClassName("box")[0];
    oBox.onclick =function () {
        alert(1);
    }
    var oBox2 =oBox.cloneNode();
    oBox2.innerHTML ="我是克隆";
    wrap.appendChild(oBox2)

結果只有點擊nn纔會有彈窗,點擊“我是克隆”沒有彈窗

<body>
    <div id="wrap">
    <div class="box">nnn
        <h2>子孫</h2>
    </div>
    </div>
</body>
<script>
    var oBox =document.getElementsByClassName("box")[0];
    oBox.onclick =function () {
        alert(1);
    }
    var oBox2 =oBox.cloneNode(true);
    wrap.appendChild(oBox2)

結果是nnn 子孫 nnn 子孫 內容複製

清除空隙

  1. 浮動或變塊
  2. 父級字體font-size爲0
  3. 加註釋
  4. 刪除子代文本節點
<style>
       p{
           display: inline-block;
           width: 100px;
           height: 100px;
           background-color: #ff6666;
       }
    </style>
</head>
<body>
    <p>111</p>
    <p>222</p>
</body>
 var oDiv =document.getElementsByTagName("body")[0];
    for (var i=0;i<oDiv.childNodes.length;;i++){
        if (oDiv.childNodes[i].nodeName==="#text"){
            oDiv.removeChild(oDiv.childNodes[i]);//長度會變childNodes.length;
        }
    }

這樣就刪除空格

節點屬性

  1. getAttribute(節點名稱) 返回的是值
<body>
   <div class="box"></div>
</body>
<script>
   var oBox =document.getElementsByClassName("box")[0];
   console.log(oBox.getAttribute("class"))

結果是box

  1. 返回節點對象getAttributeNode
var oBox =document.getElementsByClassName("box")[0];
   console.dir(oBox.getAttributeNode("class"))
  1. 設置節點屬性setAttribute setAttributeNode
oBox.setAttribute("name","hu");

就會添加節點名稱

var oBox =document.getElementsByClassName("box")[0];
   var attr =document.createAttribute("index");//創建節點對象
   attr.value =1;//賦值
   oBox.setAttributeNode(attr);

就會添加節點屬性index=1

var oBox =document.getElementsByClassName("box")[0];
   var attr =document.createAttribute("index");
   attr.value =1;
   oBox.setAttributeNode(attr);
  console.log(oBox.nodeName);

結果是div

var oBox =document.getElementsByClassName("box")[0];
   var attr =document.createAttribute("index");
   attr.value =1;
   oBox.setAttributeNode(attr);
  console.log(attr.nodeName);

結果是index

var oBox =document.getElementsByClassName("box")[0];
   var attr =document.createAttribute("index");
   attr.value =1;
   oBox.setAttributeNode(attr);
  console.log(attr.tagName);

結果是undefined 因爲tagname是元素節點纔有 nodename是所有節點都有

節點類型 nodeType

3 #text 文本節點
8 #comment 註釋節點
1 元素節點(span ul p )
9 文檔節點

  1. 刪除節點屬性removeAttribute
var oBox =document.getElementsByClassName("box")[0];
   oBox.setAttribute("name","hu");
   oBox.removeAttribute("name");

小練習 通過節點是唯一的寫點擊添加菜單

<style>
        div{
            float: left;
            width: 200px;
            min-height: 400px;
            padding: 10px;
            margin: 20px;
            border: 1px solid #000;
            text-align: center;
        }
        div h2{
            border-bottom: 1px solid #000;
        }
        div span{
            display: block;
            height: 30px;
            background-color: #000;
            font-size: 16px;
            color: #fff;
            line-height: 30px;
            cursor: pointer;
        }
        div span +span{
            margin-top: 10px;
        }
        div span:hover{
            opacity: .5;
        }
    </style>
</head>
<body>
        <div id="menue">
            <h2>菜單</h2>
            <span>西紅柿炒雞蛋</span>
            <span>爆炒牛肉</span>
            <span>土豆絲</span>
            <span>肉末豆腐</span>
            <span>魚香肉絲</span>
            <span>水煮肉片</span>
        </div>
       <div id="select">
           <h2>已點</h2>
       </div>
</body>
<script>
    var oMenu =document.getElementById("menue"),
        oSelect =document.getElementById("select"),
        oSpan =document.getElementsByTagName("span");
        for (var i=0;i<oSpan.length;i++){
            oSpan[i].onclick =function () {
                this.selectStatu =!this.selectStatu;//取反,一開始沒有定義是undefined,取反之後變爲真
                if (this.selectStatu){
                    oSelect.appendChild(this);
                } else{
                    oMenu.append(this);
                }
            }
        } 
</script>

通過註釋節點 添加圖片

<body>
    <div id="hidden">

            <!--
            <div class="pic">
                <img src ="1.jpg">
            </div>
            -->
    </div>
    <div id="box"></div>
</body>
<script>
    document.onclick =function () {
        box.innerHTML =hidden.childNodes[1].nodeValue;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章