js DOM(三)節點、元素創建3種方式、為元素綁定多個事件addEventListener、attachEvent


錄:

     1.節點的概念
     2.節點的屬性(nodeType,nodeName,nodeValue)
     3.父節點(父元素)
     4.獲取子節點或子元素
     5.獲取節點、元素的方法(12行代碼)
     6.案例:div標簽里面的p標簽背景高亮(使用子節點或子元素的方式)
     7.封裝節點兼容代碼
     8.案例:切換背景圖片
     9.案例:全選、全不選
    10.元素創建的第一種方式  document.write("<p>文本</P>");
    11.元素創建的第二種方式 document.getElementById("divId").innerHTML="<p>新添加的文本</P>";
    12.案例:點擊按鈕,在div中加載一張圖片
    13.案例:動態創建列表(元素創建的第二種方式)
    14.第三種元素創建方式  var pEle = document.createElement("p");
    15.案例:動態創建列表(使用第三種元素創建方式)
    16.動態創建表格(使用第三種元素創建方式)
    17.【操作元素的一些方法】
    18.點擊按鈕,創建元素(只創建一次)
    19.為元素綁定多個事件
    20.為元素綁定事件的兼容代碼
    21.解綁事件的三種方式
    22.解綁事件的兼容代碼
    23.事件冒泡、阻止事件冒泡
    24.事件的3個階段
    25.為同一個元素綁定多個不同事件,事件使用同一個處理函數
    26.案例:模擬百度搜索

 

1.節點的概念    <--返回目錄
    * 文檔:document
    * 元素:element,頁面中所有的標簽都是元素,標簽--元素--對象
    * 節點:node,頁面中所有的內容(標簽、屬性、文本)
    * 根元素:html這個標簽

 

2.節點的屬性(nodeType,nodeName,nodeValue)    <--返回目錄
    * 節點的屬性:可以通過標簽(屬性或文本).點出來
    * 節點類型nodeType:1--標簽,2--屬性,3--文本
    * 節點名稱nodeName:標簽節點--大寫的標簽名字,屬性節點--小寫的屬性名字,文本節點--#text
    * 節點的值nodeValue:標簽節點--null,屬性節點--屬性值,文本節點--文本內容

 

3.父節點(父元素)    <--返回目錄
    * 只有標簽可以作為父節點(父元素)
        - 獲取所有的父節點   ele.parentNode;
        - 獲取所有的父元素   ele.parentElement;

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>標題</title>        
</head>
<body>
<div id="box">
    div里面的文本
    <p>p里面的文本</p>
</div>
<script type="text/javascript">
    var pEle = document.getElementById("box").getElementsByTagName("p")[0];
    console.log(pEle.parentNode);//[object HTMLDivElement]---說明父節點是標簽
    console.log(pEle.parentElement);//[object HTMLDivElement]---說明父元素是標簽

    var parentEle= pEle.parentNode;  //獲取父標簽
    console.log(parentEle.nodeType);  //1--標簽類型
    console.log(parentEle.nodeName);  //DIV--標簽名字
    console.log(parentEle.nodeValue);  //null--標簽的值
</script>
</body>
</html>

 

4.獲取子節點或子元素    <--返回目錄
    * 獲取所有的子節點  ele.childNodes;
    * 獲取所有的子元素(子標簽)  ele.children;

  【獲取子節點或子元素】

<div id="box">
    div里面的文本
    <p>p里面的文本</p>
    <a href=""></a>
</div>
<script type="text/javascript">
    var divEle = document.getElementById("box");
    console.log(divEle.childNodes);//子節點NodeList(5) [ #text, p, #text, a, #text ]
    console.log(divEle.children);//子元素HTMLCollection [ p, a ]
</script>

  代碼:【獲取子節點】

<div id="box">
    div里面的文本
    <p>p里面的文本</p>
    <a href="">a標簽里面的文本</a>
</div>
<script type="text/javascript">
    var divEle = document.getElementById("box");
    var _childNodes = divEle.childNodes;//子節點NodeList(5) [ #text, p, #text, a, #text ]
    for(var i=0;i<_childNodes.length;i++){
        console.log(_childNodes[i].nodeType+"---"+_childNodes[i].nodeName+"---"+_childNodes[i].nodeValue);
    }
</script>

  結果:
        3---#text---div里面的文本
        1---P---null
        3---#text---
        1---A---null
        3---#text---

 

  【根據屬性名字獲取屬性節點】

<script type="text/javascript">
    var ele = document.getElementById("txt");
    var attNode = ele.getAttributeNode("name");
    console.log(attNode);//屬性節點name="username"
    alert(attNode);//屬性節點[object Attr]
    console.log(attNode.nodeType+"---"+attNode.nodeName+"---"+attNode.nodeValue);//2---name---username
</script>

 

5.獲取節點、元素的方法(12行代碼)    <--返回目錄
    * 總結:凡是獲取節點的代碼在谷歌和火狐得到的都是節點,凡是獲取元素的代碼在谷歌和火狐總都是元素;
      除父(子)節點/元素,凡是獲取節點的代碼在IE8中得到的是元素,獲取元素的代碼不支持。

//父節點
ele.parentNode;
//父元素
ele.parentElement;
//子節點
ele.childNodes;
//子元素
ele.children;
//第一個子節點
ele.firstChild;
//第一個子元素
ele.firstElementChild
//最后一個子節點
ele.lastChild;
//最后一個子元素
ele.lastElementChild;
//某個元素的前一個兄弟節點
ele.previousSibling;
//某個元素的前一個兄弟元素
ele.previousElementSibling;
//某個元素的后一個兄弟節點
ele.nextSibling;
//某個元素的后一個兄弟元素
ele.nextElementSibling;

 

6.案例:div標簽里面的p標簽背景高亮(使用子節點或子元素的方式)    <--返回目錄

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>標題</title>        
</head>
<body>
<input type="button" value="變色">
<div style="width:300px;border:2px solid blue">
    <span>這是span內的文本1</span>
    <p>這是p內的文本1</p>
    <span>這是span內的文本2</span>
    <p>這是p內的文本2</p>
</div>
<script type="text/javascript">
    var divEle = document.getElementsByTagName("div")[0];
    document.getElementsByTagName("input")[0].onclick=function(){
        var eles = divEle.children;//獲取div標簽里面所有的子標簽
        //遍歷所有的子標簽,並判斷是否是p標簽
        for(var i=0;i<eles.length;i++){
            if(eles[i].nodeType===1 && eles[i].nodeName==="P"){
                eles[i].style.backgroundColor="red";
            }
        }
    };
</script>
</body>
</html>

 

7.封裝節點兼容代碼    <--返回目錄
  獲取任意一個父元素的第一個子元素

function getfirstEleChild(ele){
    //if(typeof ele.firstElementChild != "undefined"){
    if(ele.firstElementChild){  //ele.firstElementChild有值就為true
        return ele.firstElementChild;
    }else{
        var node = ele.firstChild;
        while(node && node.nodeType !=1){
            node=node.nextSibling;
        }
        return node;
    }
}

  獲取任意一個父元素的最后一個子元素

function getlastEleChild(ele){
    if(ele.lastElementChild){  //ele.lastElementChild有值就為true
        return ele.lastElementChild;
    }else{
        var node = ele.lastChild;
        while(node && node.nodeType !=1){
            node=node.previousSibling;
        }
        return node;
    }
}

 

8.案例:切換背景圖片    <--返回目錄

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>標題</title>        
    <style type="text/css">
        img{
            width:150px;
        }
        div{
            width: 700px;
            margin: 0 auto;
        }
        body {
            background:url("images/1.jpg");/*設置背景圖片*/
        }
    </style>
</head>
<body>
<div id="box">
    <img src="images/1.jpg">
    <img src="images/2.jpg">
    <img src="images/3.jpg">
    <img src="images/4.jpg">
</div>

<script type="text/javascript">
    var eles = document.getElementById("box").children;
    for(var i=0;i<eles.length;i++){
        eles[i].onclick=function(){
            console.log(this.src);//file:///C:/Users/oy/Desktop/images/2.jpg
            document.body.style.background="url("+this.src+")";
            console.log("url("+this.src+")");//url(file:///C:/Users/oy/Desktop/images/2.jpg)
        };
    }
</script>
</body>
</html>

 

9.案例:全選、全不選    <--返回目錄

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>標題</title>        
</head>
<body>
<table align="center" width="30%" cellspacing="0" border="1" bgcolor="#eee">
    <tr >
        <th><input type="checkbox" id="checkboxId"></th>
        <th>菜名</th>
        <th>飯店</th>
    </tr>
    <tbody>
        <tr align="center">
            <td><input type="checkbox" name=""></td>
            <td>aa</td>
            <td>aa</td>
        </tr >
        <tr align="center">
            <td><input type="checkbox" name=""></td>
            <td>aa</td>
            <td>aa</td>
        </tr>
        <tr align="center">
            <td><input type="checkbox" name=""></td>
            <td>aa</td>
            <td>aa</td>
        </tr>
    </tbody>
</table>
<script type="text/javascript">
    var checkboxEle = document.getElementById("checkboxId");
    var eles = document.getElementsByTagName("input");
    //為第一個checkbox注冊點擊事件
    checkboxEle.onclick=function(){
        //如果第一個checkbox選中,則全部選中; 否則,全部取消選中
        for(var i=0;i<eles.length;i++){
            eles[i].checked=this.checked;
        }
    };
    //為后面3個checkbox注冊點擊事件
    for(var j=1;j<eles.length;j++){
        eles[j].onclick=function(){
            //判斷后面3個checkbox的狀態,如果都被選中,則將第一個checkbox也選中
            var count=0;//計數器,用於保存選中的checkbox的個數
            for(var k=1;k<eles.length;k++){
                if(eles[k].checked){
                    count++;
                }
            }
            //如果計數器count=3,說明后面3個checkbox都被選中了,則將第一個checkbox也選中
            //如果計數器count<3,則將第一個checkbox去掉選中
            console.log(`count = ${count}`)
            if(count == 3){
                checkboxEle.checked=true;
            }else if(count<3){
                checkboxEle.checked=false;
            }
        };
    }
</script>
</body>
</html>

 

10.元素創建的第一種方式    <--返回目錄
  document.write("<p>文本</P>");
        - 如果是頁面加載完畢后,通過該種方式創建元素,頁面之前的所有內容被清空
        - 如果是頁面加載的時候,通過該種方式創建元素,頁面之前的所有內容被保留

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>標題</title>        
</head>
<body>
<input type="button" id="btn" value="按鈕" />

<script type="text/javascript">
var ele = document.getElementById("btn");
ele.onclick=function(){
    document.write("<p>文本</P>");//該句代碼是在點擊按鈕后執行,此時頁面已經加載完畢,頁面之前的所有內容被清空
};
document.write("<p>文本</P>");//頁面加載的時候,通過該種方式創建元素,頁面之前的所有內容被保留
</script>
</body>
</html>

 

11.元素創建的第二種方式    <--返回目錄
  document.getElementById("divId").innerHTML="<p>新添加的文本</P>";

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>標題</title>        
</head>
<body>
<input type="button" id="btn" value="按鈕" />
<div id="divId" style="width: 300px;height: 200px;border:2px solid pink">div原來的文本</div>

<script type="text/javascript">
var ele = document.getElementById("btn");
ele.onclick=function(){
    document.getElementById("divId").innerHTML="<p>新添加的文本</P>";//將原來的文本覆蓋了
};
</script>
</body>
</html>

 

12.案例:點擊按鈕,在div中加載一張圖片    <--返回目錄

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>標題</title>    
    <style type="text/css">
        img{
            width: 300px;
            height:300px;
        }
    </style>    
</head>
<body>
<input type="button" id="btn" value="按鈕" />
<div id="divId" style="width:300px; height:300px; border:2px solid pink">div原來的文本</div>

