1. 程式人生 > 實用技巧 >第五模組 WEB開發基礎之DOM

第五模組 WEB開發基礎之DOM

1. 快速認識DOM

<!DOCTYPE html>
<html>
<head>
    <title>DOM</title>
</head>
<body>
    DOM: document object model 文件物件模型
    js中物件分為三種:
    1. 使用者定義物件
    2. 內建物件 array date math
    3. 宿主物件 window

    將dom看做一顆樹.
    dom把文件看作一顆家譜樹.
    在html中, 標籤就是dom物件, 這些dom物件又構成了家譜樹(節點樹).
</body> </html>

2. DOM中節點分類

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>02 節點</title>
</head>
<body>
    <p title="我是mjj" class="" id="">mjj</p>
    <ul>
        <li></li>
    </ul>
    <!-- 節點  node-->
    <!-- 1.元素節點(element node)  2.文字節點 (text node) 3.屬性節點 (attribue node)-->

    <!-- 沒有內容 的文件是沒有任何價值的,而大多數內容都是有文字提供-->
    
</body>
</html>

3. 獲取元素節點物件的方式

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>class list</title>
</head>
<body>
    <h2>你要買什麼課程?</h2>
    <p title='請您選擇購買的課程'>本課程是web全棧課程,期待你的購買!</p>
    <ul id='classList'>
        <li class
='item'>JavaScript</li> <li class='item'>css</li> <li>DOM</li> </ul> <!-- 節點型別: 1.元素節點 2.屬性節點 3.文字節點 --> <script type="text/javascript"> // 1.document.getElementById() 單個物件 var eleNode = document.getElementById('classList'); console.log(eleNode); console.log(typeof eleNode); // 2.document.getElementsByTagName() 獲取出來的是一個節點物件集合 有點像陣列 push() var olis = document.getElementsByTagName('li'); var oTitle = document.getElementsByTagName('h2'); console.log(oTitle[0]); console.log(olis.length); for(var i = 0; i < olis.length; i ++){ console.log(olis[i]); } console.log(typeof olis); // 3.document.getElementsByClassName('item');獲取出來的是一個節點物件集合 var oItems = document.getElementsByClassName('item'); console.log(oItems); </script> </body> </html>

4. setAttribute()和getAttribute()用法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>class list</title>
    <style type="text/css">
        #box{
            color: red;
        }
    </style>
</head>
<body>
    <h2>你要買什麼課程?</h2>
    <p title='請您選擇購買的課程'>本課程是web全棧課程,期待你的購買!</p>
    <ul id='classList'>
        <li class='item'>JavaScript</li>
        <li class='item'>css</li>
        <li>DOM</li>
    </ul>

    <!-- 
     -->
     <script type="text/javascript">
         var oP = document.getElementsByTagName('p')[0];
         // 獲取屬性值 有一個必需的引數,這個節點物件的名字
         var title = oP.getAttribute('title');
         var className  = oP.getAttribute('class');
         console.log(title);
         console.log(className);

         // 設定屬性值  setAttribute(name,value)
         oP.setAttribute('id', 'box');
    // 通過js設定的屬性並不會反映在原始碼中
</script> </body> </html>

5. 節點物件的三個屬性介紹

1. nodeName: 節點的名稱
2. nodeValue: 節點的值
3. nodeType: 節點的型別

1. nodeName屬性: 節點的名稱, 只讀
    1. 元素節點的nodeName與標籤名相同
    2. 屬性節點的nodeName與屬性的名稱相同
    3. 文字節點的nodeName永遠是 #text
    4. 註釋節點的nodeName永遠是 #comment
    5. 文件節點的nodeName永遠是#document

2. nodeValue屬性: 節點的值
    1. 元素節點的nodeValue是undefined或null
    2. 文字節點的nodeValue是文字自身
    3. 屬性節點的nodeValue是屬性的值

3. nodeType屬性: 節點的型別, 只讀(瀏覽器不同, 值可能不同)
    以下常用的幾種節點型別:
    元素型別     節點型別
    元素            1
    屬性            2
    文字            3
    註釋            8
    文件            9

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>節點屬性</title>
</head>
<body>
    <!-- nodeName   nodeValue  nodeType -->
    <div id="box" title="我是文字">我是一個文字節點<!--我是註釋--></div>
    <script type="text/javascript">
        // 1.元素節點
        var oDiv =  document.getElementById('box');
        console.log(oDiv.nodeName + "| " + oDiv.nodeValue + "| " + 
            oDiv.nodeType);

        // 2.獲取屬性節點
        var attrNode = oDiv.attributes[0];
        console.log(attrNode.nodeName + "| " + attrNode.nodeValue + "| " + 
            attrNode.nodeType);
