文章出處

isEqualNode()

isEqualNode方法可以用來判斷兩個DOM節點是否相同,給我的第一感覺是沒用,因為兩個DOM的比較很容易讓人想成是字符串的比較,心想直接用兩個等號不就可以了嗎,但馬上感覺不對,因為DOM是對象!兩個不同的對象是不可能相等的,比如這段

var obj = {};
var obj2 = {};
console.log(obj==obj2);//false

可以看到兩個對象是不等的,就算是長得一模一樣,那么DOM是不是對象呢?我們打印一下

<div id="div1">11111</div>
<div id="div2">22222</div>
<script>
  var div1 = document.getElementById("div1");
  console.log(typeof div1); //object
</script>

也就是說DOM確實是對象,因此是不能直接比較兩個DOM是否相同的,下面用isEqualNode函數來比較一下

<div>11111</div>
<div>11111</div>
<script>
  var divs = document.getElementsByTagName("div");
  console.log(divs[0].isEqualNode(divs[1])); //true
</script>

這個函數和一般的比較還有所不同,它比較智能,元素的屬性順序可以不同,如下

<div data-a="a" data-b="b">11111</div>
<div data-b="b" data-a="a">11111</div>
<script>
  var divs = document.getElementsByTagName("div");
  console.log(divs[0].isEqualNode(divs[1])); //true
</script>

盡管元素的屬性位置不一樣,但isEqualNode函數依然返回true

要說這個isEqualNode沒用呢,還真有用的地方,我們知道DOM渲染是比較消耗性能的,如果我們用這個屬性事先判斷一下這兩個DOM是否相同,如果相同就不更新DOM,代碼如下

<input type="text" id="text">
<div>111</div>
<script>
  var oDiv = document.getElementsByTagName("div");
  var text = document.getElementById("text");
  
  text.addEventListener("blur",function(){
    var div = document.createElement("div");
    div.innerHTML = this.value;
    if(!(oDiv[0].isEqualNode(div))){
      document.body.appendChild(div);
    }
  },false);
</script>

React中的虛擬DOM,就可以用這個函數來判斷,通過這個函數,我們可以做到只更新需要更新的DOM,而不必去把所有的DOM都給更新。

matches()

matches方法可以用來判斷當前元素是否能被指定的css選擇器查找到,也就是我們寫的css選擇器是否能夠找到當前這個元素,舉個例子

  <div id="box">
    <p>
      <em></em>
    </p>
  </div>
  <script>
    var em = document.querySelector("em");
    console.log(em.matches("#box p > em")); //true;
    console.log(em.matches("#box div em")); //false;
  </script>

在事件委托中,我們經常需要去過濾某些元素,而這時這個方法就可以派上用場,比如下面這個例子

<div id="box">
  <div class="left">left</div>
  <div class="right">right</div>
</div>
<script>
  var box = document.querySelector("#box");
  box.addEventListener("click",function(event){
    if(event.target.matches("#box .left")){
      console.log(event.target);
    }
  });
</script>

雖然通過判斷標簽名,class等等也可以實現同樣的效果,但有了這個方法,實現起來就簡單的多了,如果你覺得這個例子不感冒,那么下面這段代碼,你應該用過吧?

$(document).on("click","#box a",function(){

});

其中第二個參數就是用來過濾元素的,如果要實現這個方法,我們就可以用matches。

normalize()

normalize() 方法移除空的文本節點,并連接相鄰的文本節點。

這個方法將遍歷當前節點的所有子孫節點,通過刪除空的 Text 節點,已經合并所有相鄰的 Text 節點來規范化文檔。該方法在進行節點的插入或刪除操作后,對于簡化文檔樹的結構很有用。

lastModified

document.lastModified可以返回文檔最后修改的日期,不過你很快會發現它并不準,因為對于動態網站來說,這個屬性返回的是當前時間,也正是因為這個原因,我們可以用它來判斷一個頁面是靜態的還是動態的,以下是在本地頁面測試的結果

而如果是一個動態的網站,則會出現下面這種情況

因此我們可以用這個屬性來判斷一個網站是靜態的還是動態的,但這個屬性獲取到的值也并不是特別準確,如果要求不是特別高的話,可以用這個方法試試。

scrollIntoView()

Element.scrollIntoView()方法讓當前的元素滾動到瀏覽器窗口的可視區域內,使用請看MDN上的教程

https://developer.mozilla.org/zh-CN/docs/Web/API/Element/scrollIntoView


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 AutoPoster 的頭像
    AutoPoster

    互聯網 - 大數據

    AutoPoster 發表在 痞客邦 留言(0) 人氣()