js DOM(1)

什么是DOM砚蓬?
DOM 是 JavaScript 操作網(wǎng)頁的接口瞪慧,全稱為“文檔對象模型”(Document Object Model)。它的作用是將網(wǎng)頁轉(zhuǎn)為一個 JavaScript 對象,從而可以用腳本進行各種操作(增刪改查)。通過 HTML DOM介劫,可訪問 JavaScript HTML 文檔的所有元素。DOM 使 JavaScript 有能力對 HTML 事件做出反應案淋。

DOM 樹
瀏覽器會根據(jù) DOM 模型座韵,將結(jié)構(gòu)化文檔(比如 HTML 和 XML)解析成一系列的節(jié)點,再由這些節(jié)點組成一個樹狀結(jié)構(gòu)(DOM Tree)踢京。

節(jié)點 node
DOM的最小組成單位就是node誉碴。檔的樹形結(jié)構(gòu)(DOM 樹),就是由各種不同類型的節(jié)點組成瓣距。每個節(jié)點可以看作是文檔樹的一片葉子黔帕。
節(jié)點的7種類型
Document:整個文檔樹的頂層節(jié)點
DocumentType:doctype標簽(比如<!DOCTYPE html>)
Element:網(wǎng)頁的各種HTML標簽(比如<body>、<a>等)
Attribute:網(wǎng)頁元素的屬性(比如class="a" src='img/a.png')
Text:標簽之間或標簽包含的文本
Comment:注釋
DocumentFragment:文檔的片段 //不常用

Text類型
文本節(jié)點由Text 類型表示蹈丸,包含的是可以照字面解釋的純文本內(nèi)容成黄。純文本中可以包含轉(zhuǎn)義后的
HTML 字符,但不能包含HTML 代碼白华。Text 節(jié)點具有以下特征:
? nodeType 的值為3慨默;
? nodeName 的值為”#text”贩耐;
? nodeValue 的值為節(jié)點所包含的文本弧腥;
? parentNode 是一個Element;
? 不支持(沒有)子節(jié)點潮太。

擴展:獲取文本內(nèi)容
1 .innerHTML
從對象的起始位置到終止位置的全部內(nèi)容,包括Html標簽管搪。
innerHTML可以作為獲取文本的方法也可以作為修改文本內(nèi)容的方法
element.innerHTML 會直接返回element節(jié)點下所有的HTML化的文本內(nèi)容
!注意 innerHTML方法只能作用于元素節(jié)點調(diào)用铡买;文本節(jié)點并不能使用這個方法返回undefined

innerText 與 innerHtml 都是打印標簽之間的文本信息

1更鲁、innerText 打印標簽之間的純文本信息,會將標簽過濾掉奇钞,低版本的火狐瀏覽器不支持澡为,而是支持textContent
2、innerHtml 打印標簽之間的內(nèi)容景埃,包括標簽和文本信息媒至,各瀏覽器都支持顶别,但是高版本的瀏覽器會原樣打印
innerText 與 innerHtml不僅在獲取元素文本上有區(qū)別,而且在設(shè)置上同樣有區(qū)別拒啰。
1驯绎、innerText 在設(shè)置HTML標簽時,會將<>進行轉(zhuǎn)義谋旦,在輸出的時候會原樣輸出剩失,并不會解析HTML標簽
2、innerHtml 在設(shè)置HTML標簽時册着,瀏覽器會將HTML標簽名解析成對應的標簽

2.3 textContent
textContent與innerHTML方法類似會返回對象節(jié)點下所有的文本內(nèi)容
但是區(qū)別為 textContent返回的內(nèi)容只有去HTML化的文本節(jié)點的內(nèi)容 如上例:
document.body.textContent //返回"文本文本" 拴孤!注意在DOM中標簽換行產(chǎn)生的空白字符會計入DOM中作為文本節(jié)點
另外IE8以前不支持textContent屬性

2.4 innerText
從起始位置到終止位置的內(nèi)容, 但它去除Html標簽
innerText方法與textContent方法類似 并且和innerHTML一樣也是作用于元素節(jié)點上
但是瀏覽器對于這兩種方法解析空白字符的機制不一樣;不是很常用
類似的還有outText outHTML等類似操作文本相關(guān)的方法
outerHTML 設(shè)置或獲取對象及其內(nèi)容的 HTML 形式

除了包含innerHTML的全部內(nèi)容外, 還包含對象標簽本身甲捏。

outerText 設(shè)置(包括標簽)或獲取(不包括標簽)對象的文本


最后要提醒一點:文本與文本節(jié)點一定要區(qū)分乞巧,有些方法是依靠元素節(jié)點返回子文本內(nèi)容,有些方法是文本節(jié)點返回自身文本內(nèi)容摊鸡,文本節(jié)點是對象而文本只是字符串绽媒;

innerHTML是符合W3C標準的屬性,而innerText只適用于IE瀏覽器

注意:瀏覽器在解析節(jié)點中空白符時免猾,會把它當作文本節(jié)點是辕。因為瀏覽器的差異在對于非空文本節(jié)點前面或后面有空格或換行符等特殊的文本字符組成,IE和FF就會產(chǎn)生分歧猎提,IE會忽略這些節(jié)點获三,而FF則認可這些節(jié)點。分歧產(chǎn)生的原因是FF認為<dl> 和</dl>,<dt>和</dt>,<dd>和</dd>之間的空白節(jié)點也是一個單獨的節(jié) 點锨苏,所說FF的結(jié)果是5疙教,而IE的結(jié)果是2。

由于元素書寫時存在空白換行符等伞租,所以導致在操作DOM節(jié)點出現(xiàn)問題贞谓,所以在遍歷子節(jié)點時應該對文本節(jié)點做特殊處理,可以利用Document類型的nodeType屬性過濾文本節(jié)點:
例:根據(jù)NodeType來判斷:var td = document.getElementById("TEST");
var childs=[],i,len,node;
for(i=0,len=td.childNodes.length;i<len;i++){
node=td.childNodes[i];
//過濾文本節(jié)點
if(node.nodeType!=3){
childs.push(node);
}
}
alert(childs.length); //結(jié)果為2

節(jié)點的屬性:

nodeType
nodeType屬性返回一個整數(shù)值葵诈,表示節(jié)點的類型裸弦。
文檔節(jié)點(document):9
元素節(jié)點(element):1
屬性節(jié)點(attribute):2
文本節(jié)點(text):3
文檔片斷節(jié)點(DocumentFragment):11
文檔類型節(jié)點(DocumentType)10
注釋節(jié)點(Comment):8,

nodeName
nodeName 返回節(jié)點的名稱
文檔節(jié)點(document):#document
元素節(jié)點(element):大寫的標簽名
屬性節(jié)點(attr):屬性的名稱
文本節(jié)點(text):#text
文檔片斷節(jié)點(DocumentFragment):#document-fragment
文檔類型節(jié)點(DocumentType):文檔的類型
注釋節(jié)點(Comment):#comment

nodeValue
nodeValue 返回節(jié)點的文本值作喘,可讀可寫
nodeValue是一個HTML DOM的對象屬性理疙;
同樣的 可以通過 nodeValue設(shè)置節(jié)點的文本內(nèi)容也可以直接返回文本內(nèi)容
直接用節(jié)點對象調(diào)用就都可以: 如上例
document.getElementsByTagName(div)[0].childNodes[0].nodeValue //返回“文本”
另外 nodeValue 屬性并不只存在于文本節(jié)點下 元素節(jié)點和屬性節(jié)點對象也都具有nodeValue屬性
屬性節(jié)點的 nodeValue屬性返回屬性值
元素節(jié)點的 nodeValue屬性返回null