// 3.獲取文字節點 var textNode = oDiv.childNodes[0]; console.log(textNode.nodeName + "| " + textNode.nodeValue + "| " + textNode.nodeType); // 4.獲取註釋節點 var commentNode = oDiv.childNodes[1]; console.log(commentNode.nodeName + "| " + commentNode.nodeValue + "| " + commentNode.nodeType); console.log(document.nodeType); </script> </body> </html>

6. 節點物件的常用屬性

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>節點物件的其它常用屬性</title>
</head>
<body>
    <div class="previous">我是上個兄弟</div>
    <div id="father">
        <p>mjj</p>
        <p>mjj2</p>
    </div>
    <div class="sibling">我是下個兄弟</div>

    <script type="text/javascript">
        var oFather = document.getElementById('father');
        console.log(oFather.childNodes);
        // 在chrome瀏覽器上會獲取到text和p, 其中text指空格,在IE瀏覽器上只能獲取到p.
        // console.log(oFather.childNodes[0]);
        // console.log(oFather.firstChild);
        // console.log(oFather.childNodes[oFather.childNodes.length - 1]);
        // console.log(oFather.lastChild);
        // console.log(oFather.parentNode.parentNode);
        console.log(oFather.nextSibling);
        // console.log(oFather.previousSibling);
     
  
    // 節點物件屬性在各瀏覽器相容性處理 function get_childNodes(fatherNode){ var nodes
= fatherNode.childNodes; var arr = [];//儲存已經獲取的元素節點物件 for(var i = 0; i < nodes.length; i++){ if (nodes[i].nodeType === 1) { arr.push(nodes[i]); } } return arr; } var childnodes = get_childNodes(oFather); console.log(childnodes[0]); function get_nextSibling(n){ var x = n.nextSibling; while(x && x.nodeType != 1){ x = x.nextSibling; } return x; } console.log(get_nextSibling(oFather)); </script> </body> </html>

7. 元素節點物件的增刪改查方法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>07 節點方法</title>
    <style type="text/css">
        .active{
            color: red;
            font-size: 30px;
        }
    </style>
</head>
<body>
    <div id="box">

        <p id="active">mjj</p>

    </div>

    <!-- 
        動態的操作節點
        1.建立節點  createElement()
        2.插入節點 appendChild()
                   insertBefore(newNode,node)
        3.刪除節點 removeChild(childNode)
        4.替換節點 replaceChild(newNode,node)
        5.建立文字節點 createTextNode()
     -->
     <script type="text/javascript">
         var oDiv = document.getElementById('box');
         var oAtive = document.getElementById('active');

         var newNode = document.createElement('p');
         var newNode2 = document.createElement('p');
         var newNode3 = document.createElement('a');

         console.log(newNode === newNode2);// 兩個節點不同

         newNode.innerHTML = '<a href="#">[email protected]</a>';  //渲染標籤, 並插入文字
         newNode2.innerHTML = '<a href="#">[email protected]</a>';
         newNode3.setAttribute('href','http://www.baidu.com');
         newNode3.innerHTML = '百度一下';

         newNode.setAttribute('class', 'active');
         oDiv.appendChild(newNode);
         // 第一個引數是新插入的節點,第二個引數是參考的節點
         oDiv.insertBefore(newNode2,oAtive);

         
         /*
         var textNode = document.createTextNode('alex');
         newNode.appendChild(textNode);
         */
         // newNode = null;//釋放物件, 從記憶體中釋放掉,放在最後

         // oDiv.removeChild(oAtive); 刪除操作
         oDiv.replaceChild(newNode3, oAtive)


         // newNode.innerText = '<a href="#">[email protected]</a>'; 無法渲染標籤, 只是字串
     </script>
</body>
</html>

8. 樣式設定

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>動態操作樣式</title>
    <style type="text/css">
        .highLight{
            background-color: black;
            color: white;
            width: 250px;
            height: 250px;
            line-height: 250px;
            text-align: center;
            font-size: 30px;
        }
    </style>
</head>
<body>
    <p id='box'>MJJ</p>
    <script type="text/javascript">
        // nodeObj.style
        var para = document.getElementById('box');
        /*
        1、直接操作樣式屬性
        console.log(para.style);  //獲取所有屬性, 屬性都採用駝峰體
        para.style.color = 'white';
        para.style.backgroundColor = 'black';
        para.style.width = '250px';
        para.style.height = '250px';
        para.style.textAlign = 'center';
        para.style.lineHeight  = '250px';
        para.style.fontSize  = '30px';
        // 通過這種方式設定的每個屬性都設定成了行內樣式style = 'color:red;'
        */

        // 2、通過控制屬性的類名來控制樣式(推薦使用這種方式)
        para.setAttribute('class', 'highLight');
        
    </script>
</body>
</html>

9. 常用事件

