HTML DOM之document物件的屬性和方法

∩胖小喵喵∩發表於2018-06-25
W3C的DOM有2個版本:核心DOM和HTML DOM。核心DOM是一個語言獨立和模組獨立的API,它能夠在任何語言中實現,而不僅僅是在JavaScript中實現,例如JAVA DOM實現,XML DOM實現等。HTML DOM是網頁的物件導向的層次式的檢視,其中的物件對映了不同的HTML元素,例如HTMLParagraphElement代表了p標籤。其實所謂的DOM就是W3C定義的一套介面(interface),每個介面定義了一些屬性和方法,具體實現由瀏覽器實現。而HTML DOM其實就是繼承了核心DOM的介面,並在此基礎上新增HTML所獨有的屬性和方法,例如id。 


 一、HTML DOM之Document物件

當瀏覽器載入HTML文件時,它就會成為document物件。

1、獲取dom元素的幾種方法

1.1、根據id獲取dom元素

document.getElementById("myDiv");//靜態方法,返回帶有指定id的元素物件,{Object}


1.2、根據標籤名獲取dom元素

document.getElementsByTagName("div");//動態方法,返回指定標籤名的元素集合。


1.3、根據類名獲取dom元素

document.getElementsByClassName("example");//返回文件中所有指定類名的元素集合,作為NodeList物件。多個選擇器之間用空格分割。

document.getElementsByClassName("example color");


1.4、根據CSS選擇器字串獲取dom元素

<div id="myDiv" class="example exp">你好</div>

document.querySelector(".example.exp");//選擇器包含一個或多個要匹配的css選擇器,對於多個選擇器,使用逗號隔開,返回一個匹配的元素。。 返回文件中與指定選擇器或選擇器組匹配的第一個Element。 如果找不到匹配項,則返回null。

//注意:如果要匹配的ID或選擇器不符合 CSS 語法(比如不恰當地使用了冒號或者空格),你必須用反斜槓將這些字元轉義。由於 JavaScript 中,反斜槓是轉義字元,所以當你輸入一個文字串時,你必須將它轉義兩次(一次是為 JavaScript 字串轉義,另一次是為 querySelector 轉義):

<div id="foo\bar"></div>

<div id="foo:bar"></div>


console.log('#foo\bar') // "#fooar"

document.querySelector('#foo\bar') // 不匹配任何元素


console.log('#foo\\bar') // "#foo\bar"

console.log('#foo\\\\bar') // "#foo\\bar"

document.querySelector('#foo\\\\bar') // 匹配第一個div元素


document.querySelector('#foo:bar') // 不匹配任何元素

document.querySelector('#foo\\:bar') // 匹配第二個div


1.5、根據CSS選擇器字串獲取dom元素集合

document.querySelectorAll(".example,.exp");//選擇器是一個或多個CSS選擇器,這些選擇器由逗號隔開。返回的 NodeList 將包含文件中的所有節點,這些都是由特定選擇器匹配的。如果選擇器字串包含了一個CSS偽元素,將返回空的元素集合。


1.6、根據元素的 name 屬性值獲取dom元素集合

var a = document.getElementsByName("myname");//返回一個實時更新的 NodeList集合。

注意:name屬性只有在(X)HTML文件中可用。該方法返回一個live的 NodeList集合,這個集合包含name屬性為指定值的所有元素,例如<meta> 、<object>,甚至那些不支援name屬性但是新增了name自定義屬性的元素也包含其中。getElementsByName 在不同的瀏覽器其中工作方式不同。在IE和Opera中, getElementsByName() 方法還會返回那些id為指定值的元素。所以你要小心使用該方法,最好不要為元素的name和id賦予相同的值。


style物件下的具體屬性都有哪些?詳情參閱:http://www.runoob.com/jsref/dom-obj-style.html


2、document.activeElement,返回文件中當前獲得焦點的元素。


