1. 程式人生 > >JS中的DOM操作(三)

JS中的DOM操作(三)

目錄

 

Tips

節點與元素:

節點的屬性:

獲取結節點的方法:

節點相容程式碼:

元素建立的三種方式

元素繫結多個事件

元素繫結事件的相容程式碼

程式碼

1.案例點選按鈕設定div中p標籤改變背景顏色

2.節點操作隔行變色

3.切換背景圖片

4.全選和全不選的實現

5.點選按鈕建立一個圖片

6.點選按鈕建立列表

7.點選按鈕動態建立列表

8.案例點選按鈕建立一個表格

9.按鈕刪除第一個及按鈕刪除所有元素

10.修改前面的bug,點選按鈕最多隻建立一個元素


Tips

節點與元素:

  •     元素:頁面中所有的標籤,元素---element,  標籤----元素---物件;根元素:html標籤
  •     節點:頁面中所有的內容(標籤,屬性,文字(文字,換行,空格,回車)),Node

節點的屬性:

(可以使用標籤--元素.出來,可以使用屬性節點.出來,文字節點.點出來)

  •  nodeType:節點的型別:1----標籤,2---屬性,3---文字
  •  nodeName:節點的名字:標籤節點---大寫的標籤名字,屬性節點---小寫的屬性名字,文字節點----#text
  •  nodeValue:節點的值:標籤節點---null,屬性節點---屬性值,文字節點---文字內容

獲取結節點的方法:

  • nodeType--->節點的型別:1---標籤,2---屬性,3---文字
  • nodeName--->節點的名字:大寫的標籤--標籤,小寫的屬性名---屬性,#text---文字
  • nodeValue-->節點的值:標籤---null,屬性--屬性的值,文字--文字內容
//ul標籤的父級節點
console.log(ulObj.parentNode);
//ul標籤的父級元素
console.log(ulObj.parentElement);
console.log(ulObj.parentNode.nodeType);//標籤的---1
console.log(ulObj.parentNode.nodeName);//標籤---大寫的標籤名字
console.log(ulObj.parentNode.nodeValue);//標籤---null
 
//根據屬性獲取節點
var node=dvObj.getAttributeNode("id");
var dvObj=document.getElementById("dv");
//子節點
console.log(dvObj.childNodes);//7個子節點
//子元素
console.log(dvObj.children);
  • 凡是獲取節點的程式碼在谷歌和火狐得到的都是  相關的節點
  • 凡是獲取元素的程式碼在谷歌和火狐得到的都是   相關的元素
  • 從子節點和兄弟節點開始,凡是獲取節點的程式碼在IE8中得到的是元素,獲取元素的相關程式碼,在IE8中得到的是undefined----元素的程式碼,iE中不支援
  • 獲取節點和元素的程式碼:
var ulObj=document.getElementById("uu");
  //父級節點
  console.log(ulObj.parentNode);
  //父級元素
  console.log(ulObj.parentElement);
  //子節點
  console.log(ulObj.childNodes);
  //子元素
  console.log(ulObj.children);
  console.log("==============================================");
  //第一個子節點
  console.log(ulObj.firstChild);//------------------------IE8中是第一個子元素
  //第一個子元素
  console.log(ulObj.firstElementChild);//-----------------IE8中不支援
  //最後一個子節點
  console.log(ulObj.lastChild);//------------------------IE8中是第一個子元素
  //最後一個子元素
  console.log(ulObj.lastElementChild);//-----------------IE8中不支援
  //某個元素的前一個兄弟節點
  console.log(my$("three").previousSibling);
  //某個元素的前一個兄弟元素
  console.log(my$("three").previousElementSibling);
  //某個元素的後一個兄弟節點
  console.log(my$("three").nextSibling);
  //某個元素的後一個兄弟元素
  console.log(my$("three").nextElementSibling);


 console.log("==============================================");
//第一個子節點
console.log(ulObj.firstChild.innerText);//------------------------IE8中是第一個子元素
//第一個子元素
console.log(ulObj.firstElementChild);//-----------------IE8中不支援
//最後一個子節點
console.log(ulObj.lastChild.innerText);//------------------------IE8中是第一個子元素
//最後一個子元素
console.log(ulObj.lastElementChild);//-----------------IE8中不支援
//某個元素的前一個兄弟節點
console.log(my$("three").previousSibling.innerText);
//某個元素的前一個兄弟元素
console.log(my$("three").previousElementSibling);
//某個元素的後一個兄弟節點
console.log(my$("three").nextSibling.innerText);
//某個元素的後一個兄弟元素
console.log(my$("three").nextElementSibling);

節點相容程式碼:

<script>
  //第一個節點和第一個元素的獲取的程式碼在IE8中可能不支援

  //element.firstChild--->谷歌和火狐獲取的是第一個子幾點
  //element.firstChile--->IE8獲取的是第一個子元素
  //element.firstElementChild------>谷歌和火狐是第一個子元素,IE8不支援
  //獲取任意一個父級元素的第一個子級元素
  function getFirstElementChild(element) {
    if(element.firstElementChild){//true--->支援
      return element.firstElementChild;
    }else{
      var node=element.firstChild;//第一個節點
      while (node&&node.nodeType!=1){
        node=node.nextSibling;
      }
      return node;
    }
  }
  //獲取任意一個父級元素的最後一個子級元素
  function getLastElementChild(element) {
    if(element.lastElementChild){//true--->支援
      return element.lastElementChild;
    }else{
      var node=element.lastChild;//第一個節點
      while (node&&node.nodeType!=1){
        node=node.previousSibling;
      }
      return node;
    }
  }


  console.log(getFirstElementChild(my$("uu")).innerText);
  console.log(getLastElementChild(my$("uu")).innerText);

  //最後一個節點和最後一個元素的獲取的程式碼在IE8中可能不支援
  //前一個節點和前一個元素的獲取的程式碼在IE8中可能不支援
  //後一個節點和後一個元素的獲取的程式碼在IE8中可能不支援

</script>

元素建立的三種方式

  • document.write("標籤的程式碼及內容");
    <script>
      //document.write("標籤程式碼及內容");
      my$("btn").onclick=function () {
        document.write("<p>這是一個p</p>");
      };
     // document.write("<p>這是一個p</p>");
    
      //document.write()建立元素,缺陷:如果是在頁面載入完畢後,此時通過這種方式建立元素,那麼頁面上存在的所有的內容全部被幹掉
    </script>

     

  • 物件.innerHTML="標籤及程式碼";
    <script>
      //點選按鈕,在div中建立一個p標籤
      //第二種方式建立元素: 物件.innerHTML="標籤程式碼及內容";
    
      my$("btn").onclick=function () {
        my$("dv").innerHTML="<p>窗前明月光,疑是地上霜,舉頭望明月,低頭思故鄉</p>";
      };
    </script>

     

  • document.createElement("標籤的名字");
    <script>
      //第三種方式建立元素
      //建立元素
      //document.createElement("標籤名字");物件
      //把元素追加到父級元素中
      //點選按鈕,在div中建立一個p
    
      my$("btn").onclick = function () {
        //建立元素的
        var pObj = document.createElement("p");
        setInnnerText(pObj, "這是一個p");
        //把建立後的子元素追加到父級元素中
        my$("dv").appendChild(pObj);
      };
    
    
    </script>

    元素繫結多個事件

  //為元素繫結事件(DOM):一種,但是不相容,有兩種
  //1 物件.addEventListener("事件型別",事件處理函式,false);--谷歌和火狐支援,IE8不支援
  //2 物件.attachEvent("有on的事件型別",事件處理函式)--谷歌不支援,火狐不支援,IE8支援

  //為按鈕繫結點選事件
  //引數1:事件的型別---事件的名字,沒有on
  //引數2:事件處理函式---函式(命名函式,匿名函式)
  //引數3:布林型別,目前就寫false-----沒有為什麼,不解釋,明天說

  //為同一個元素繫結多個相同的事件--
//  my$("btn").addEventListener("click",function () {
//    console.log("1");
//  },false);
//  my$("btn").addEventListener("click",function () {
//    console.log("2");
//  },false);
//  my$("btn").addEventListener("click",function () {
//    console.log("3");
//  },false);
//  my$("btn").addEventListener("click",function () {
//    console.log("4");
//  },false);

  //引數1:事件型別---事件名字,有on
  //引數2:事件處理函式---函式(命名函式,匿名函式)

//  my$("btn").attachEvent("onclick",function () {
//    console.log("1");
//  });
//
//  my$("btn").attachEvent("onclick",function () {
//    console.log("2");
//  });
//
//  my$("btn").attachEvent("onclick",function () {
//    console.log("3");
//  });
</script>


元素繫結事件的相容程式碼

<script>

  //為任意元素.繫結任意的事件, 任意的元素,事件的型別,事件處理函式
  function addEventListener(element,type,fn) {
    //判斷瀏覽器是否支援這個方法
    if(element.addEventListener){
      element.addEventListener(type,fn,false);
    }else if(element.attachEvent){
      element.attachEvent("on"+type,fn);
    }else{
      element["on"+type]=fn;
    }
  }

  addEventListener(my$("btn"),"click",function () {
    console.log("哦1");
  });
  addEventListener(my$("btn"),"click",function () {
    console.log("哦2");
  });
  addEventListener(my$("btn"),"click",function () {
    console.log("哦3");
  });

</script>

程式碼

1.案例點選按鈕設定div中p標籤改變背景顏色

<div id="dv">
  <span>這是span</span>
  <p>這是p</p>
  <span>這是span</span>
  <p>這是p</p>
  <span>這是span</span>
  <p>這是p</p>
  <span>這是span</span>
  <a href="http://www.baidu.com">百度</a>
</div>
<script src="common.js"></script>
<script>

  my$("btn").onclick = function () {
    //先獲取div
    var dvObj = my$("dv");
    //獲取裡面所有的子節點
    var nodes = dvObj.childNodes;
    //迴圈遍歷所有的子節點
    for (var i = 0; i < nodes.length; i++) {
      //判斷這個子節點是不是p標籤
      if (nodes[i].nodeType == 1 && nodes[i].nodeName == "P") {
        nodes[i].style.backgroundColor = "red";
      }
    }
  };
  //點選按鈕,設定p變色---節點的方式做


</script>

2.節點操作隔行變色

<script>
  //隔行變色--li
  my$("btn").onclick = function () {
    var count=0;//記錄有多少個li
    //獲取ul中所有的子節點
    var nodes = my$("uu").childNodes;
    for (var i = 0; i < nodes.length; i++) {
      //判斷這個節點是不是li標籤
      if (nodes[i].nodeType == 1 && nodes[i].nodeName == "LI") {
        nodes[i].style.backgroundColor=count%2==0?"red":"yellow";
        count++;//8個
        //nodes[i].style.backgroundColor = i % 2 == 0 ? "red" : "yellow";
      }
    }
  };

</script>

3.切換背景圖片

<script>
  var imgObjs=my$("mask").children;//獲取的所有的子元素
  //迴圈遍歷所有img,註冊點選事件
  for(var i=0;i<imgObjs.length;i++){
    imgObjs[i].onclick=function () {
      document.body.style.backgroundImage="url("+this.src+")";
    };
  }
</script>

4.全選和全不選的實現

<script>

  //獲取全選的這個複選框
  var ckAll = my$("j_cbAll");
  //獲取tbody中所有的小複選框
  var cks = my$("j_tb").getElementsByTagName("input");
  //點選全選的這個複選框,獲取他當前的狀態,然後設定tbody中所有複選框的狀態
  ckAll.onclick = function () {
    //console.log(this.checked);
    for (var i = 0; i < cks.length; i++) {
      cks[i].checked = this.checked;
    }
  };

  //獲取tbody中所有的複選框,分別註冊點選事件
  for(var i=0;i<cks.length;i++){
    cks[i].onclick=function () {
      var flag=true;//預設都被選中了
      //判斷是否所有的複選框都選中
      for(var j=0;j<cks.length;j++){
        if(!cks[j].checked){
          //沒選中就進來了
          flag=false;
          break;
        }
      }
      //全選的這個複選框的狀態就是flag這個變數的值
      ckAll.checked=flag;
    };
  }

</script>

5.點選按鈕建立一個圖片

<script>
  //點選按鈕,在div中建立一個圖片
  my$("btn").onclick=function () {
     my$("dv").innerHTML="<img src='images/liuyan.jpg' alt='美女' />";
  };

</script>

6.點選按鈕建立列表

<script>

  //  my$("btn").onclick=function () {
  //    my$("dv").innerHTML="<ul><li>楊過</li><li>小龍女</li><li>張無忌</li>  <li>張三丰</li></ul>";
  //  };


  var names = ["楊過", "郭靖", "張無忌", "張三丰", "喬峰", "段飛", "丁棚"];
  my$("btn").onclick = function () {
    var str = "<ul style='list-style-type: none;cursor: pointer'>";
    //根據迴圈建立對應對數的li
    for (var i = 0; i < names.length; i++) {
      str += "<li>" + names[i] + "</li>";
    }
    str += "</ul>";
    my$("dv").innerHTML = str;

    //程式碼執行到這裡,li已經有了
    //獲取所有的li,遍歷,新增滑鼠進入事件,滑鼠離開事件
    var list = my$("dv").getElementsByTagName("li");
    for (var i = 0; i < list.length; i++) {
      //滑鼠進入
      list[i].onmouseover = function () {
        this.style.backgroundColor = "yellow";
      };
      //滑鼠離開
      list[i].onmouseout = function () {
        this.style.backgroundColor = "";
      };

    }

  };