常用事件
onclick      滑鼠單擊事件
onmouseover  滑鼠經過事件
onmouseout   滑鼠移開事件
onchange     文字框內容改變事件(常用於表單事件)
onselect     文字框內容被選中事件(常用於表單事件, 如選中下拉選單中選項)
onfocus      游標聚焦事件(常用於表單事件, input輸入框中插入游標)
onblur       游標失焦事件(常用於表單事件)
onload       網頁載入事件

10. onclick事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>事件</title>
    <style type="text/css">
        #box{
            width: 100px;
            height: 100px;
            background-color: blue;
        }
    </style>
</head>
<body>
     <!-- <div id="box" onclick="add();"></div> -->
     <div id="box" ></div>

     <script type="text/javascript">
         var oDiv = document.getElementById('box');

         var isBlue = true;
         // 方式1: 匿名函式
         oDiv.onclick = function(){
             if (isBlue) {
                 // this 指向了當前的元素節點物件
                 this.style.backgroundColor = 'red';
                 isBlue = false;
             }else{
                this.style.backgroundColor = 'blue';
                 isBlue = true;
             }
         };
         // 方式2: 宣告一個函式, 將函式名賦值給事件(推薦使用這種方式)
         /* var add = function(){
             alert(1111);
         }
         oDiv.onclick = add;*/

         // 方式3: 較繁瑣, 不推薦使用
         /*<div id="box" onclick='add();'></div>
         function add(){
             alert(1111);
         }*/
         
     </script>

</body>
</html>

11. 滑鼠懸浮事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>onmouseover()和onmouseout()事件</title>
    <style type="text/css">
        #box{
            width: 200px;
            height: 200px;
            background-color: red;
        }
    </style>
</head>
<body>
    <div id="box">
    </div>
    <script type="text/javascript">
        // 1.找開關   2.摁一下   3.燈亮了
        // 1.找到觸發的事件物件    
        var oDiv = document.getElementById('box');
        // 2.滑鼠滑過事件  
        oDiv.onmouseover = function(){
            console.log(111);
            // 3.事件處理程式
            this.style.backgroundColor = 'green';
        }
        // 2.滑鼠移開事件  
        oDiv.onmouseout = function(){
            // 3.事件處理程式
            this.style.backgroundColor = 'red';
        }

    </script>
    
</body>
</html>

12. 游標聚焦和失焦事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>游標聚焦和失焦事件</title>
    <style type="text/css">
        .text{
            color: red;
            font-size: 12px;
        }
    </style>
</head>
<body>
    <form action="">
        <p class="name">
            <label for="username">使用者名稱:</label>
            <input type="text" name="user" id="username">

        </p>
        <p class="pwd">
            <label for="pwd">密碼:</label>
            <input type="password" name="wpd" id="pwd">
        </p>
        <input type="submit" name="">
    </form>
    <script type="text/javascript">
        var userName = document.getElementById('username');
        var newNode = document.createElement('span');
        userName.onfocus = function(){
            newNode.innerHTML = '請輸入使用者名稱';
            newNode.setAttribute('class', 'text')
            userName.parentNode.appendChild(newNode);
        }
        userName.onblur = function(){
            newNode.innerHTML = '請輸入正確的使用者名稱';
            newNode.setAttribute('class', 'text')
            userName.parentNode.appendChild(newNode);
        }
    </script>
</body>
</html>

13. 表單控制元件上內容選中和改變事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>內容選中事件和內容改變事件</title>
</head>
<body>
    <!-- onselect onchange -->
    <textarea cols="30" rows="10">請寫入個人簡介,字數不少於200字</textarea>
    <input type="text" name="" value="mjj">
    <script type="text/javascript">
        var textArea = document.getElementsByTagName('textarea')[0];
        var inputObj = document.getElementsByTagName('input')[0];

        textArea.onselect = function(){
            console.log('內容被選中');
        }
        inputObj.onchange = function(){
            console.log('內容被改變了');
        }
        /*
        inputObj.oninput = function(){
            console.log('內容被實時改變了');
            console.log(this.value);
        }
        */
    </script>
</body>
</html>

14. 視窗載入事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>視窗載入事件</title>
    <script type="text/javascript"> //多數寫在head中,但是程式碼載入順序是從左往右,從上往下
        /*
        setTimeout(function(){
            var oDiv = document.getElementById('box');
            console.log(oDiv);
            oDiv.onclick = function(){
                this.innerHTML = 'alex';
            }
        }, 0)
        */
        // 等待文件元素載入完成才會呼叫onload(), 如果在head中寫script, 則應使用window.load, 但是window.load存在事件覆蓋的問題.
        window.onload = function(){
            var oDiv = document.getElementById('box');
            console.log(oDiv);
            oDiv.onclick = function(){
                this.innerHTML = 'alex';
            }
        }
        // window.onload = function(){
        //     console.log(11111);
        // }

    </script>
</head>
<body>
    <div id="box">MJJ</div>
</body>
</html>