国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Javascript--DOM

jsyzchen / 1396人閱讀

摘要:中的所有對(duì)象都是以對(duì)象的形式實(shí)現(xiàn)的。這意味著中的對(duì)象與原生對(duì)象的行為或活動(dòng)特點(diǎn)并不一致。該屬性指向表示整個(gè)文檔的文檔節(jié)點(diǎn)。同時(shí)由要插入的節(jié)點(diǎn)占據(jù)其位置。返回被移除的節(jié)點(diǎn)。操作類(lèi)名操作類(lèi)名時(shí),需要通過(guò)屬性添加刪除和替換類(lèi)名。

Note:IE中的所有DOM對(duì)象都是以COM對(duì)象的形式實(shí)現(xiàn)的。這意味著IE中的DOM對(duì)象與原生Javascript對(duì)象的行為或活動(dòng)特點(diǎn)并不一致。

DOM1級(jí)主要定義了HTML和XML的文檔的底層結(jié)構(gòu)。DOM2和DOM3級(jí)分為幾個(gè)模塊。

DOM2級(jí)核心(DOM Level 2 Core):在1級(jí)核心基礎(chǔ)上構(gòu)建,為節(jié)點(diǎn)添加了更多方法和屬性

DOM2級(jí)視圖(DOM Level 2 Views):為文檔定義了基于樣式信息的不同視圖

DOM2級(jí)事件(DOM Level 2 Events):說(shuō)明了如何使用事件與DOM文檔交互

DOM2級(jí)樣式(DOM Level 2 Style):定義了如何以編程方式來(lái)訪問(wèn)和改變CSS樣式信息

DOM2級(jí)遍歷和范圍(DOM Level 2 Tranversal and Range):引入了遍歷DOM文檔和選擇其特定部分的新接口。

DOM2級(jí)HTML(DOM Level 2 HTML):在1級(jí)HTML基礎(chǔ)上構(gòu)建,添加了更多屬性、方法和新街口。

// 判斷是否支持模塊
var DOM2Core = document.implementation.hasFeature("Core",2.0)
DOM2級(jí)核心 Node
DOM1級(jí)定義了一個(gè)Node接口。該接口將由DOM中的所有節(jié)點(diǎn)類(lèi)型實(shí)現(xiàn)。
Javascript中的所有節(jié)點(diǎn)類(lèi)型都 繼承自Node類(lèi)型,因此所有節(jié)點(diǎn)類(lèi)型都共享著相同的基本屬性和方法。

兼容性:除IE外,其他所有瀏覽器都可以訪問(wèn)到這個(gè)類(lèi)型

節(jié)點(diǎn)類(lèi)型
每個(gè)節(jié)點(diǎn)都有一個(gè)nodeType屬性,用于表明節(jié)點(diǎn)的類(lèi)型。
節(jié)點(diǎn)類(lèi)型由在Node類(lèi)型中定義的12個(gè)數(shù)值常量來(lái)表示,下面列出常用的幾個(gè)。

Node.ELEMENT_NODE: 1

Node.TEXT_NODE: 3

Node.COMMENT_NODE: 8

節(jié)點(diǎn)信息
可以通過(guò)nodeNamenodeValue來(lái)了解節(jié)點(diǎn)信息。這兩個(gè)屬性取決于節(jié)點(diǎn)的類(lèi)型。
在使用這兩個(gè)節(jié)點(diǎn)之前,最好先檢測(cè)一下節(jié)點(diǎn)類(lèi)型。

如果節(jié)點(diǎn)是一個(gè)元素,nodeName中保存的始終是元素的標(biāo)簽名,而nodeValue值始終為0。

節(jié)點(diǎn)關(guān)系
每個(gè)節(jié)點(diǎn)都有一個(gè)childNodes屬性,其中保存著一個(gè)NodeList對(duì)象。NodeList對(duì)象是一種類(lèi)數(shù)組對(duì)象,用于保存一組有序的節(jié)點(diǎn),可以通過(guò)位置來(lái)訪問(wèn)這些節(jié)點(diǎn)。