節(jié)點的屬性 textContent 返回當前節(jié)點和他所有后代節(jié)點的文本。忽略標簽泞坦。
例:<div id="div">我是 <span>span</span> </div>
document.getElementById('div').textContent //我是span
同樣textContent也是一個可讀可寫的屬性窖贤。如果寫入的內(nèi)容包含標簽, 也會把標簽當做文本。
例:div.textContent='<p>我是p</p>'

nextSibling:
nextSibling 返回當前節(jié)點的下一個兄弟節(jié)點
例:<div id="d1">hello</div><div id="d2">world</div>
var div1 = document.getElementById('d1');
div1.nextSibling
sibling:就是兄弟的意思
next:下一個的意思
previous:前一個的意思
如果不存在下一個兄弟節(jié)點則返回null

a赃梧、下一個兄弟節(jié)點=節(jié)點.nextElementSibling || 節(jié)點.nextSibling

①.nextSibling: 調(diào)用者是節(jié)點在IE678中指下一個元素節(jié)點(標簽),在火狐谷歌IE9+以后都指的是下一個節(jié)點(包括空文檔和換行節(jié)點).
②. nextElementSibling:在火狐谷歌IE9都指的是下一個元素節(jié)點
總結(jié):在IE678中用nextSibing,在火狐谷歌IE9+以后用nextElementSibing

perviousSibling:

b择吊、前一個兄弟節(jié)點=節(jié)點.previousElemnentSibling || 節(jié)點.previousSibling

①. previousSibling:調(diào)用者是節(jié)點,IE678中指前一個元素節(jié)點(標簽).在火狐谷歌IE9+以后都指的是前一個節(jié)點(包括空文檔和換行節(jié)點)
②. previousElementSibling:在火狐谷歌IE9都指的是下一個元素節(jié)點
總結(jié):在IE678中用previousSibling,在火狐谷歌IE9+以后用previousElementSibling

firstchild:
3 單個子節(jié)點
a、第一個子節(jié)點=父節(jié)點.firstElementChild || 父節(jié)點.firstChild

①.first:調(diào)用者是父節(jié)點,IE678中指第一個子元素節(jié)點(標簽).在火狐谷歌IE9+以后都指的是第一個節(jié)點(包括文檔和換行節(jié)點)
②. firstElementChild:在火狐谷歌IE9都指的第一個元素節(jié)點

lastchild:
b槽奕、最后一個子節(jié)點=父節(jié)點.lastElementChild ||父節(jié)點.lastChild

①. lastChild:調(diào)用者是父節(jié)點,IE678中指最后一個子元素節(jié)點(標簽),在火狐谷歌IE9+以后都指的是最后一個節(jié)點(包括空文檔和換行節(jié)點)
②. lastElementChild:在火狐谷歌IE9+都指的是最后一個元素節(jié)點

childNodes:
所有子節(jié)點

a几睛、子節(jié)點數(shù)組=父節(jié)點.childNodes 獲取所有節(jié)點,是一個nodelist數(shù)據(jù)
ChildNodes:它是標準屬性,他返回指定元素的子元素集合(返回當前所有的子節(jié)點)粤攒,包括HTML節(jié)點 所有屬性 文本節(jié)點 (它是W3C的親兒子)
火狐 谷歌等高版本會把換行也看做是子節(jié)點

*   ①.nodeType = 1 表示的是元素節(jié)點 記住 元素就是標簽
*   ②. nodeType = 2 表示屬性節(jié)點
*   ③. nodeType = 3 表示文本節(jié)點
  • b所森、子節(jié)點數(shù)組=父節(jié)點.children; 用的最多
    children:非標準屬性,他只返回指定元素的子元素集合(返回當前所有的元素子節(jié)點),
    但他只返回HTML節(jié)點,甚至不反悔文本節(jié)點,雖然不是標準的DOM屬性,但他和innerHTML方法一樣,得到了幾乎所有瀏覽器的支持,
    children 在IE678中包含注釋節(jié)點,
    在IETF78中,注釋節(jié)點不要寫在里面

節(jié)點自己.parentNode.children[index]; 隨意得到兄弟節(jié)點
獲取所有的兄弟節(jié)點
function siblings(elm){
var a=[ ];
var p=elm.parentNode.children;
for(var i=0;i<p.length;i++){
if(p[i] !==elem){
a.push(p[i]);
}
}
return a;
}

父節(jié)點(parentNode夯接、parentElement)
parentNode,parentElement 區(qū)別
parentElement 和 parentNode一樣,但parentNode是W3C標準的焕济,而parentElement 只在IE中可用.

firstChild,lastChild,nextSibling,previousSibling都會將空格或者換行當做節(jié)點處理,但是有代替屬性
所以為了準確地找到相應的元素盔几,會用
firstElementChild,
lastElementChild,
nextElementSibling,
previousElementSibling
兼容的寫法晴弃,這是JavaScript自帶的屬性。
但壞消息是IE6,7,8不兼容這些屬性逊拍。IE9以上和火狐谷歌支持上鞠。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市芯丧,隨后出現(xiàn)的幾起案子芍阎,更是在濱河造成了極大的恐慌,老刑警劉巖缨恒,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谴咸,死亡現(xiàn)場離奇詭異,居然都是意外死亡骗露,警方通過查閱死者的電腦和手機岭佳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來萧锉,“玉大人珊随,你說我怎么就攤上這事【允睿” “怎么了玫恳?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長优俘。 經(jīng)常有香客問我,道長掀序,這世上最難降的妖魔是什么帆焕? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上叶雹,老公的妹妹穿的比我還像新娘财饥。我一直安慰自己,他們只是感情好折晦,可當我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布钥星。 她就那樣靜靜地躺著,像睡著了一般满着。 火紅的嫁衣襯著肌膚如雪谦炒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天风喇,我揣著相機與錄音宁改,去河邊找鬼。 笑死魂莫,一個胖子當著我的面吹牛还蹲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播耙考,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼谜喊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了倦始?” 一聲冷哼從身側(cè)響起锅论,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎楣号,沒想到半個月后最易,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡炫狱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年藻懒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片视译。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡嬉荆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出酷含,到底是詐尸還是另有隱情鄙早,我是刑警寧澤,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布椅亚,位于F島的核電站限番,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏呀舔。R本人自食惡果不足惜弥虐,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧霜瘪,春花似錦珠插、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缤底,卻和暖如春顾患,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背训堆。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工描验, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坑鱼。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓膘流,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鲁沥。 傳聞我的和親對象是個殘疾皇子呼股,可洞房花燭夜當晚...
    茶點故事閱讀 45,926評論 2 361

推薦閱讀更多精彩內(nèi)容

  • ??DOM(文檔對象模型)是針對 HTML 和 XML 文檔的一個 API(應用程序編程接口)彭谁。 ??DOM 描繪...
    霜天曉閱讀 3,657評論 0 7
  • ??DOM 1 級主要定義的是 HTML 和 XML 文檔的底層結(jié)構(gòu)猜憎。 ??DOM2 和 DOM3 級則在這個結(jié)構(gòu)...
    霜天曉閱讀 1,453評論 1 3
  • DOM DOM內(nèi)容主要分為四部分: 什么是DOM和節(jié)點壕吹; 獲取節(jié)點迟杂; 節(jié)點操作(3種)蓬蝶; 屬性操作(3種)。 什么...
    magic_pill閱讀 781評論 0 1
  • ??盡管 DOM 作為 API 已經(jīng)非常完善了,但為了實現(xiàn)更過的功能井辜,仍然會有一些標準或?qū)S械臄U展绎谦。 ??2008...
    霜天曉閱讀 430評論 0 0
  • logging模塊為應用程序提供了靈活的手段記錄事件、錯誤粥脚、警告和調(diào)試信息窃肠。通過日志我們可以分析到錯誤在什么地方,...
    kris_lp閱讀 5,857評論 0 3