3、document.addEventListener(),向文件新增事件控制程式碼。用document.removeEventListener() 移除addEventListener()所新增的事件。IE8 及更早IE版本不支援 addEventListener() 方法,Opera 7.0 及 Opera 更早版本也不支援。但是,對於這類瀏覽器版本可以使用 attachEvent() 方法來新增事件控制程式碼(要注意跨瀏覽器相容問題)。


用法:document.addEventListener(event, function, useCapture);useCapture指定事件是否在捕獲或冒泡階段執行。true - 事件控制程式碼在捕獲階段執行;false- 預設。事件控制程式碼在冒泡階段執行。addEventListener() 方法新增的事件控制程式碼不會覆蓋已存在的事件控制程式碼,可以在文件中新增許多事件,新增的事件不會覆蓋已存在的事件,也可以新增不同型別的事件。例如:

document.addEventListener("click", myFunction);

document.addEventListener("click", someOtherFunction);


當傳遞引數值時,使用"匿名函式"呼叫帶引數的函式:

document.addEventListener("click",function(){

myFunction(p1, p2);

});


如果瀏覽器不支援 addEventListener() 方法, 你可以使用 attachEvent() 方法替代。以下例項演示了跨瀏覽器的解決方法:

if(document.addEventListener){//所有主流瀏覽器,除了 IE 8 及更早 IE版本

document.addEventListener("click", myFunction);

}else if(document.attachEvent){// IE 8 及更早 IE 版本

document.attachEvent("onclick", myFunction);

}


4、document.removeEventListener(event,function,useCapture);用於移除由 document.addEventListener()方法新增的事件控制程式碼。

注意: 如果要移除事件控制程式碼,addEventListener() 的執行函式必須使用外部函式,如上例項所示 (myFunction)。匿名函式,類似 "document.removeEventListener("event", function(){ myScript });"該事件是無法移除的。

提示使用 element.addEventListener()和element.removeEventListener()方法來新增或移除指定元素的事件控制程式碼。


注意:IE8及更早IE版本不支援removeEventListener()方法,Opera7及Opera更早版本也不支援。但是,對於這些不支援該函式的瀏覽器,你可以使用detachEvent()方法來移除由attachEvent()方法新增的事件控制程式碼(檢視"更多例項"瞭解跨瀏覽器的解決方案)。


注意:useCapture引數,如果新增兩次事件控制程式碼,一次在捕獲階段,一次在冒泡階段,你必須單獨移除該事件。


5、document.anchors,返回了當前頁面的所有超級連結陣列。注意:a連結沒有name屬性的不會被計入。


6、document.applets,返回對文件中所有Applet物件的引用(Applet物件是什麼)。


7、document.baseURI,獲取文件的基礎URL。除了IE瀏覽器,其他主流瀏覽器都支援 baseURI 屬性。


8、document.body,返回文件的body元素。


9、document.close(),用於關閉一個由window.open方法開啟的輸出流。


10、document.cookie,設定或返回與當前文件有關的 鍵/值 對的所有 cookies。


11、document.createAttribute(attributename),建立一個屬性節點,返回一個節點物件,示例:

var attr=document.createAttribute("class");

attr.value="democlass";(或者attr.nodeValue = "democlass";)

document.getElementsByTagName("p")[0].setAttributeNode(attr);


12、document.createComment(),建立註釋節點, 並插入HTML文件。示例:

var cText = document.createComment("My personal comments");

document.body.appendChild(c);


13、document.createDocumentFragment();

建立空的DocumentFragment物件,並返回此物件(文件片段)。該方法建立了一虛擬的節點物件,節點物件包含所有屬性和方法。當你想提取文件的一部分,改變,增加,或刪除某些內容及插入到文件末尾可以使用createDocumentFragment() 方法。你也可以使用文件的文件物件來執行這些變化,但要防止檔案結構被破壞,createDocumentFragment() 方法可以更安全改變文件的結構及節點。文件片段是個輕量級的document物件,它的設計初衷就是為了完成更新和移動節點這類任務。文件片段的一個便利的語法特性是當你附加一個片斷到節點時,實際上被新增的是該片斷的子節點,而不是片斷本身。只觸發了一次重排,而且只訪問了一次實時的DOM。可以提升效能。示例:

var frag=document.createDocumentFragment();

var son = document.createElement('p');

son.innerText = '子標籤';

frag.appendChild(son);

document.getElementsByClassName("empty")[0].appendChild(frag);


14、document.createElement(nodename);建立一個元素節點。元素節點可以自定義,並不一定需要是標準html元素名稱,且建立後的元素需要新增到body或者某個元素下,否則不顯示,示例:

var mydiv = document.createElement("mydiv");

var div = document.createElement("div");

div.innerText = "元素內容";(注意:如果這裡用div.nodeValue = "元素內容";則設定文字節點無效)

document.body.appendChild(mydiv);

document.body.appendChild(div);


15、document.createTextNode(text);建立一個文字節點。HTML元素通常是由元素節點和文字節點組成。示例:

var text = document.createTextNode("Hello World");

document.body.appendChild(text);


擴充:nodeValue、innerText、innerHTML和textContent區別?

(1)、nodeValue:僅僅對CDATA片段,註釋comment,Processing Instruction節點或text節點有效,對document, documentFragment, Element節點,返回值為null,也無法使用其進行內容的設定,如果要改變元素的文字節點,用element.childNodes[0].nodeValue。(注意:element.childNodes[0].nodeValue只可以用來修改元素已存在的文字節點,如果是沒有文字節點的元素需要新新增文字節點,用element.childNodes[0].nodeValue會報錯,這是需要用其他方法替代。),示例:

<div class="demo1"></div>

document.querySelector(".demo1").childNodes[0].nodeValue = "新增文字節點";//報錯


<div class="demo2"></div>

document.querySelector(".demo2").childNodes[0].nodeValue = "新增文字節點";//正確


(2)、innerHTML:瀏覽器會將內容解析為HTML,因此更慢。


(3)、innerText:與innerHTML類似,但是不會解析其中的html標籤。


(4)、textContent:使用純文字而不是解析為html,更快捷.(比innerHTML安全),如果在僅僅是要element節點改變文字,使用textContent。


textcContent、nodeValue和innerHMLT在改變元素文字節點的區別:三者都能用,但使用nodeValue容易造成困惑,innerTMLHTML效能差點,使用textContent最佳。


示例:var div = document.createElement("div");

var attr = document.createAttribute("class");

attr.value="new_div";

div.setAttributeNode(attr);

div.innerText = "新建div標籤";


document.body.appendChild(div);

alert(div.nodeValue);//null

alert(div.childNodes[0].nodeValue);//'新建div標籤'


16、document.doctype;返回HTML文件的文件型別物件,IE8及IE更早版本顯示HTML和XHTML文件時該屬性返回null,但是支援XML文件。


17、document.documentElement;返回文件的根節點,HTML文件返回物件為HTML元素。


18、document.documentMode;返回用於通過瀏覽器渲染文件的模式。IE8使用不同方式渲染頁面,基於!DOCTYPE或者某些存在的HTML元素。這些元素返回值如下:

5 - 頁面在 IE5 模式下展示

7 - 頁面在 IE7 模式下展示

8 - 頁面在 IE8 模式下展示

9 - 頁面在 IE9 模式下展示

注意:如果沒有指定!DOCTYPE,IE8以IE5模式渲染頁面。


19、document.documentURI;設定或返回文件的位置。


20、document.domain;返回當前文件的伺服器域名。


21、document.domConfig;返回normalizeDocument()被呼叫時所使用的配置。


22、document.embeds;返回文件中所有嵌入的內容(embed)集合。


23、document.forms;forms集合返回當前頁面所有表單的陣列集合。


24、document.images;返回當前文件中所有圖片的陣列。


25、document.implementation;返回處理該文件的 DOMImplementation 物件。


26、document.importNode(node,true);把一個節點從另一個文件複製到該文件以便應用。如果第二個值設定為true,那麼還要複製該節點的所有子孫節點。例項:

var frame=document.getElementsByTagName("iframe")[0];

var h=frame.contentWindow.document.getElementsByTagName("h1")[0];

var x=document.importNode(h,true);

注意:IE8及IE更早版本不支援該方法。


27、document.inputEncoding;返回當前文件的字元編碼。

注意: 除了Opera瀏覽器、IE8及更早IE版本不支援該屬性。


28、document.lastModified;返回文件最後被修改的日期和時間。


29、document.links;links集合返回當前文件所有連結的陣列。links集合計算<a href="">標籤和<area>標籤。


30、document.normalize();合併相鄰的文字節點並刪除空的文字節點。例項:

<p id="demo">點選一個按鈕來新增文字,點選另一個按鈕規範化文件</p>

<p>上面的段落有 <span id="cc">1</span>個子節點。</p>

<button onclick="addTextNode()">新增一個文字節點</button>

<button onclick="normPara()">規範文字</button>


function addTextNode(){

var y=document.createTextNode("Click again");

var x=document.getElementById("demo");

x.appendChild(y);

var z=document.getElementById("cc");

z.innerHTML=x.childNodes.length;

}

function normPara(){

document.normalize();

var x=document.getElementById("demo");

var z=document.getElementById("cc");

z.innerHTML=x.childNodes.length;

}


執行addTextNode方法後,p標籤文字內容增加了“Click again”,但是審查元素可以看出p標籤的佈局如下:

<p id="demo">

"點選一個按鈕來新增文字,點選另一個按鈕規範化文件"

"Click again"

</p>


執行normPara方法後,審查元素可以看出p標籤的佈局如下:

<p id="demo">點選一個按鈕來新增文字,點選另一個按鈕規範化文件Click again</p>


31、document.open(MIMEtype,replace);開啟一個輸出流來收集 document.write() 或 document.writeln() 方法輸出的內容。呼叫 open() 方法開啟一個新文件並且用 write() 方法設定文件內容後,必須記住用 document.close()方法關閉文件,並迫使其內容顯示出來。

注意:如果目標檔案已經存在,它將被清除。如果這個方法沒有引數,會顯示一個新視窗(about:blank)。

引數MIMEtype可選,規定正在寫的文件的型別,預設值是 "text/html"。

引數replace可選,當此引數設定後,可引起新文件從父文件繼承歷史條目。


32、document.readyState,返回當前文件的狀態,該屬性返回以下值:

uninitialized - 還未開始載入

loading - 載入中

interactive - 已載入,文件與使用者可以開始互動

complete - 載入完成


33、document.referrer;返回載入當前文件的來源文件的URL。如果當前文件不是通過超級連結訪問的,則為 null。這個屬性允許客戶端 JavaScript 訪問 HTTP 引用頭部。


34、document.adoptNode(node),從另外一個文件返回adapded節點到當前文件。


35、document.scripts;返回頁面中所有指令碼的集合。


36、document.title;設定或獲取當前文件的標題( HTML title 元素中的文字)。


37、document.URL;返回當前文件的URL。


38、document.write(exp1,exp2,exp3,...);向文件寫入HTML表示式或JavaScript程式碼。


39、document.writeln(exp1,exp2,exp3,...);與write()方法作用相同,外加可在每個表示式後寫一個換行符。writeln方法和write方法的區別例項:

document.write("Hello World!");

document.write("Have a nice day!");

文件展示:Hello World!Have a nice day!


document.writeln("Hello World!");

document.writeln("Have a nice day!");

文件展示:Hello World!

Have a nice day!  複製程式碼



相關文章