JavaScript基礎(chǔ)知識(shí)總結(jié)——DOM

DOM

  • DOM的全稱叫做文本對(duì)象模型(Document Object Model);是w3c定義的一種訪問(wèn)html和xml文檔的標(biāo)準(zhǔn)旦事,它提供了一系列接口,為程序和腳本動(dòng)態(tài)地訪問(wèn)和更新文檔的內(nèi)容疯搅,結(jié)構(gòu)和樣式。
  • DOM將html或者xml文檔描繪成了一個(gè)由多節(jié)點(diǎn)構(gòu)成的結(jié)構(gòu)王带。如下便是DOM的節(jié)點(diǎn)層次圖
DOM節(jié)點(diǎn)層次圖

Node

  • 說(shuō)到DOM埂软,有一個(gè)不得不說(shuō)的概念叫做node。什么是node峻凫?DOM將html中的整個(gè)文檔(document)渗鬼,每個(gè)元素,注釋荧琼,每個(gè)元素的屬性(特性)等等都看作是文檔中的一個(gè)個(gè)節(jié)點(diǎn)譬胎,而這些節(jié)點(diǎn)都屬于node類型,就是說(shuō)這些節(jié)點(diǎn)有著共同的屬性和方法(nodeType命锄,nodeName堰乔,nodeValue),但是又有其自己獨(dú)立的屬性和方法脐恩。
    node總共有如下幾個(gè)類型(加粗的類型后面會(huì)詳細(xì)講解):
    1.Node.ELEMENT_NODE(1); 元素節(jié)點(diǎn)
    2.Node.ATTRIBUTE_NODE(2); 屬性節(jié)點(diǎn)
    3.Node.TEXT_NODE(3); 文本節(jié)點(diǎn)
    4.Node.CDATA_SECTION_NODE(4); CDATA 區(qū)段
    5.Node.ENTITY_REFERENCE_NODE(5); 實(shí)體引用元素
    6.Node.ENTITY_NODE(6); 實(shí)體
    7.Node.PROCESSING_INSTRUCTION_NODE(7); 表示處理指令
    8.Node.COMMENT_NODE(8); 注釋節(jié)點(diǎn)
    9.Node.DOCUMENT_NODE(9); 最外層的Root element,包括所有其它節(jié)點(diǎn)
    10.Node.DOCUMENT_TYPE_NODE(10); <!DOCTYPE………..>
    11.Node.DOCUMENT_FRAGMENT_NODE(11); 文檔碎片節(jié)點(diǎn)
    12.Node.OTATION_NODE(12); DTD 中聲明的符號(hào)節(jié)點(diǎn)
var firstChild1 = someNode.childNodes[0];
var firstChild2 = someNode.childNodes.item(0);
var childCount = someNode.childNodes.length;//指的是訪問(wèn)NodeList時(shí)其中包含的節(jié)點(diǎn)數(shù)量
var hasChild = someNode.hasChildNodes()
var parentNode = someNode.parentNode
var dNode  = someNode.ownerDocument

someNode.nodeName
someNode.nodeType  //IE中是數(shù)字(例如1,2,3...)镐侯;其他瀏覽器是字符串(例如Node.DOCUMENT_FRAGMENT_NODE)
someNode.nodeValue
  • nodeList對(duì)象
    一種類數(shù)組對(duì)象,可以通過(guò)[1,2,3...]來(lái)索引得到里面的元素,也可以使用item()索引驶冒,同時(shí)具備length屬性苟翻;但是nodeLIst對(duì)象和數(shù)組不一樣的是,這個(gè)對(duì)象是時(shí)刻更新的骗污,而不是某一個(gè)時(shí)刻獲取它的時(shí)候得到的快照崇猫。
//將nodeList對(duì)象轉(zhuǎn)換成數(shù)組
var nodes = somenode.childNode;    //childNode屬性可以返回一個(gè)nodeList對(duì)象來(lái)標(biāo)識(shí)節(jié)點(diǎn)的子節(jié)點(diǎn)
var array = [];
try{
      array = Array.prototype.slice.call(nodes,0)  
} catch (ex) {  //針對(duì)ie
       for(var i=0;i<nodes.length;i++){
            array.push(nodes[i]);
        }
}
  • 節(jié)點(diǎn)操作