<script type="text/javascript">
var ele = document.getElementById("btn");
ele.onclick=function(){
    //點擊按鈕,在div中加載一張圖片,加載的圖片也會應用已經定義的樣式
    document.getElementById("divId").innerHTML="<img src='a.jpg'/>";
};
</script>
</body>
</html>

 

13.案例:動態創建列表(元素創建的第二種方式)    <--返回目錄

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>標題</title>    
    <style type="text/css">
        *{
            padding: 0;
            margin: 0;
        }
    </style>    
</head>
<body>
<input type="button" id="btn" value="按鈕" />
<div id="divId" style="width: 300px;height: 300px;border:2px solid pink">div原來的文本</div>
<script type="text/javascript">
    var names = ["西施","楊玉環","貂蟬","王昭君"];
    var ele = document.getElementById("btn");
    ele.onclick=function(){
        var str = "<ul style='list-style-type:none;cursor:pointer'>";
        for(var i=0;i<names.length;i++){
            str += "<li>"+names[i]+"</li>";
        }
        str += "</ul>";
        document.getElementById("divId").innerHTML=str;
    };
</script>
</body>
</html>

 

14.第三種元素創建方式    <--返回目錄
  var pEle = document.createElement("p");

<input type="button" id="btn" value="按鈕" />
<div id="divId" style="width: 300px;height: 300px;border:2px solid pink">div原來的文本</div>
<script type="text/javascript">
    document.getElementById("btn").onclick=function(){
        var pEle = document.createElement("p");
        pEle.innerText="這是p標簽里面的文本";
        document.getElementById("divId").appendChild(pEle);//在后面追加
    };
</script>

 

15.案例:動態創建列表(使用第三種元素創建方式)    <--返回目錄

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>標題</title>    
    <style type="text/css">
        *{
            padding: 0;
            margin: 0;
        }
    </style>    
</head>
<body>
<input type="button" id="btn" value="按鈕" />
<div id="divId" style="width: 300px;height: 300px;border:2px solid pink">div原來的文本</div>
<script type="text/javascript">
    var names = ["a","b","c"];
    document.getElementById("btn").onclick=function(){
        var parent = document.getElementById("divId");
        var ulNode = document.createElement("ul");
        parent.appendChild(ulNode);

        for(var i=0;i<names.length;i++){
            var node = document.createElement("li");
            node.innerText=names[i];
            ulNode.appendChild(node);
            node.onmouseover = mouseoverHandler;
            node.onmouseout = mouseoutHandler;
        }
    };
    var mouseoverHandler = function (){
        this.style.backgroundColor = "#ccc";
    };
    var mouseoutHandler = function (){
        this.style.backgroundColor = "";
    };
</script>
</body>
</html>

 

16.動態創建表格(使用第三種元素創建方式)    <--返回目錄

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>標題</title>        
</head>
<body>
<input type="button" id="btn" value="按鈕" />
<div id="divId" style="width: 300px;height: 300px;border:2px solid pink">div原來的文本</div>
<script type="text/javascript">
    var names = [
        {"name":"百度","href":"http://www.baidu.com"},
        {"name":"谷歌","href":"http://www.google.com"},
    ];
    document.getElementById("btn").onclick=function(){
        //創建table元素,並添加到div元素下
        var parent = document.getElementById("divId");
        var table = document.createElement("table");
        table.border = "1";

        parent.appendChild(table);
        for(var i=0;i<names.length;i++){
            var node = names[i];
            //創建tr元素,並添加到table元素下
            var tr = document.createElement("tr");
            table.appendChild(tr);
            //創建第一列,並添加到tr下
            var td = document.createElement("td");
            td.innerText = node.name;
            tr.appendChild(td);
            //創建第二列,並添加到tr下
            var td = document.createElement("td");
            td.innerHTML = "<a href="+node.href+">"+node.name+"</a>";
            tr.appendChild(td);
        }
    };
</script>
</body>
</html>

 

17.操作元素的一些方法    <--返回目錄
    * parentEle.appendChild(node);//追加子元素
    * parentEle.insertBefore(newChild,refChild);//在指定的元素refEle之前插入newEle
      parentEle.insertBefore(newChild,parentEle.firstElementChild);//在div里面最前面插入newEle

    * parentEle.replaceChild(newChild,refChild);//替換
    * parentEle.removeChild(parentEle.firstElementChild);//刪除第一個子元素
    * 刪除所有子元素
        while(parentEle.firstElementChild){
            parentEle.removeChild(parentEle.firstElementChild);//刪除第一個子元素
        }

 

18.點擊按鈕,創建元素(只創建一次)    <--返回目錄
    * 有則刪除,無則創建,即創建之前先判斷是否存在,存在刪除,然后創建
    * 或者,創建之前先判斷是否存在,存在就什么也不做,不存在就創建。

19.為元素綁定多個事件    <--返回目錄
    * ele.addEventListener(type,listener,useCapture);//可以為同一個元素綁定多個相同的事件,谷歌火狐都支持,IE8不支持
        - 參數一:{string}type 事件的類型,沒有on前綴
        - 參數二:{Function}listener 事件處理函數
        - 參數三:{boolean}useCapture 目前就寫false,不解釋

    * ele.attachEvent("onclick",fn);谷歌火狐不支持,IE8支持

 * 區別
  addEventListener 谷歌、火狐、IE11支持,IE8不支持
  attachEvent 谷歌、火狐不支持,IE11不支持,IE8支持

ele.addEventListener("click", function(){
    console.log(this); // this為ele這個對象
}, false);
ele.attachEvent("onclick", function(){
    console.log(this); // this為window這個對象
});

 

20.為元素綁定事件的兼容代碼    <--返回目錄
  為任意元素,綁定任意的事件,事件處理函數

function addEventListener(ele,type,fn){
    //判斷瀏覽器是否支持這個方法
    if(ele.addEventListener){
        ele.addEventListener(type,fn,false);
    }else if(ele.attachEvent){
        ele.attachEvent("on"+type,fn);
    }else{
        ele["on"+type]=fn;
    }
}

 

21.解綁事件的三種方式    <--返回目錄

  第一種:ele.onclick=null;

  注意:用什么方式綁定事件,就應該用對應的方式解綁事件

<input type="button" id="btn" value="按鈕" />
<input type="button" id="btn2" value="解綁事件" />
<script type="text/javascript">
    document.getElementById("btn").onclick=function(){
        alert(1);
    };
    document.getElementById("btn2").onclick=function(){
        document.getElementById("btn").onclick=null;
    };
</script>

  第二種:ele.removeEventListener("click",命名函數的名字,false);

  IE8不支持addEventListener和removeEventListener

<input type="button" id="btn" value="按鈕" />
<input type="button" id="btn2" value="解綁事件" />
<script type="text/javascript">
    var ele = document.getElementById("btn");
    ele.addEventListener("click",f1,false);
    ele.addEventListener("click",f2,false);

    //移除第二個綁定事件
    document.getElementById("btn2").onclick=function(){
        ele.removeEventListener("click",f1,false);
    };
    function f1(){
        console.log(1);
    }
    function f2(){
        console.log(2);
    }
</script>

  第三種:
  谷歌、火狐不支持,IE8支持

<input type="button" id="btn" value="按鈕" />
<input type="button" id="btn2" value="解綁事件" />
<script type="text/javascript">
    var ele = document.getElementById("btn");
    ele.attachEvent("onclick",f1,false);
    ele.attachEvent("onclick",f2,false);

    //移除第二個綁定事件
    document.getElementById("btn2").onclick=function(){
        ele.detachEvent("onclick",f1);
    };
    function f1(){
        console.log(1);
    }
    function f2(){
        console.log(2);
    }
</script>

 

22.解綁事件的兼容代碼    <--返回目錄

