1. 程式人生 > >js高階程式設計筆記7--DOM2和DOM3

js高階程式設計筆記7--DOM2和DOM3

選擇符API

Selectors API是由W3C發起制定的一個標準。致力於讓瀏覽器原生支援CSS查詢。

querySelector()方法

此方法接收一個CSS選擇符,返回與該模式匹配的第一個元素。如果沒有找到返回null.

var body = document.querySelector("body");
var myDiv = document.querySelector("#myDiv");
var selected = document.querySelector(".selector");
var img = document.body.querySelector("img.button"
);

如果傳入了不被支援的選擇符,querySelector()方法會丟擲錯誤。

querySelectorAll()方法

接收的引數與querySelector()方法一樣,但是返回的是一個NodeList的例項。

//取得所有<p>元素中的所有<strong>元素
var strongs = document.querySelectorAll("p strong");

matchesSelector()方法

傳入一個css選擇符,如果呼叫元素與該選擇符匹配,則返回true.很多瀏覽器還沒有支援matchesSelector()方法,各個瀏覽器實現的方法不同。如果要用則寫過包裝函式。

function matchesSelector(element,selector){
    if(element.matchesSelector){
        return element.matchesSelctor(selector);
    }else if(element.msMatchesSelector){
        return element.msMatchesSelector(selector);
    }else if(element.mozMatchesSelector){
        return element.mozMatchesSelector(selector);
    }else
if(element.webkitMatchesSelector){ return element.webkitMatchesSelector(selector); }else{ throw new Error("not supported"); } }

元素遍歷

對於元素間的空格,IE9及之前的版本不會返回文字節點,而其他瀏覽器都會返回文字節點。
為了彌補這一差異,Element Traversal規範新定義了一組屬性。
childElementCount:返回子元素(不包括文字節點和註釋)的個數。
firstElementChild:指向第一個子元素
lastElementChild:指向最後一個子元素。
previousElementSibling:指向前一個同輩元素。
nextElementSibling:指向後一個同輩元素。

HTML5擴充套件DOM

  1. getElementsByClassName()方法:接收一個引數,一個包含一或多個類名的字串,返回帶有指定類的所有元素的NodeList。
var selected = document.getElementById("myDiv").getElementByClassName("selected");
  1. classList屬性:HTML5新增了一種操作類名的方式。可以讓操作更簡單更安全。這個classList屬性時新集合型別DOMTokenList的例項。DOMTokenList有個length屬性,並有以下方法:
    add(value):將給定的字串新增到列表中。
    contains(value):表示列表中是否存在給定的值。
    remove(value):從列表中刪除指定的字串。
    toggle(value):如果存在則刪除,不存在則新增。
<div class="bd user disabled">...</div>

div.classList.remove("disabled");
div.classList.add("current");

支援classList屬性的瀏覽器有Firefox3.6+和Chrome.

焦點管理

HMTL5也添加了管理DOM焦點的功能。
document.activeElement:這個屬性始終會引用DOM中當前獲得了焦點的元素。

var button = document.getElementById("muButton");
button.focus();
alert(document.activeElement == button);//true

document.hasFocus()方法:用於確定文件是否獲得了焦點。

HTMLDocument的變化

HTML5擴充套件了HTMLDocument。
1. readyState屬性:有兩個可能的值:loading(正在載入文件(,complete(已經載入文件).

if(document.readyState == "complete"){
    //執行操作
}
  1. 相容模式
    為了區分頁面的模式是標準的還是混雜的。IE為此給document添加了一個名為compatMode的屬性。標準模式下,document.compatMode的值為”CSS1Compat”,混雜模式下為”BackCompat”.

document.head引用文件的元素。
document.charset:文件中實際使用的字符集。
document.defaultCharset:瀏覽器設定的文件預設的字符集。

自定義資料屬性

HTML5規定可以為元素新增非標準的屬性,但要新增字首data-.

<div id="mydiv" data-appId="12345" data-myname="nicholas"></div>

可以通過元素的dataset屬性來訪問自定義屬性的值。

var appId = div.dataset.appId;
var myName = div.dataset.myname;

插入文字

innerText:但firefox不支援
textContent:firefox支援

function getInnerText(element){
    return (typeof element.textContent == "string")?element.textContent:element.innerText;
}

css規則

CSSRule物件表示樣式表中的每一條規則。

div.box{
    background-color:blue;
    width:100px;
    height:200px;
}
假設這條規則位於頁面中的第一個樣式表中。
var sheet = document.styleSheets[0];
var rules = sheet.cssRules || sheet.rules;//取得規則列表
var rule = ruless[0];
alert(rule.selectorText);//div.box
alert(rule.style.cssText);//完整的CSS程式碼
alert(rule.style.backgroundColor);//blue

建立規則

insertRule(規則文字,表示在哪裡插入規則的索引).

sheet.insertRule("body{backgournd-color:silver}",0);

但IE8及更早版本不支援此方法,而是另外一個方法:

sheet.addRule("body{backgournd-color:silver}",0);

刪除規則

deleteRule(pos):接受一個引數,要刪除的規則的位置。
IE支援的方法removeRule()。

元素大小


  1. 偏移量。

offsetHeight:元素在垂直方向上佔用的空間大小。以畫素計。包括元素的高度,水平滾動條的高度、上邊框高度和下邊框高度。
offsetWidth:元素在水平方向上佔用的空間大小。
offsetLeft:元素的左外邊框至包含元素的左內邊框之間的畫素距離。
offsetTop:元素的上外邊框至包含元素的上內邊框之間的畫素距離。
offsetParent:對包含元素的引用。
取得元素的左偏移量(上偏移量類似原理)。

function getElementLeft(element){
    var actualLeft = element.offsetLeft;
    var current = element.offsetParent;
    while(current != null){
        acrualLeft += current.offsetLeft;
        current = current.offsetParent;
    }
    return actualLeft;
}

所有這些偏移量都是隻讀的,而且每次訪問他們都需要重新計算。因此儘量避免重複訪問這些屬性。
2. 客戶區大小
指的是元素內容及其內邊距所佔據的空間大小。
clientWidth:元素內容區域寬度加上左右內邊距寬度。
clientHeight:元素內容高度加上上下內邊距高度。
3. 滾動大小
scrollHeight:在沒有滾動條的情況下,元素內容的總高度。
scrollWidth:在沒有滾動條的情況下,元素內容的總寬度。
scrollLeft:被隱藏在內容區域左側的畫素數。通過設定這個屬性可變改變元素的滾動位置。
scrollTop:被隱藏在內容區域上方的畫素數。

遍歷

“DOM2級遍歷和範圍”模組定義了兩個用於完成順序遍歷DOM結構的型別:NodeIterator和TreeWalder.
能夠基於給定的起點對DOM結構執行深度優先的遍歷操作。檢測瀏覽器是否支援:

var supportsTraversals = document.implementation.hasFeature("Traversal","2.0);
var supportNodeIterator= (typeof document.createNodeIterator == "function");
var supportTreeWalder = (typeof document.createTreeWalder == "function");

document.createNodeIterator()方法接收四個引數:
root:想要作為搜尋起點的樹中的節點。
whatToShow:表示要訪問那些節點的數字程式碼。
filter:一個NodeFilter物件,或者一個表示接受還是拒絕某種特定節點的函式。
entityReferenceExpansion:布林值,表示是否要擴充套件實體引用。在HTML中沒有用。
whattoShow引數是一個位掩碼。

NodeFilter.SHOW_ALL:顯示所有型別的的節點。
NodeFilter.SHOW_ELEMENT:顯示元素節點。
NodeFilter.SHOW_TEXT:顯示文字節點。
等等。

可以使用按位或操作符來組合多個選型。

var whatToShow = NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT;

filter引數:可以傳入一個NodeFilter物件或者一個函式。
每個NodeFilter物件只有一個方法,及acceptNode()方法。如果應該訪問給定的節點該方法返回NodeFilter.FILTER_ACCEPT,如果不應該訪問則返回NodeFilter.FILGER_SKIP。
傳入的函式與acceptNode()方法類似。

var filter = {
    acceptNode:function(node){
        return node.tagName.toLowerCase() == "p"?NodeFilger.FILTER_ACCEPT:NodeFilter.FILTER_SKIP;
    }
};
var iterator = document.createNodeIterator(root,NodeFilter.SHOW_ELEMENT,filter,false);

NodeIterator物件有兩個方法,nextNode()和previousNode()。第一次呼叫nextNode()返回根節點。

var div = document.getElementById("mydiv");
var filter = function(node){
    return node.tagName.toLowerCase() == "li"?NodeFilger.FILTER_ACCEPT:NodeFilter.FILTER_SKIP;
};
var iterator = document.createNodeIterator(root,NodeFilter.SHOW_ELEMENT,filter,false);
var node = iterator.nextNode();
while(node !== null){
    alert(node.tagName);
    node = iterator.nextNode();
}

TreeWalker

TreeWalker是NodeIterator的一個更高階的版本。增加了很多方法。

parentNode():
firstChild():
lastChild():
nextSibling():
previousSibling():

document.createTreeWalker():同document.createNodeIterator方法一樣接收四個引數。

var walker = document.createTreeWalder(root,NodeFilter.SHOW_ELEMENT,filter,false);

TreeWalker型別還有一個currentNode屬性。由於IE中沒有TreeWalker型別,所有使用遍歷的跨瀏覽器解決方案非常少。

範圍

後續補上