somenode.appendChild(othernode)   //向末尾添加某個(gè)節(jié)點(diǎn)
somenode.insertBefore(newnode,innernode,null)  //向指點(diǎn)位置插入某個(gè)節(jié)點(diǎn)
somenode.replaceChild(newnode,innernode)   //替換某個(gè)節(jié)點(diǎn)
somenode.remove(innernode)    //移除某個(gè)節(jié)點(diǎn)

Document類型

  • 概念
    js中通過(guò)Document類型表示文檔。doucment對(duì)象是HTMLDocument(繼承自Document類型)的一個(gè)實(shí)例需忿,表示整個(gè)HTML頁(yè)面诅炉。
    Dcument節(jié)點(diǎn)的特征:
    1.nodeType值為9
    2.nodeName為"#document"
    3.nodeValue為null
    4.parentNode為null
    5.ownerDocument為null
    6.其子節(jié)點(diǎn)可能是一個(gè)DocumentType(最多一個(gè))蜡歹、Element(最多一個(gè))、processingInstruction或Comment涕烧。
  • 子節(jié)點(diǎn)
    1.documentElement和childNodes內(nèi)置的訪問(wèn)文檔子節(jié)點(diǎn)的快捷方式月而。
    2.documentElement始終指向HTML頁(yè)面中的<html>元素。
    3.作為HTMLDocument實(shí)例澈魄,document對(duì)象還有一個(gè)body屬性景鼠,直接指向<body>元素。
    4.Document另一個(gè)可能的子節(jié)點(diǎn)是DocumentType痹扇。通常將<!DOCTYPE>標(biāo)簽看成一個(gè)與文檔其它部分不同的實(shí)體铛漓,可以通過(guò)doctype屬性訪問(wèn)。
var html = document.documentElement;  //取得對(duì)html 引用
     alert(html == document.childNodes[0]);//true
     alert(html == document.firstChild);//true
var body = document.body; //取得對(duì)<body>引用
var doctype = document.doctype; //取得對(duì)<!DOCTYPE>引用
  • 文檔信息
    1.title屬性:包含著<title>元素中的文本鲫构∨ǘ瘢可以取得當(dāng)前頁(yè)面的標(biāo)題也可以修改。
    2.對(duì)網(wǎng)頁(yè)的請(qǐng)求有關(guān)的3個(gè)屬性:URL结笨、domain和referrer包晰。URL屬性包含頁(yè)面完整的URL,domain屬性中只包含頁(yè)面的域名炕吸,referrer屬性保存著諒解到當(dāng)前頁(yè)面的那個(gè)頁(yè)面的URL伐憾。在沒有來(lái)源頁(yè)面的情況下,referrer屬性中可能會(huì)包含空字符串赫模。所有這些信息都存在于HTTP頭部树肃,只不過(guò)通過(guò)這些屬性讓我們能夠在JavaScript中訪問(wèn)它們而已。
      var originalTitle = document.title;
      document.title = "New page title"

      var url = document.URL;
      var domain = document.domain;
      var referrer = document.referrer;
  • 查找元素
    1.getElemengById()接收一個(gè)參數(shù)瀑罗,要取得的元素的ID胸嘴。找到相應(yīng)元素放回該元素,否則返回null斩祭。如果頁(yè)面中多個(gè)元素的ID值相同劣像,則返回文檔中第一次出現(xiàn)的元素。
    2.getElementsByTagName()接收一個(gè)參數(shù)摧玫,要取得的元素的標(biāo)簽名耳奕,返回0或多個(gè)元素的NodeList。在HTML文檔中席赂,這個(gè)方法會(huì)返回一個(gè)HTMLCollection對(duì)象吮铭,最為一個(gè)動(dòng)態(tài)集合,該對(duì)象與NodeList非常相似颅停。HTMLCollection對(duì)象有一個(gè)叫做namedItem()的方法谓晌。使用這個(gè)方法可以通過(guò)元素的name特性取得集合中的項(xiàng)。
var div = document.getElementById("divId");