//為任意的一個元素解綁任意事件、任意響應函數
function removeEventListener(ele,type,fnName){
    if(ele.removeEventListener){
        ele.removeEventListener(type,fnName,false);
    }else if(ele.detachEvent){
        ele.detachEvent("on"+type,fnName);
    }else{
        ele["on"+type]=null;
    }
}

  注意:以后,一般都使用兼容代碼,不使用ele.onclick=null;為了以防多個人給同一個元素綁定了相同的事件

 

23.事件冒泡、阻止事件冒泡    <--返回目錄
    * 事件冒泡:多個元素嵌套,這些元素都綁定了相同的事件,如果里面的元素的事件觸發了,外面的元素的事件也自動觸發。
    
    * 阻止事件冒泡:
        - window.event.cancelBubble = true; // IE特有的,谷歌支持,火狐不支持
        - e.stopPropagation(); // 谷歌火狐支持,IE不支持

 

24.事件的3個階段    <--返回目錄
    * 事件捕獲階段:從外向里
    * 事件目標階段
    * 事件冒泡階段:從里向外
    
    * addEventListener(,,false|true)
        - false:從目標階段開始,從里向外冒泡
        - true:從外到里開始捕獲,直到目標階段【直到捕獲事件的觸發目標】
        - 一般默認使用false,很少用true

 

25.為同一個元素綁定多個不同事件,事件使用同一個處理函數    <--返回目錄

<input type="button" id="btn" value="按鈕" />
<script type="text/javascript">
    var ele = document.getElementById("btn");
    ele.onclick = fun;
    ele.onmouseover = fun;
    ele.onmouseout = fun;
    function fun(e){
        switch(e.type){
            case "click":
                console.log("鼠標點擊事件");
                break;
            case "mouseover":
                console.log("鼠標進入事件");
                break;
            case "mouseout":
                console.log("鼠標離開事件");
                break;
        }
    }
</script>

 

26.案例:模擬百度搜索    <--返回目錄

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>標題</title>    
    <style type="text/css">
        *{
            margin: 0;
            padding: 0;
        }
        ul{
            list-style-type: none;
        }
    </style>    
</head>
<body>
<div>
    <input type="text" id="txt" style="width: 200px;"/>
    <input type="button" id="btn" value="搜索"/>
    <div id="divId" style="width: 200px;display: none;border: 1px solid #ccc"></div>    
</div>
<script type="text/javascript">
    var keywords = ["我愛你","我喜歡你","我不喜歡你"];
    var txtEle = document.getElementById("txt");
    txtEle.onkeyup = function() {
        //獲取文本框輸入的內容
        var text = this.value;
        var tempArr = [];//用於存放匹配上的數據
        //把文本框輸入的內容與數組中的數據進行對比,匹配上的數據添加到tempArr中
        for(var i=0;i<keywords.length;i++){
            console.log(text.length);
            if(text.length>0 && keywords[i].indexOf(text)==0){
                tempArr.push(keywords[i]);//追加
            }
        }
        console.log(tempArr);

        var div = document.getElementById("divId");
        //如果tempArr中有數據,創建列表
        if(tempArr.length>0){
            //先清空div中內容
            while(div.firstElementChild){
                div.removeChild(div.firstElementChild);//刪除第一個子元素
            }
            var ul = document.createElement("ul");
            div.appendChild(ul);
            //根據tempArr的數據創建列表,添加到div中
            for(var j=0;j<tempArr.length;j++){
                var li = document.createElement("li");
                li.innerText = tempArr[j];
                ul.appendChild(li);

                //為li標簽添加鼠標進入和移出事件
                li.onmouseover = function(){
                    this.style.backgroundColor = "#888";
                };
                li.onmouseout = function(){
                    this.style.backgroundColor = "";
                };
                //為li標簽添加鼠標點擊事件
                li.onclick = function(){
                    //將li標簽內的文本添加到輸入框中
                    txtEle.value = this.innerText;
                    //將div隱藏
                    div.style.display = "none";
                };
            }
            //使得div顯示
            div.style.display = "block";
        }else{
            div.style.display = "none";
        }
    }
</script>
</body>
</html>

---


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM