1. 程式人生 > >DOM操作(基礎版)

DOM操作(基礎版)

DOM操作(基礎版)

DOM是document Object Model的縮寫,簡稱文件物件模型。只要記住這是操作文件的就行了。

DOM基礎選擇器

1、getElementById(id); //獲取指定的id元素

2、getElementsByClassName(class); //通過class獲取元素,返回值是陣列

3、getElementsByTagName(p); //獲取相同標籤的節點列表,返回值是陣列

4、getElementsByName(name); //獲取相同元素的節點列表,返回陣列

⚠️注:不是所有的標籤都有name值。

⚠️注:空格和換行鍵是文字標籤

強大的selector

document.querySelectorAll();

var oD = document.querySelector(); oD.childNode //獲取當前元素節點的所有子節點,返回一個數組

oD.parentNode //獲取當前元素節點的父元素,返回一個元素

class選擇器返回的是陣列物件,如果要使用其中的元素,通過索引解析出來

selector會選擇第一個符合規則的元素,selectorAll返回一個數組

節點選擇器

(節點)關係選擇器:都是屬性,而不是方法 父選子

 omsg.children             //返回一個數組

子選父

 omsg.parentNode

第一個子

 omsg.firstElementChild

最後一個子

 omsg.lastElementChild

上一個兄弟

 omsg.previousElementSibling

下一個兄弟

 omsg.nextElementSibling

元素屬性節點的操作分類

屬性的操作:

1、作為屬性操作:

可見的操作:

  • 內建:系統提供,按照物件的操作方法進行操作

    可獲取,可設定 對屬性進行操作

     console.log(obox.title);
     obox.title = "123321";
     console.log(obox.className); //只能通過className,而不能通過class,因為class是個關鍵字
  • 非內建:自定義,不可以通過物件的方法進行操作,通過專屬方法

    get/set/romove-Attribute(); 對自定義的屬性進行操作

    獲得、設定、溢位

    以上三種方法也可以操作內建物件,如果通過這三種方法操作class,直接寫class就可以,因為class在此時,是一個字串

     obox.getAttribute("class");

    不可見的操作:

    內建: 對內部內建屬性進行操作

    innerHTML

    nodeName

    nodeValue

    nodeType 

    obox.innerHTML;       //會返回標籤及內容
     obox.innerText;       //只返回文字的內容
     obox.tagName;         //只能返回,不能操作

    非內建:物件的操作,直接寫入物件內 對新增自定義的屬性進行操作

     obox.abc = "123456";
     console.log(obox.abc);
     ​

    可以只分為內建屬性和非內建屬性。除了已經定義在標籤內部的非內建屬性,其他的都按點呼叫。而標籤內部的非內建屬性使用get/set/romove-Attribute();呼叫。

2、作為屬性節點:(專用方法,與其他節點的方法不互通)

attributes 會返回一個數組

 <div class="box" a="10" b=20></div>
 var obox = document.querySeloector(".box");
 console.log(obox.attributes);
 //獲取屬性節點的節點的屬性和屬性值
 console.log(obox.attributes[0].nodeName);
 console.log(obox.attributes[0].nodeValue);
 ​

obox本身也就是元素節點

 obox.nodeName;        //節點名稱--文字是#text,
 obox.nodeValue; //節點值--文字是值
 obox.nodeType; //節點型別--屬性節點為2,元素節點為1,文字是3???
 ​
 節點型別(nodeType)節點名字(nodeName)節點值(nodeValue)
元素節點 1 標籤名 null
文字節點 3 #text 文字
註釋節點 8 #comment 註釋的文字
文件節點 9 #document null
屬性節點 2 屬性名 屬性值

只要是節點,就是物件

 nodeName;     //名稱
 nodeValue; //值
 nodeType; //型別
 ​

節點屬性

偽陣列:假陣列

可以使用索引和長度遍歷,但是不能使用陣列的方法 ​ arguments也是偽陣列 ​ DOM選擇器返回的陣列也是偽陣列

真陣列:

可以使用索引和長度遍歷,但是可以使用陣列的方法

操作style

批量操作.cssText

DOM屬性基本操作(增/刪/改/查)

DOM元素的增加

建立:

 createElement();        //需要配合下面這個函式使用
 appendChild(); //將建立好的元素插入某個標籤內的最後

⚠️注:是插入到某個標籤內的最後

使用方法:

 <div class="box" a="10" b=20 id="box" title="divTitle">
       <p>這是一個測試文字...</p>
       <span>ssss</span>
       <span>aaaa</span>
 </div>
 var obox = document.getElementById("box");
 var e = document.createElement("input");
 e.value = "name";
 obox.appendChild(e);

刪除:

 obox.removeChild(e);            //刪除obox內的e元素
 obox.remover();                 //直接刪除當前元素

修改:

var a = obox.lastElementChild;
 a.outerHTML = "<p>" + a.innerHTML + "</p>";

非行內樣式的操作

 getcomputedStyle(obox,false)            //獲取樣式,只能獲取不能設定
 getcomputedStyle(obox,false).background;

獲取非行內樣式(相容問題)   

 function getStyle(obj,attr){             //獲取非行間樣式,obj是物件,attr是值
         if(obj.currentStyle){                //針對ie獲取非行間樣式
             return obj.currentStyle[attr];
         }else{
             return getComputedStyle(obj,false)[attr];   //針對非ie
         };
     };

獲取元素尺寸類樣式

名稱描述
offsetParent 獲取元素最近的具有定位屬性的父級元素。如果都沒有則返回body
offsetLeft 獲取元素相對具有定位屬性的父級元素的左側偏移距離
offsetTop 獲取元素相對具有定位屬性的父級元素的頂部偏移距離
scrollLeft/scrollTop 滾動條最頂端和視窗中可見內容最頂端之間的距離--滾動距離
clientWidth/clientHeight 元素視窗寬度/高度
offsetWidth/offsetHeight 元素實際寬度/高度—可以用來測量元素在網頁中實際的寬高

事件

<div class="box"> 
 </div>
 var obox = document.querySelector(".box");
 ​
 obox.onclick = function(){
   console.log(1);
 }

事件源:obox,觸發事件的源頭

 e.target

事件型別:onclick,通過什麼行為觸發

事件處理函式:function,觸發這個行為時,要做的事情

事件的分類:

事件分類描述
onclick 單擊
ondblclick 雙擊
onmousedown 按下
onmousemove 移動
onmouseover 放上去
onmouseout 離開
onmouseup 擡起
onmouseenter 進入
onmouseleave 離開

onmouseleave和onmouseenter不支援事件冒泡

表單事件分類:

表單事件分類描述
onsubmit 提交
onfocuse 獲得焦點
onblur 失去焦點
onchange 改變文字區域的內容

頁面事件分類

頁面事件分類描述
onload 載入完成

事件物件:類似於一個祕書,在本次實踐過程中,記錄事件發生的所有資訊

預設不顯示,需要手動獲取

只在事件中存在,開始前及結束後,都不存在

獲取事件物件

event獲取方法

 window.event;         //IE中
 eve                   //直接獲取

相容方法

 function fn(eve){
   var e = eve || window.event;
 }
⚠️注:event需要逐層傳遞,不要漏掉外部的function

event的使用

 e.button;               //返回按下滑鼠按鍵的返回值,左0,中1,右2
 e.clientX;
 e.clientY;              //檢測相對於瀏覽器的位置
 e.pageX;
 e.pageY;                //檢測相對於文件的位置
 e.screenX;
 e.screenY;              //檢測相對於螢幕的位置
 e.offsetX;
 e.offsetY;              //檢測相對於元素左上角的位置

 

 

冒泡事件:會依次向上觸發所有父級的相同事件,如果中間沒有父級,則繼續向上觸發

### 鍵盤事件

事件源:document

鍵盤事件描述
onkeydwon 鍵盤按下
onkeyup 鍵盤擡起
onkeypress 按下並擡起

事件物件

獲得事件物件:event

獲得事件物件相容

 var e = eve || window.event;

獲得keycode

 var keyC = eve.keyCode || eve.which

事件流

三個階段:

  • 冒泡階段:從裡向外

  • 目標(當前事件)階段

  • 捕獲階段:從外向內

只有事件監聽才可以進入捕獲,目標狀態不區分捕獲和冒泡

瀏覽器預設冒泡

obox.addEventListener("click",function(){},flase);

第三個值預設為false

事件委託

將多個相同元素的相同事件,新增到頁面上現存的共同的父元素,利用事件冒泡,配合事件源,找到真正點選的元素

 oul.onclick = function(eve){
              var e = eve || window.event;
              var target = e.target || e.srcElement;
              if(target.nodeName == "LI"){
                  console.log(target.innerHTML);
              }
          }

優勢

  1. 節省效能

  2. 可一個頁面上暫時不存在的元素繫結事件

缺點

  1. this不夠精準

事件委託的封裝,可以使用this

var oul = document.querySelector("ul");
     var oli = document.getElementsByTagName("li");
     oul.onclick = fn(oli,function(){
       console.log(this);
       console.log(this.innerHTML)
     })
     function fn(child,callback){
       return function(eve){
         var e = eve || window.event;
         var target = e.target || e.srcElement;
         for(var i = 0;i<child.length;i++){
           if(target == child[i]){
             callback.bind(target)();
           }
         }
       }
     }