var images = document.getElementsByTagName("img");
alert(images.length);
alert(images[0].src);
alert(images.item(0).src);
var myImage = images.namedItem("myImage");
  • 特殊集合
    除了屬性和方法癞揉,document對(duì)象還有一些特殊的集合纸肉,這些集合都是HTMLCollection對(duì)象溺欧,包括:
    1.document.anchors,包含所有帶name特性的元素;
    2.document.forms:包含文檔中所有<form>元素
    3.document.images:包含文檔中所有圖像元素
    4.document柏肪。links:包含文檔href特性的元素

  • 文檔寫入
    document對(duì)象將輸出流寫入到網(wǎng)頁(yè)中的能力體現(xiàn)在下列4個(gè)方法中:write()姐刁、writeln()、open()和close()烦味。
    1.open() 打開網(wǎng)頁(yè)的輸出流
    2.write() 接收一個(gè)字符串參數(shù)聂使,要寫入到輸出流中的文本。write()原樣寫谬俄。
    3.writeln() 接收一個(gè)字符串參數(shù)柏靶,要寫入到輸出流中的文本。與write()不同的是溃论,writeln()會(huì)在字符串末尾添加換行符(\n)屎蜓。
    4.cloes()關(guān)閉網(wǎng)頁(yè)的輸出流。

Element類型

  • 概念
    js中通過(guò)Document類型表示文檔钥勋。doucment對(duì)象是HTMLDocument(繼承自Document類型)的一個(gè)實(shí)例炬转,表示整個(gè)HTML頁(yè)面。
    Dcument節(jié)點(diǎn)的特征:
    1.nodeType值為1
    2.nodeName的值是元素的標(biāo)簽名
    3.nodeValue的值為null算灸;
    4.parentNode可能是Doucment或Element扼劈;
    5.ownerDocument為null
    6.子節(jié)點(diǎn)可能是Element、Text菲驴、Comment测僵、ProcessingInstruction、CDATASection或EntityReference谢翎。
  • HTML元素
    所有HTML元素都由HTMLElement類型或者更具體的子類表示。HTMLElement直接繼承自Element并添加了一些屬性沐旨,分別對(duì)應(yīng)于每個(gè)HTML元素中都存在的標(biāo)準(zhǔn)特性
    1.id森逮,元素在文檔中的唯一標(biāo)識(shí)符
    2.title,有關(guān)元素的附加說(shuō)明信息磁携。
    3.lang褒侧,元素內(nèi)容的語(yǔ)言代碼。
    4.dir谊迄,語(yǔ)言的方向闷供,值為“l(fā)tr”(left-to-right)或“rtl”。
    5.className统诺,與元素的class特性對(duì)應(yīng)(class是ECMAScript的保留字)歪脏。
    可以通過(guò)上面的屬性獲取和修改相應(yīng)的特性。
var id = element.id;
var title = element.title;
var lang = element.lang;
var dir = element.dir;
var className = element.className;
  • 特性
    每個(gè)元素都有一個(gè)或多個(gè)特性粮呢,這些特性的用途是給出相應(yīng)元素或其內(nèi)容的附加信息婿失。
    1.getAttribute()可以獲得所有特性钞艇,包括自定義的特性,但是傳入的參數(shù)必須和特性的名稱相同(不區(qū)分大小寫)豪硅。
    2.有兩類特殊的屬性哩照,他們雖然有對(duì)應(yīng)屬性名,但是屬性值和getAttribute()返回的不相同懒浮。第一類是style屬性飘弧,getAttribute()返回css文本,而屬性則是一個(gè)對(duì)象砚著。第二類是時(shí)間處理程序次伶,getAttribute()返回js代碼而屬性是一個(gè)js函數(shù)。(IE7-返回的值與屬性相同)
    3.任何元素的所有特性也都可以通過(guò)DOM元素本身的屬性來(lái)訪問(wèn)赖草,但是只有公認(rèn)的特性才會(huì)以屬性的形式添加到DOM對(duì)象中(IE除外)学少。
    4.一般只在獲取自定義特性時(shí)才用getAttribute().
    5.setAttribute()方法接兩個(gè)參數(shù),第一個(gè)是特性名秧骑,第二個(gè)是特性值版确。通過(guò)這個(gè)方法設(shè)置的特性名會(huì)同一轉(zhuǎn)換為小寫。
    6.removeAttribute()徹底刪除元素的特性(IE6-不支持)乎折。
    7.atrributes()屬性包含一個(gè)NamedNodeMap绒疗,與NodeList類似,也是一個(gè)“動(dòng)態(tài)”的集合骂澄。元素的每一個(gè)特性都用一個(gè)Attr節(jié)點(diǎn)表示吓蘑,每個(gè)節(jié)點(diǎn)都保存在NamedNodeMap中。
