首頁  >  文章  >  web前端  >  JavaScript文檔物件模型-Document類型

JavaScript文檔物件模型-Document類型

黄舟
黄舟原創
2017-01-20 14:27:561498瀏覽

JavaScript透過Document類型來表示文件。在瀏覽器中,document物件是HTMLDocument的一個實例,表示整個HTML頁面。而且Document物件是window物件的實例,因此可以將它當作全域物件來存取。 Document類型節點具有以下的一些特性:

  • nodeType的值為9。

  • nodeName的值為「#document」。

  • nodeValue的值為null。

  • parentNode的值為null。

它的子節點可能是一個DocumentType(最多一個)、Element(最多一個)、ProcessingInstruction或Comment。

Document類型可以表示HTML頁面或其它基於XML的文件。最常見的應用是作為HTMLDocument實例的document物件。透過這個文檔對象,不僅可以取得與頁面相關的信息,而且還能操作頁面的外觀和它底層的結構。

 文件的子節點

雖然DOM標準規定Document節點的子節點可以是DocumentType、、Element、ProcessingInstruction或Comment,但還有兩個內建的存取它的子節點的捷徑。第一個是documentElement屬性,該屬性總是指向HTML頁面的元素。另一個是透過childNodes清單存取文件元素,但是透過documentElement屬性能夠更快捷的存取該元素。以下是一個例子:

<html>
    <body>
         
    </body>
</html>

上面的頁面經過瀏覽器解析之後,其文件中只包含一個子節點,及元素。透過documentElement屬性和childNodes清單來存取這個元素的程式碼如下:

//取得<html>元素的引用
var html = document.documentElement;
alert(html === document.childNodes[0]);     //true
alert(html === document.firstChild);        //true

上面的範例說明,documentElement、firstChild和childNodes[0]的值相同,都指向元素。

作為HTMLDocument的實例,document物件還有一個body屬性,直接指向

屬性。 document.body是我們在開發中常用的屬性:
var body = document.body;

所有的瀏覽器都支援document.documentElement屬性和document.body屬性。

Document另一個可能的子節點是DocumentType,通常將標籤看成一個與文件其它部分不同的實體,可以透過doctype屬性來存取它。

var doctype = document.doctype;     //获取<!DOCTYPE>的引用

 document物件的屬性與方法

document物件是window物件的屬性。當視窗分割成幾個框架的時候,每個框架都是window物件的屬性,框架本身其實也是window物件的實例。 document物件的常用屬性如下表所示:

JavaScript文檔物件模型-Document類型

上面列出的是一些常用的document屬性,要查看目前瀏覽器支援的所有document屬性,可以使用下面的方法:

var attrs = new Array();
for(var property in window.document) {
    attrs.push(property);
    attrs.sort();
}
document.write("<table>");
for(var i=0;i<attrs.length;i++){
    if(i == 0){
        document.write("<tr>");
    }
    if(i > 0 && i%5 == 0){
        document.write("</tr><tr>");
    }
    document.write("<td>" + attrs[i] + "</td>");
}
document.write("</table>");

上面的程式碼會將目前瀏覽器支援的document屬性依字母排序後移表格的方式列印在頁面中。

在上面的document物件的屬性中,URL、domain和referrer屬性於網頁的請求有關。 URL屬性包含完整的URL位址,及線索在網址列的頁面位址。 domain屬性只包含頁面的域名,而referrer屬性中則保存著連結到目前頁面的那一個頁面的URL位址。在沒有來源頁面的情況下,referrer屬性可能包含空字串。所有的這些資訊都在HTTP請求頭中,只不過我們可以使用JavaScript來存取它們。

//取得完整的URL地址
var URL = document.URL;
//取得域名
var domain = document.domain;
//取得来源页面的URL
var referrer = document.referrer;

 查找元素