hasChildNodes():這個(gè)方法在節(jié)點(diǎn)包含一個(gè)或多個(gè)子節(jié)點(diǎn)的情況下返回true。
ownerDocument:該屬性指向表示整個(gè)文檔的文檔節(jié)點(diǎn)。
// 將NodeList對(duì)象轉(zhuǎn)換為數(shù)組
var arrayOfNodes = Array.prototype.slice.call(someNode.childNodes,0);

兼容性:IE8以及更早版本將NodeList實(shí)現(xiàn)為一個(gè)COM對(duì)象,因此上面的代碼會(huì)導(dǎo)致錯(cuò)誤。

Note:NdoeList對(duì)象的特殊之處在于,它實(shí)際上是基于DOM結(jié)構(gòu)動(dòng)態(tài)執(zhí)行查詢的結(jié)果,因此DOM的變化能直接反映在NodeList對(duì)象之中。它是有生命的對(duì)象,而不是在我們第一次訪問(wèn)它在某一個(gè)瞬間拍下的快照。

操作節(jié)點(diǎn)

appendChild():用于向childNodes列表的末尾添加一個(gè)節(jié)點(diǎn)。返回新增的節(jié)點(diǎn)。

insertBefore():接收兩個(gè)參數(shù):要插入的節(jié)點(diǎn)和作為參照的節(jié)點(diǎn)。插入節(jié)點(diǎn)后,被插入的節(jié)點(diǎn)會(huì)變成參照節(jié)點(diǎn)的前一個(gè)同胞節(jié)點(diǎn)。同時(shí)被方法返回。

replaceChild():接收兩個(gè)參數(shù):要插入的節(jié)點(diǎn)和要替換的節(jié)點(diǎn)。要替換的節(jié)點(diǎn)將由這個(gè)方法返回并從文檔樹(shù)中移除。同時(shí)由要插入的節(jié)點(diǎn)占據(jù)其位置。

removeChild():接收一個(gè)參數(shù),即要移除的節(jié)點(diǎn)。返回被移除的節(jié)點(diǎn)。

這四個(gè)方法都是操作的某個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn),也就是說(shuō),要使用這幾個(gè)方法必須先取得父節(jié)點(diǎn)。另外并不是所有節(jié)點(diǎn)都有子節(jié)點(diǎn),如果在不支持子節(jié)點(diǎn)的節(jié)點(diǎn)上,調(diào)用了這些方法,將會(huì)導(dǎo)致錯(cuò)誤。

Note:

如果傳入到appendChild()中的節(jié)點(diǎn)已經(jīng)是文檔的一部分,那結(jié)果就是將該節(jié)點(diǎn)從原來(lái)的位置轉(zhuǎn)移到新位置。即可以將DOM樹(shù)看成是由一系列指針連接起來(lái)的,但任何DOM節(jié)點(diǎn)也不能同時(shí)出現(xiàn)在文檔中的多個(gè)位置上。

在使用replaceChild()插入一個(gè)節(jié)點(diǎn)時(shí),該節(jié)點(diǎn)的關(guān)系指針都會(huì)從被它替換的節(jié)點(diǎn)復(fù)制過(guò)來(lái)。從技術(shù)上來(lái)講,被替換的節(jié)點(diǎn)仍然還在文檔中,但它在文檔中已經(jīng)沒(méi)有了自己的位置。同樣的,removeChild()移除的節(jié)點(diǎn)也同樣為文檔所有,只不過(guò)在文檔中已經(jīng)沒(méi)有了自己的位置。

其他方法
有兩個(gè)方法是所有類(lèi)型節(jié)點(diǎn)都要的。

cloneNode():用于創(chuàng)建調(diào)用這個(gè)方法的節(jié)點(diǎn)的一個(gè)完全相同的副本。接收一個(gè)布爾值參數(shù),true:表示執(zhí)行深復(fù)制,也就是復(fù)制節(jié)點(diǎn)以及整個(gè)子節(jié)點(diǎn)樹(shù)。false:表示執(zhí)行淺復(fù)制,即只復(fù)制節(jié)點(diǎn)本身。

  • item 1
  • item 2
  • item 3
var myList = document.body.childNodes[1]; var deepList = myList.cloneNode(true); //3 (IE < 9)或7(其他瀏覽器) console.log(deepList.childNodes.length); // 使用childNodes屬性的建議 for (var i =0; i < ele.childNodes.length; i++){ if(childNodes[i].nodeType === 1) { // 執(zhí)行某些操作 } }

Note:

deepList.childNodes.length中的差異主要是因?yàn)镮E8以及更早版本與其他瀏覽器處理空白字符的方式不一樣。IE9以及之前版本不會(huì)為空白符創(chuàng)建節(jié)點(diǎn)。

cloneNode()方法不會(huì)復(fù)制添加到DOM節(jié)點(diǎn)中的Javascript屬性,例如事件處理程序等。這個(gè)方法只復(fù)制特性,在明確指定的情況下也復(fù)制子節(jié)點(diǎn),其他一切都不會(huì)復(fù)制。IE在此存在一個(gè)bug,即它會(huì)復(fù)制事件處理程序,所以建議,在復(fù)制之前最好先移除事件處理程序。

normalize():處理文檔樹(shù)種的文本節(jié)點(diǎn)。

Document類(lèi)型--nodeType=9
Javascript通過(guò)Document類(lèi)型表示文檔。HTMLDocument繼承自Document類(lèi)型
1.document對(duì)象是HTMLDocument對(duì)象的實(shí)例
2.document對(duì)象是window對(duì)象的一個(gè)屬性,可以將其作為全局對(duì)象進(jìn)行訪問(wèn)。
document instanceof HTMLDocument //true
HTMLDocument.__proto__ ==== Document //true

document作為我們操作文檔的一個(gè)公共接口存在。

document信息

document.URL:包含頁(yè)面完整的URL

document.domain:包含頁(yè)面的域名

document.referrer:保存著鏈接到當(dāng)前頁(yè)面的那個(gè)頁(yè)面的URL

在這三個(gè)屬性中只有domain是可以設(shè)置的。但由于安全方面的限制,也并非可以給domain設(shè)置任何值。

不能將這個(gè)屬性設(shè)置為URL中不包含的域

如果域名一開(kāi)始是松散的,那么不能將它設(shè)置為緊繃的。

// 假設(shè)頁(yè)面來(lái)自p2p.wrox.com域
document.domain = "wrox.com"; // 松散的,成功
document.domain = "nczonline.ne4t" // 出錯(cuò)
document.domain = "p2p.wrox.com"   // 緊繃的,出錯(cuò)

document.readyState:有兩個(gè)可能的值(HTML5新增)

loading:正在加載文檔

complete:已經(jīng)加載完文檔

document.compatMode:這個(gè)屬性的作用是告訴開(kāi)發(fā)人員瀏覽器采用了那些渲染模式(HTML5新增)

值等于"CSS1Compat",表明瀏覽器采用標(biāo)準(zhǔn)模式進(jìn)行渲染

值等于"BackCompat",表明瀏覽器在混雜模式下進(jìn)行渲染

document子節(jié)點(diǎn)

document.documentElement:獲得html元素的引用

document.body:獲得body元素的引用

document.head:獲得head元素的引用(HTML5新增)

document.title:包含title元素的中的文本

document.activeElement:這個(gè)屬性始終會(huì)引用DOM中當(dāng)前獲得了焦點(diǎn)的元素(HTML5新增)

Browser compatibility-head
Browser compatibility-activeElement

查找節(jié)點(diǎn)(元素節(jié)點(diǎn))
Document類(lèi)型為查元素提供了兩種方法,1,2
HTMLDocument類(lèi)型提供了方法,3

document.getElementById()

document.getElementsByName:這個(gè)方法會(huì)返回帶有給定name特性的元素,最常用于取得單選按鈕。同樣也返回 HTMLCollection對(duì)象。

HTMLCollection對(duì)象,可以通過(guò)length屬性訪問(wèn)元素長(zhǎng)度,通過(guò)[]方括號(hào)語(yǔ)法訪問(wèn)對(duì)象中的項(xiàng)。方括號(hào)中既可以是數(shù)字也可以是字符串的索引值。

創(chuàng)建節(jié)點(diǎn)

document.createElement():接收一個(gè)參數(shù),即要?jiǎng)?chuàng)建元素的標(biāo)簽名。
document.createTextNode():接收一個(gè)參數(shù),要插入節(jié)點(diǎn)中的文本。

特殊集合
這些集合都是HTMLCollection對(duì)象

document.anchors:包含文檔中帶name特性的>元素

document.forms:包含文檔中所有的

元素

document.images:包含文檔中所有的元素

document.links:包含文檔中所有帶href特性的a元素

Element類(lèi)型--nodeType=1
Element類(lèi)型用于表現(xiàn)HTML或XML元素。HTMLElement類(lèi)型繼承自Element類(lèi)型。并添加了一些屬性。

HTMLElement.__proto__ === Element// true

屬性
讀取

添加的屬性:可讀也可寫(xiě)

id

title

lang(很少使用)

dir(很少使用)

className:與元素的class特性對(duì)應(yīng)。

dataset:HTML5規(guī)定可以為元素添加非標(biāo)準(zhǔn)的屬性,但要添加前綴data-,目的是為元素提供與渲染無(wú)關(guān)的信息,或者提供語(yǔ)義信息。這些屬性可以任意添加,隨機(jī)命名,只要以data-開(kāi)頭即可。可以通過(guò)元素的dataset屬性來(lái)訪問(wèn)自定義屬性

    
var div = document.getElementById("bd"); console.log(div.id); console.log(div.className); console.log(div.title); console.log(div.lang); console.log(div.dir);
相關(guān)方法

getAttribute():一般只有在取自定義特性情況下,才會(huì)使用此方法

setAttribute():接收兩個(gè)參數(shù),要設(shè)置特性的特性名和值

removeAttribute():用于徹底刪除元素的特性

DOM methods dealing with element"s attributes:

attributes屬性
attributes屬性中包含一個(gè)NamedNodeMap,與NodeList類(lèi)似。
通常用于遍歷元素的特性。
function outputAttributes ( ele ) {
    var pairs = [],
    attrName,
    attrValue,
    i,
    len;

    for(i = 0; i < ele.attributes.length; i++) {
        attrName = ele.attributes[i].nodeName;
        attrValue = ele.attributes[i].nodeValue;
        pairs.push(attrName + "=" + attrValue + """)
    }
    pairs.join("");
}
操作類(lèi)名
操作類(lèi)名時(shí),需要通過(guò)className屬性添加、刪除、和替換類(lèi)名。因?yàn)?b>className是一個(gè)字符串,所以即使只修改字符串一部分,也必須每次都設(shè)置整個(gè)字符串的值。
    
// 刪除"user"類(lèi) // 首先取得類(lèi)名字字符并拆分成數(shù)組 var div = document.getElementsByTagName("div")[0]; var className = div.className.split(/s+/); // 找到要?jiǎng)h的類(lèi)名 var pos = -1, i, len for(i = 0,len = className.length;i < len;i++) { if(className[i] === "user") { pos = i; break; } } className.splice(i,1); // 把剩下的類(lèi)名拼成字符串并重新設(shè)置 div.className = className.join(" ");

為了從div中刪除class屬性中的"user",以上這些代碼都是必須的。很多javascript都實(shí)現(xiàn)了這個(gè)方法,以簡(jiǎn)化這些操作

classList
HTML5新增了一個(gè)操作類(lèi)名的方式,可以讓操作更簡(jiǎn)單也更安全。那就是為所有元素添加classList這個(gè)屬性。這個(gè)classList屬性是新集合類(lèi)型DOMTokenList的實(shí)例。這個(gè)屬性是只讀的,有一個(gè)表示自己包含多少元素的length屬性,而要取得每個(gè)元素可以使用item()方法,也可以使用方括號(hào)語(yǔ)法。如果你想修改classList屬性,那么可以通過(guò)它定義的以下幾個(gè)方法進(jìn)行修改。

add(value):將給定的字符串值添加到列表中。如果值已經(jīng)存在,就不添加了

remove(value):從列表中刪除給定的字符串

contain(value):表示列表中是否存在給定的值,如果存在則返回true,不存在返回false

toggle(value):如果列表中已經(jīng)存在給定的值,刪除它;如果列表中沒(méi)有給定的值,添加它

Browser Compatibility

插入標(biāo)記(HTML5新增)
insertAdjacentHTML():接收兩個(gè)參數(shù),插入位置和要插入的HTML文本

第一個(gè)參數(shù)必須是下列值之一:

beforebegin:在當(dāng)前元素之前插入一個(gè)緊鄰的同輩元素

afterbegin:在當(dāng)前元素之下插入一個(gè)新的子元素或在第一個(gè)子元素之前再插入新的子元素

beforeend:在當(dāng)前元素之下插入一個(gè)新的的子元素或在最后一個(gè)子元素之后插入新的子元素

afterend:在當(dāng)前元素之后插入一個(gè)緊鄰的同輩元素

瀏覽器兼容性

Text類(lèi)型--nodeType=3
包含的是可以照字面意思接收的純文本內(nèi)容。

HELLO WORLD!
合并文本節(jié)點(diǎn)
DOM文檔中存在相鄰的同胞文本節(jié)點(diǎn)很容易導(dǎo)致混亂,因?yàn)榉植磺迥膫€(gè)文本節(jié)點(diǎn)表示哪個(gè)字符串。

瀏覽器在解析文檔時(shí),永遠(yuǎn)不會(huì)創(chuàng)建相鄰的文本節(jié)點(diǎn)。

出現(xiàn)相鄰的文本節(jié)點(diǎn)只會(huì)作為執(zhí)行DOM操作的結(jié)果出現(xiàn)

如果在一個(gè)包含兩個(gè)或多個(gè)文本節(jié)點(diǎn)的父元素上調(diào)用,Node類(lèi)型的normalize()方法,則會(huì)將所有文本節(jié)點(diǎn)合并成一個(gè)節(jié)點(diǎn)。

var ele = document.createElement("div");
var text1 = document.createTextNode("Hello World!");
var text2 = document.createTextNode("Hi");
ele.appendChild(text1);
ele.appendChild(text2);

document.body.appendChild(ele)

console.log(ele.childNodes.length);// 2
ele.normalize();
console.log(ele.childNodes.length);// 1
分割文本節(jié)點(diǎn)
splitText():這個(gè)方法會(huì)將一個(gè)文本節(jié)點(diǎn)分成兩個(gè)文本節(jié)點(diǎn),即按照指定的位置分割nodeValue值。
var ele = document.createElement("div");
var text = document.createTextNode("Hello World!");
ele.appendChild(text);

document.body.appendChild(ele)

var newNode = ele.firstChild.splitText(5);
console.log(newNode.nodeValue);// " World"
操作表格
// 創(chuàng)建table
var table = document.createElement("table");
table.border = 1;
table.width = "100%";

// 創(chuàng)建tbody
var tbody = document.createElement("tbody");
table.appendChild(tbody);

// 創(chuàng)建第一行
tbody.insertRow(0);
tbody.rows[0].insertCell(0);
tbody.rows[0].cells[0].appendChild(document.createTextNode("Cell 1.1"));
tbody.rows[0].insertCell(1);
tbody.rows[0].cells[1].appendChild(document.createTextNode("Cell 2.1"));

// 創(chuàng)建第二行
tbody.insertRow(1);
tbody.rows[1].insertCell(0);
tbody.rows[1].cells[0].appendChild(document.createTextNode("Cell 1.2"));
tbody.rows[1].insertCell(1);
tbody.rows[1].cells[1].appendChild(document.createTextNode("Cell 2.1"));

// 添加到文檔中
document.body.appendChild(table);
選擇符API
可以通過(guò)Document類(lèi)型和Element類(lèi)型的實(shí)例調(diào)用他們。

1.querySelector()
2.querySelectorAll()

Browser Compatibility-querSelector
Browser Compatibility-querSelectorAll

Note:

不像如getElementsByTagName這樣的API, 通過(guò)以上兩個(gè)API返回的對(duì)象不是live的。也就是說(shuō)當(dāng)文檔改變的時(shí)候,他們不會(huì)改變。

具體來(lái)說(shuō),返回的值實(shí)際上是帶有所有屬性和方法的NodeList,而其底層實(shí)現(xiàn)則類(lèi)似于一組元素的快照,而非不斷對(duì)文檔進(jìn)行搜索的 動(dòng)態(tài)查詢。這樣實(shí)現(xiàn)可以避免使用NodeList對(duì)象通常會(huì)引起的大多數(shù)性能問(wèn)題

3.document.getElementsByTagName():返回包含0或多個(gè)元素的NodeList。在HTML文檔中,這個(gè)方法會(huì)返回一個(gè) HTMLCollection對(duì)象,作為一個(gè)動(dòng)態(tài)集合,該對(duì)象與NodeList非常相似。

4.getElementsByClassName():返回HTMLCollection對(duì)象,所以使用這個(gè)方法與使用getElementsByTagName()以及其他返回NodeList的DOM方法具有同樣的性能問(wèn)題

Browser Compatibility

關(guān)于NodeList
NodeList及其近親NameNodeMap和HTMLCollection這個(gè)三個(gè)集合都是動(dòng)態(tài)的。也就是說(shuō)每當(dāng)文檔結(jié)構(gòu)發(fā)生變化,他們都會(huì)得到更新。
本質(zhì)上:NodeList對(duì)象是在訪問(wèn)DOM文檔時(shí)實(shí)時(shí)運(yùn)行的查詢。
性能影響

DOM操作往往是Javascript程序中開(kāi)銷(xiāo)最大的部分,而因訪問(wèn)NodeList導(dǎo)致的問(wèn)題最大。一般來(lái)說(shuō),盡量減少訪問(wèn)NodeList的次數(shù)。因?yàn)槊看卧L問(wèn)NodeList,都會(huì)運(yùn)行一次基于文檔的查詢。所以,可以考慮將從NodeList取得的值緩存起來(lái)。或者盡量減少DOM操作

DOM2級(jí)遍歷和范圍 元素遍歷
對(duì)于元素間的空格,IE9以及之前不會(huì)返回文本節(jié)點(diǎn),而其他所有瀏覽器都會(huì)返回文本節(jié)點(diǎn)。這樣就導(dǎo)致了在使用childNodes和firstChild等屬性時(shí)的行為不一致。為了彌補(bǔ)這一差異。

Element Tranversal API為DOM元素添加了以下5個(gè)屬性

childElementCount:返回子元素(不包括文本節(jié)點(diǎn)和注釋)的個(gè)數(shù)

firstElementChild:指向第一個(gè)子元素;firstChild的元素版

lastElementChild:指向最后一個(gè)子元素;lastChild的元素版

previousElementSibling:指向前一個(gè)同輩元素;previousSibling的元素版

nexrtElementSibling:指向后一個(gè)同輩元素;nextSibling的元素版

Browser Compatibility

DOM2級(jí)樣式 訪問(wèn)元素的樣式 style對(duì)象
這個(gè)style對(duì)象是CSSStyleDeclaration的實(shí)例,包含著通過(guò)HTML的style特性指定的所有樣式信息,但不包含與外部樣式表經(jīng)層疊而來(lái)的樣式。

cssText

length

item(index)

getPropertyValue(propertyName)

removeProperty(propertyName)

setProperty(propertyName, value, priority)

getPropertyCSSValue(propertyName)

getPropertyPriority

parentRule

NOTE:

"DOM2級(jí)樣式"規(guī)范規(guī)定樣式對(duì)象上的相應(yīng)屬性名應(yīng)該是cssFloat。而IE則支持的是styleFloat

對(duì)于使用短劃線(例如background-image)的CSS屬性名,必須將其轉(zhuǎn)換成駝峰大小寫(xiě)形式,才能通過(guò)Javascript來(lái)訪問(wèn)。

計(jì)算樣式
getComputeStyle():
接收兩個(gè)參數(shù),第一個(gè)參數(shù)為,要取得計(jì)算樣式的元素和一個(gè)偽元素字符串。
返回一個(gè)CSSStyleDeclaration對(duì)象,其中包含當(dāng)前元素的所有計(jì)算的樣式。
// IE
var myDiv = document.getElementById("myDiv");
var computeStyle = myDiv.style.currentStyle

// 其他瀏覽器
var computeStyle = document.defaultView.getComputedStyle(myDiv, null)

NOTE:無(wú)論在哪個(gè)瀏覽器,所有計(jì)算的樣式都是只讀的。

操作樣式表
CSSStyleSheet類(lèi)型表示的是樣式表,包括通過(guò)元素的樣表和在

          <