<div a="xxx" 
  id="div" class="div" 
  style="width:40px;height:40px;background:red" 
  onclick="handler">
</div>
var element = document.getElementById("div")

//getAttribute()不區(qū)分大小寫
var class2 = element.getAttribute("CLASS") //獲取class屬性
var class1 = element.getAttribute("class");  //獲取class屬性

//getAttribute()和屬性返回的值不一樣
var style1 = element.getAttribute("style"); //文本字符串
var style2 = element.style;  //對(duì)象
function handler (argument) {
    alert("xxx");
    return "xxx";
}
var handler1 = element.getAttribute("onclick");   //function handler(){handler};
var handler2 = element.onclick;   //handler

//getAttribute()可以獲取自定義屬性
var a = element.getAttribute("a");  //xxx
var a1 = element.a  //undefined

//setAttribute()可以設(shè)置屬性
element.setAttribute("style", "width:40px;height:40px;background:blue");

//removeAttribute()可以刪除屬性
element.removeAttribute("a");  //徹底刪除了屬性a

//attributes()獲取屬性集合
var a = element.attributes;  //獲取屬性集合
  • 創(chuàng)建元素
    可以通過(guò)document.createElement()來(lái)創(chuàng)建一個(gè)元素節(jié)點(diǎn)坟冲。有兩種方法:
    1.接收你所要?jiǎng)?chuàng)建的元素的標(biāo)簽名
    2.接收一個(gè)字符串磨镶;
var element = document.createElement("div")  //創(chuàng)建一個(gè)div標(biāo)簽
var element = document.createElement("<div></div>") //創(chuàng)建一個(gè)div標(biāo)簽
  • 元素的子節(jié)點(diǎn)
    對(duì)元素的子元素節(jié)點(diǎn)進(jìn)行操作的正確方法應(yīng)該是:
for(var i=0;i<element.childNodes.length;i++){
    if(element.childNodes[i].nodeType==1){
    }
}

Text類型

  • 概念
    文本節(jié)點(diǎn)由 Text 類型表示,包含的是可以照字面解釋的純文本內(nèi)容健提。純文本中可以包含轉(zhuǎn)義后的 HTML 字符琳猫,但不能包含 HTML 代碼。Text 節(jié)點(diǎn)具有以下特征:
    1.nodeType 3
    2.nodeName '#text'
    3.nodeValue 節(jié)點(diǎn)所包含的文本
    4.parentNode Element
  • 操作
    1.document.createTextNode() 接收一個(gè)參數(shù):要?jiǎng)?chuàng)建的文本節(jié)點(diǎn)中的文本私痹。
    2.normalize()合并相鄰文本節(jié)點(diǎn)
    3.plitText() 將一個(gè)文本節(jié)點(diǎn)分成兩個(gè)文本節(jié)點(diǎn)脐嫂,接收一個(gè)參數(shù)代表切割開始的地方。
var element = document.createElement('div');
element.className = 'message';
var textNode = document.createTextNode('Hello');  //創(chuàng)建第一個(gè)文本節(jié)點(diǎn)
var anotherTextNode = document.createTextNode('World');  //創(chuàng)建另一個(gè)文本節(jié)點(diǎn)
element.appendChild(textNode);
element.appendChild(anotherTextNode);

element.normalize();   //合并文本節(jié)點(diǎn)
var newNode = element.firstChild.splitText(5);  //以第五個(gè)字符為分界切割文本

Attr類型

  • 概念
    元素的特性在 DOM 中以 Attr 類型來(lái)表示紊遵。在所有瀏覽器中都可以訪問(wèn) Attr 類型的構(gòu)造函數(shù)和原型账千。從技術(shù)角度來(lái)講,特性就是存在于元素的 attributes 屬性中的節(jié)點(diǎn)暗膜。特性節(jié)點(diǎn)具有下列特征:
    1.nodeType 2
    2.nodeName 特性名稱
    3.nodeValue 特性的值
    4.parentNode null
  • 操作
    1.Attr 對(duì)象有三個(gè)屬性匀奏,name value specified。其中桦山,name 是特性名稱攒射,value 是特性的值醋旦,specified 是布爾值,用以區(qū)別特性是代碼中指定的還是默認(rèn)的会放。
    2.使用 document.createAttribute() 并傳入特性的名稱可以創(chuàng)建新的特性節(jié)點(diǎn)饲齐。
var attr = document.createAttribute('align');
attr.value = 'left';
element.setAttributeNode(attr);

最后最后最后介紹一下:動(dòng)態(tài)腳本

function loadScript(url) {
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = url;
    document.body.appendChild(script);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市咧最,隨后出現(xiàn)的幾起案子捂人,更是在濱河造成了極大的恐慌,老刑警劉巖矢沿,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滥搭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡捣鲸,警方通過(guò)查閱死者的電腦和手機(jī)瑟匆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)栽惶,“玉大人愁溜,你說(shuō)我怎么就攤上這事⊥獬В” “怎么了冕象?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)汁蝶。 經(jīng)常有香客問(wèn)我渐扮,道長(zhǎng),這世上最難降的妖魔是什么掖棉? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任墓律,我火速辦了婚禮,結(jié)果婚禮上幔亥,老公的妹妹穿的比我還像新娘只锻。我一直安慰自己,他們只是感情好紫谷,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捐寥,像睡著了一般笤昨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上握恳,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天瞒窒,我揣著相機(jī)與錄音,去河邊找鬼乡洼。 笑死崇裁,一個(gè)胖子當(dāng)著我的面吹牛匕坯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拔稳,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼葛峻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了巴比?” 一聲冷哼從身側(cè)響起术奖,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎轻绞,沒想到半個(gè)月后采记,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡政勃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年唧龄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奸远。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡既棺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出然走,到底是詐尸還是另有隱情援制,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布芍瑞,位于F島的核電站晨仑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏拆檬。R本人自食惡果不足惜洪己,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望竟贯。 院中可真熱鬧答捕,春花似錦、人聲如沸屑那。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)持际。三九已至沃琅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蜘欲,已是汗流浹背益眉。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人郭脂。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓年碘,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親展鸡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子屿衅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

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

  • 盡管DOM作為API已經(jīng)十分完善了,但是為了更多的功能娱颊,仍然會(huì)有一些專有的擴(kuò)展傲诵。 選擇符API 為了讓讓瀏覽器原生...
    More_5897閱讀 188評(píng)論 0 0
  • 之前通過(guò)深入學(xué)習(xí)DOM的相關(guān)知識(shí),看了慕課網(wǎng)DOM探索之基礎(chǔ)詳解篇這個(gè)視頻(在最近看第三遍的時(shí)候箱硕,準(zhǔn)備記錄一點(diǎn)東西...
    微醺歲月閱讀 4,459評(píng)論 2 62
  • 本章內(nèi)容 理解包含不同層次節(jié)點(diǎn)的 DOM 使用不同的節(jié)點(diǎn)類型 克服瀏覽器兼容性問(wèn)題及各種陷阱 DOM 是針對(duì) HT...
    悶油瓶小張閱讀 626評(píng)論 0 1
  • 我不知道 風(fēng)往哪裡吹拴竹, 雪往哪裡下, 雨滴將落往何處剧罩。 我不知道栓拜, 花朵向哪裡開, 蝴蝶向哪裡飛惠昔, 蜜蜂將在何處停...
    許雅茉閱讀 218評(píng)論 0 2
  • 中國(guó)特色社會(huì)主義進(jìn)入了新時(shí)代幕与,青年興則國(guó)家興,青年強(qiáng)則國(guó)家強(qiáng)镇防。 青年一代有理想啦鸣、有本領(lǐng)、有擔(dān)當(dāng)来氧,國(guó)...
    二苗_5c0f閱讀 154評(píng)論 0 1