</script>

7.點選按鈕動態建立列表

<script>
  var kungfu = ["降龍十八掌", "黯然銷魂掌", "葵花寶典", "九陰真經", "吸星大法", "如來神掌", "化骨綿掌", "玉女心經", "極樂神功", "辟邪劍譜"];

  //點選按鈕動態的建立列表,把列表加到div中
  my$("btn").onclick = function () {
    //建立ul,把ul立刻加入到父級元素div中
    var ulObj = document.createElement("ul");
    my$("dv").appendChild(ulObj);
    //動態的建立li,加到ul中
    for (var i = 0; i < kungfu.length; i++) {
      var liObj = document.createElement("li");
      //設定li中間的文字內容
      liObj.innerHTML = kungfu[i];
      ulObj.appendChild(liObj);
      //為li新增滑鼠進入事件
      liObj.onmouseover = mouseoverHandle;
      //為li新增滑鼠離開事件
      liObj.onmouseout = mouseoutHandle;
    }
  };

  //此位置.按鈕的點選事件的外面
  function mouseoverHandle() {
    this.style.backgroundColor = "red";
  }
  function mouseoutHandle() {
    this.style.backgroundColor = "";
  }

  //如果是迴圈的方式新增事件,推薦用命名函式
  //如果不是迴圈的方式新增事件,推薦使用匿名函式


</script>

8.案例點選按鈕建立一個表格

<script>

  var arr=[
    {name:"百度",href:"http://www.baidu.com"},
    {name:"谷歌",href:"http://www.google.com"},
    {name:"優酷",href:"http://www.youku.com"},
    {name:"土豆",href:"http://www.tudou.com"},
    {name:"快播",href:"http://www.kuaibo.com"},
    {name:"愛奇藝",href:"http://www.aiqiyi.com"}
  ];

  //點選按鈕建立表格
  my$("btn").onclick=function () {
    //建立table加入到div中
    var tableObj=document.createElement("table");
    tableObj.border="1";
    tableObj.cellPadding="0";
    tableObj.cellSpacing="0";
    my$("dv").appendChild(tableObj);
    //建立行,把行加入到table中
    for(var i=0;i<arr.length;i++){
      var dt=arr[i];//每個物件
      var trObj=document.createElement("tr");
      tableObj.appendChild(trObj);
      //建立第一個列,然後加入到行中
      var td1=document.createElement("td");
      td1.innerText=dt.name;
      trObj.appendChild(td1);
      //建立第二個列
      var td2=document.createElement("td");
      td2.innerHTML="<a href="+dt.href+">"+dt.name+"</a>";
      trObj.appendChild(td2);
    }
  };

</script>

9.按鈕刪除第一個及按鈕刪除所有元素

<script>

  var i=0;
  my$("btn").onclick=function () {
    i++;
   var obj= document.createElement("input");
    obj.type="button";
    obj.value="按鈕"+i;
    //my$("dv").appendChild(obj);//追加子元素
    //把新的子元素插入到第一個子元素的前面
    my$("dv").insertBefore(obj,my$("dv").firstElementChild);
    //my$("dv").replaceChild();---自己玩
  };

  my$("btn2").onclick=function () {
    //移除父級元素中第一個子級元素
    my$("dv").removeChild(my$("dv").firstElementChild);
  };

  my$("btn3").onclick=function () {
    //點選按鈕刪除div中所有的子級元素
    //判斷父級元素中有沒有第一個子元素
    while(my$("dv").firstElementChild){
      my$("dv").removeChild(my$("dv").firstElementChild);
    }

  };
</script>

10.修改前面的bug,點選按鈕最多隻建立一個元素

my$("btn").onclick=function () {
    //判斷,div中有沒有這個按鈕,有就刪除
    //判斷這個按鈕的子元素是否存在
    if(!my$("btn2")){//如果為true就有
      var obj=document.createElement("input");
      obj.type="button";
      obj.value="按鈕";
      obj.id="btn2";
      my$("dv").appendChild(obj);
    }

  };