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页面的<html>
元素。另一个是通过childNodes列表访问文档元素,但是通过documentElement
属性能够更加快捷的访问该元素。下面是一个例子:
<html> <body> </body> </html>
上面的页面经过浏览器解析之后,其文档中只包含一个子节点,及<html>
元素。通过documentElement
属性和childNodes列表来访问这个元素的代码如下:
//取得<html>元素的引用 var html = document.documentElement; alert(html === document.childNodes[0]); //true alert(html === document.firstChild); //true
上面的例子说明,documentElement
、firstChild
和childNodes[0]
的值相同,都指向<html>
元素。
作为HTMLDocument的实例,document对象还有一个body属性,直接指向<body>
属性。document.body
是我们在开发中经常使用的属性:
var body = document.body;
所有的浏览器都支持document.documentElement
属性和document.body
属性。
Document另外一个可能的子节点是DocumentType,通常将<!DOCTYPE>
标签看成一个与文档其它部分不同的实体,可以通过doctype
属性来访问它。
var doctype = document.doctype; //获取<!DOCTYPE>的引用
document对象的属性和方法
document对象是window对象的一个属性。当窗口划分为几个框架的时候,每一个框架都是window对象的一个属性,框架本身实际上也是window对象的一个实例。document对象的常用属性如下表所示:
属性 | 描述 |
anchors[] | anchor对象数组,每一个都代表文档中出现的一个锚地 |
applets[] | applet对象数组,代表文档中出现的每一个applet片段 |
bgColor | 指定文档的背景颜色,字符串类型 |
cookies | 允许读写HTTP的cookie,字符串类型 |
domain | 指定文档来自哪一个域,用于安全目的,字符串类型 |
embeds[] | 代表文档中使用<embed> 标记嵌入的数据,于plugins[]意义相同 |
fgColor | 指定文档的前景颜色,字符串类型 |
forms[] | form对象数组,每一个元素对应于文档中的一个HTML <form> 标记 |
images[] | image对象数组,每一个元素对应于文档中的一个HTML<img> 标记 |
lastModified | 给出文档的最近修改时间(有web服务器报告),字符串类型,只读属性 |
linkColor | 指定未访问连接的颜色 |
links[] | link对象数组,每一个元素对应于文档中的一个HTML <a href> 标记 |
location | 文档的URL地址,该属性已废弃,应该使用URL属性来替代它 |
plugins[] | 与embeds[]属性的意义相同 |
referrer | 只读属性,连接到当前文档的URL |
title | 文档的标题,对应于文档中的<title> 标记的内容 |
URL | 指定当前文档的URL,只读属性 |
vlinkColor | 指定已访问链接的颜色 |
上面列出的是一些常用的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.getElementById()
接收一个参数:要获取的元素的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浏览器会将<input>
元素返回。而其它浏览器则是返回div
元素。
另一个经常使用的方法是document.getElementsByTagName
,通过标签名来查找元素。该方法接收一个参数:要查找的标签名称。它会返回0个或多个元素的NodeList。在HTML文档中,该方法返回一个HTMLCollection对象,称为“动态”集合。例如,下面的代码获取页面中所有的<img>
元素,并返回一个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">
那么就可以通过下面的方法从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('selectors'); elementList = document.querySelectorAll('selectors');
其中参数selectors 可以包含多个CSS选择器,用逗号隔开。
element = document.querySelector('selector1,selector2,...'); elementList = document.querySelectorAll('selector1,selector2,...');
使用这两个方法无法查找带伪类状态的元素,比如querySelector(':hover')
不会得到预期结果。
querySelector
方法返回满足条件的单个元素。按照深度优先和先序遍历的原则使用参数提供的CSS选择器在DOM进行查找,返回第一个满足条件的元素。
element = document.querySelector('div#container');//返回id为container的首个div element = document.querySelector('.foo,.bar');//返回带有foo或者bar样式类的首个元素
querySelectorAll
方法返回所有满足条件的元素,结果是个nodeList集合。查找规则与前面所述一样。
elements = document.querySelectorAll('div.foo');//返回所有带foo类样式的div
但需要注意的是返回的nodeList集合中的元素是非实时(no-live)的,想要区别什么是实时非实时的返回结果,请看下面的例子:
<div id="container"> <div></div> <div></div> </div>
//首先选取页面中id为container的元素 container=document.getElementById('#container'); console.log(container.childNodes.length)//结果为2 //然后通过代码为其添加一个子元素 container.appendChild(document.createElement('div')); //这个元素不但添加到页面了,这里的变量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>