在DOM的應用當中,最常見的操作時取得某個或某組元素的引用,然後再執行一些操作。取得元素的操作可以透過document物件的以下一些方法來完成。

  • document.getElementById()

  • document.getElementsByTagName

  • document.getElementsByName(

document.getElementsByName(

🎜document.getElementsByName(🎜🎜🎜document.getElementsByName()🎜 ID。如果找到該元素則傳回該元素,否則傳回null。如果頁面中存在多個具有相同ID的元素,那麼getElementById()方法只會傳回文件中第一次的元素。在IE7及以下版本的IE瀏覽器中,如果表單元素的name屬性與要尋找的元素ID相同,則該表單元素也會被傳回,例如:🎜
<input type="text" name="someId" value="text value">
<div id="someId">div</div>

当使用document.getElementById("someId")来查找元素的时候,IE7浏览器会将元素返回。而其它浏览器则是返回div元素。

另一个经常使用的方法是document.getElementsByTagName,通过标签名来查找元素。该方法接收一个参数:要查找的标签名称。它会返回0个或多个元素的NodeList。在HTML文档中,该方法返回一个HTMLCollection对象,称为“动态”集合。例如,下面的代码获取页面中所有的JavaScript文檔物件模型-Document類型元素,并返回一个HTMLCollection:

var images = document.getElementByTagName("img");

与NodeList相似,可以使用方括号语法或item()方法来访问HTMLCollection对象:

alert(images.length);           //图片的数量
alert(images[0].src);           //第一张图片的src属性
alert(images.item(0).src);      //第一张图片的src属性

HTMLCollection对象还有一个方法:namedItem(),使用这个方法可以通过元素的name属性取得集合中的项。例如上面的图片集合中,如果有一张图片的name属性为mypic:

<img  src="demoimg.jpg" name="mypic" alt="JavaScript文檔物件模型-Document類型" >

那么就可以通过下面的方法从images变量中获取这张图片:

var mypic = images.namedItem("mypic");

如果想要获取页面中的所有元素,可以通过在getElementByTagName()方法中传入“*”通配符来获取。

var allElements = document.getElementByTagName("*");

第3个获取元素的方法是HTMLDocument特有的方法:getElementByName()。该方法会返回指定name属性的所有元素。例如下面的代码:

<ul>
    <li><input type="text" name="author" value="author1"></li>
    <li><input type="text" name="author" value="author2"></li>
    <li><input type="text" name="author" value="author3"></li>
</ul>
var authors = document.getElementByName("author");

上面的代码会返回所有的li元素。同样,getElementByName()方法也会返回一个HTMLCollection对象。

 HTML5中的querySelector和querySelectorAll方法

除了上面的三个查找元素的方法之外,在HTML5向Web API新引入了新的document.querySelector和document.querySelectorAll方法用来更方便地从DOM选取元素,功能类似于jQuery的选择器。

这两个方法使用差不多的语法,都是接收一个字符串参数,这个参数需要是合法的CSS选择语法。

element = document.querySelector(&#39;selectors&#39;);
elementList = document.querySelectorAll(&#39;selectors&#39;);

其中参数selectors 可以包含多个CSS选择器,用逗号隔开。

element = document.querySelector(&#39;selector1,selector2,...&#39;);
elementList = document.querySelectorAll(&#39;selector1,selector2,...&#39;);

使用这两个方法无法查找带伪类状态的元素,比如querySelector(':hover')不会得到预期结果。

querySelector方法返回满足条件的单个元素。按照深度优先和先序遍历的原则使用参数提供的CSS选择器在DOM进行查找,返回第一个满足条件的元素。

element = document.querySelector(&#39;div#container&#39;);//返回id为container的首个div
element = document.querySelector(&#39;.foo,.bar&#39;);//返回带有foo或者bar样式类的首个元素

querySelectorAll方法返回所有满足条件的元素,结果是个nodeList集合。查找规则与前面所述一样。

elements = document.querySelectorAll(&#39;div.foo&#39;);//返回所有带foo类样式的div

但需要注意的是返回的nodeList集合中的元素是非实时(no-live)的,想要区别什么是实时非实时的返回结果,请看下面的例子:

<div id="container">
    <div></div>
    <div></div>
</div>
//首先选取页面中id为container的元素
container=document.getElementById(&#39;#container&#39;);
console.log(container.childNodes.length)//结果为2
//然后通过代码为其添加一个子元素
container.appendChild(document.createElement(&#39;div&#39;));
//这个元素不但添加到页面了,这里的变量container也自动更新了
console.log(container.childNodes.length)//结果为3

通过上面的例子就很好地理解了什么是会实时更新的元素。document.getElementById返回的便是实时结果,上面对其添加一个子元素后,再次获取所有子元素个数,已经由原来的2个更新为3个(这里不考虑有些浏览器比如Chrome会把空白也解析为一个子节点)。

 文档的写入

document对象可以将输出流写入到网页中,它有4个方法:write()、writeln()、open()和close()。其中,write()和writeln()方法接收一个字符串参数,即要写入到输出流的文本。write()方法会原样写出,而writeln()方法会在字符串的末尾添加一个换行符(\n)。在页面加载的过程中,可以使用这两个方法来动态的添加内容,例如下面的代码:

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <p>当前的时间为:
    <script type="text/javascript">
    document.write("<strong>"+(new Date()).toString()+"</strong>");
    </script>
    </p>
</body>
</html>

以上就是JavaScript文档对象模型-Document类型的内容,更多相关内容请关注PHP中文网(www.php.cn)!


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn