在前面 DOM 概况 中,我们知道了 DOM 总共有 12 个节点类型,今天我们就来讲下 DOM 中最重要的节点类型之一的 document 节点类型。

1、概况


Javascript 通过 Document 类型表示文档。在浏览器中, document 对象是 HTMLDocument(继承自 Document 类型)的一个实例,表示整个 HTML 页面。而且, document 对象是 window 对象的一个属性,因此可以将其作为全局对象来访问。 Document 节点具有如下特性:

  1. nodeType 的值为 9
  2. nodeName 的值为 '#document'
  3. nodeValue 的值为 null
  4. parentNode 的值为 null
  5. ownerDocument 的值为 null
  6. 其子节点可能是一个 DocumentType(最多一个)、Element(最多一个)、ProcessingInstruction 或者 Comment

Document 类型可以表示 HTML 页面或者其他基于 XML 的文档。不过最常见的应用还是作为 HTMLDocument 实例的 document 对象。通过这个文档对象,不仅可以取得与页面有关的信息,而且还能操作页面的外观及其底层结构。

var d = document;
console.log(d.nodeType); // 9
console.log(d.nodeName); // #document
console.log(d.nodeValue); // null
console.log(d.parentNode); // null
console.log(d.ownerDocument); // null

2、文档的子节点


虽然 DOM 标准规定 Document 节点的子节点可以是 DocumentType(最多一个)、Element(最多一个)、ProcessingInstruction 或者 Comment,但还是有两个内置的访问其子节点的快捷方式。第一个就是 documentElement 属性,该属性始终指向 HTML 页面中的 <html> 元素,另一个就是通过 childNodes 列表访问文档元素:(假设没有指定文档类型)

var html = document.documentElement;
console.log(html === document.childNodes[0]); // true
console.log(html === document.firstChild); // true

作为 HTMLDocument 的实例,document 对象还有一个 body 属性,直接指向 <body> 元素。

var body = document.body;

所有的浏览器都支持 document.documentElement 和 document.body 属性

Document 另一个可能的子节点是 DocumentType。通常将 <!DOCTYPE> 标签看成一个和文档其他部分不同的实体,可以通过 doctype 属性来访问它的信息:

var doctype = document.doctype; // 取得对 <!DOCTYPE> 的引用
console.log(doctype);
console.log(document.firstChild === doctype); // true
console.log(document.childNodes.length); // 2 (doctype 以及 documentElement)

但是浏览器对 document.doctype 的支持差别很大,使得这个属性的用处很有限。

文档的子节点还能是注释节点:

<!-- a -->
<!DOCTYPE html>
<script>
    console.log(document.childNodes.length); // 3 (chrome)
</script>
<!-- b -->

但是,现实中的浏览器在处理位于 <html> 外部的注释方面存在差异,比如 chrome 下就直接忽视上面的第二个注释节点。

3、文档信息


作为 HTMLDocument 的一个实例,document 对象还有一些标准的 Document 对象所没有的属性。

// 取得文档标题
var title = document.title;

// 设置文档标题
document.title = 'New Page Title';

// 取得完整的 url
var url = document.url;

// 取得域名
var domain = document.domain;

// 取得来源页面的 url
var referrer = document.referrer;

domain 属性是可以设置的,这点在跨域通信中应用甚广。由于安全方面的考虑,也并非可以给 domain 设置任何值。

// 假设页面来自 p2p.wrox.com

document.domain = 'wrox.com'; // 成功

document.domain = 'cnblogs.com'; // 出错

浏览器对 domain 属性还有一个限制,即如果域名一开始是 “松散的”,那么不能再将它设置为 “紧绷的”:

// 假设页面来自 p2p.wrox.com

document.domain = 'wrox.com'; 

document.domain = 'p2p.wrox.com'; // 出错

4、查找元素


var a = document.getElementById('..');

var b = document.getElementsByTagName('..');

// HTMLCollection
var images = document.getElementsByTagName('img');

console.log(images.length);
console.log(images[0].src);
console.log(images.item(0).src);

// 通过元素的name特性取得集合中的项
var myImage = images.namedItem('..');

// 也可以
var myImage = images['..']; // .. 为name值

// 对于HTMLCollection而言,我们可以向方括号中传入数字或者字符串(name值)
// 在后台,对数字调用item(),对字符串索引调用namedItem()
var myImage = images[0];
var myImage = images['nameOfMyImage'];

// 取得文档中的所有元素
var allElements = document.getElementsByTagName('*');

// document.getElementsByName
var radios = document.getElementsByName('color');

5、特殊集合


除了属性和方法,document 对象还有一些特殊的集合,这些集合都是 HTMLCollection 对象,为访问文档常用的部分提供了快捷方式:

document.anchors // 包含所有带name特性的<a>元素
document.forms // 包含文档中所有的<form>元素
document.images // 包含文档中所有的<img>元素
document.links // 包含文档中所有带href的<a>元素

DOM Document节点类型详解的更多相关文章

  1. DOM Element节点类型详解

    上文中我们讲解了 DOM 中最重要的节点类型之一的 Document 节点类型,本文我们继续深入,谈谈另一个重要的节点类型 Element . 1.概况 Element 类型用于表现 HTML 或 X ...

  2. javascript 节点属性详解

    javascript 节点属性详解 根据 DOM,html 文档中的每个成分都是一个节点 DOM 是这样规定的:整个文档是一个文档节点每个 html 标签是一个元素节点包含在于 html 元素中的文本 ...

  3. 深入浅出DOM基础——《DOM探索之基础详解篇》学习笔记

    来源于:https://github.com/jawil/blog/issues/9 之前通过深入学习DOM的相关知识,看了慕课网DOM探索之基础详解篇这个视频(在最近看第三遍的时候,准备记录一点东西 ...

  4. Dom探索之基础详解

    认识DOM DOM级别 注::DOM 0级标准实际并不存在,只是历史坐标系的一个参照点而已,具体的说,它指IE4.0和Netscape Navigator4.0最初支持的DHTML. 节点类型 注:1 ...

  5. js变量类型详解

    <html> <title>js变量类型详解</title> <meta http-equiv="content-type" conten ...

  6. js课程 1-3 Javascript变量类型详解

    js课程 1-3  Javascript变量类型详解 一.总结 一句话总结:js对象点(属性方法),json对象冒号(属性方法).属性和方法区别只有一个括号. 1.json对象中的函数的使用? 函数名 ...

  7. C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解

    前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.之前分享过一篇 C#进阶系列——WebApi接口传参不再困惑:传参详解  ...

  8. C++11 并发指南六(atomic 类型详解四 C 风格原子操作介绍)

    前面三篇文章<C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍)>.<C++11 并发指南六( <atomic> 类型详解二 std::at ...

  9. C++11 并发指南六(atomic 类型详解三 std::atomic (续))

    C++11 并发指南六( <atomic> 类型详解二 std::atomic ) 介绍了基本的原子类型 std::atomic 的用法,本节我会给大家介绍C++11 标准库中的 std: ...

随机推荐

  1. Cloud9:解决ThinkPHP在C9上运行时连接数据库时报错"No such file or directory"的问题

    昨天尝试在c9上部署了一个ThinkPHP用于开发,但是当试图连接数据库时却出现了这样的问题.经过查找资料发现此问题是由于没有找到mysql.sock这个文件造成的(这个东西估计是mysql的连接线程 ...

  2. JavaScript Patterns 4.8 Function Properties - A Memoization Pattern

    Gets a length property containing the number of arguments the function expects: function func(a, b, ...

  3. Bootstrap弹出框(modal)垂直居中

    最近在做一个eit项目,由于此项目里面一些框架要遵循nttdata的一些规则,故用到了Bootstrap这个东东,第一次碰到这个东东,有很大抵触,觉得不好,但用起来我觉得和别的弹出框真没什么两样.废话 ...

  4. JS代码判断字符串中有多少汉字

    $("form").submit(function () { var content = editor.getContentTxt(); var sum = 0; re = /[\ ...

  5. Hadoop生态圈以及各组成部分的简介

    1.Hadoop是什么? 适合大数据的分布式存储与计算平台 HDFS: Hadoop Distributed File System分布式文件系统 MapReduce:并行计算框架 解决的问题: HD ...

  6. 高效coder,筹备开源框架toutou.escort.js

    背景:JavaScript在工作中运用的非常广泛,作为一门弱类型语言,在使用JavaScript的时候,很多事情需要coder manual的去完成,这无疑增加了coder的工作量. 扩展:在这样的背 ...

  7. SQL Server求解连续操作(登录)数量(次数)最大的记录(用户)问题

    在园中大V深蓝医生中的一篇文中发现了这个问题,感觉挺有意思. 问题简化为"求解连续日期登录次数最大的用户".至少连续2天都登录才能认为是连续日登录. 数据岛问题 这个问题让我联想到 ...

  8. CentOS 7.2 安装 Docker 1.12.3 版

    本文出自http://www.cnblogs.com/scoter2008 1.强大的官方文档 https://docs.docker.com/engine/installation/linux/ce ...

  9. Ubuntu14.04桌面版基本配置

    最近公司需要用Ubuntu测试一些功能,安装好后绚丽的桌面环境很是吸引人,但切换到字符界面后,发现不少地方与RHEL不一样,连ssh.vim都没有,字符界面玩得不开心. 搜了不少文章,才将基本的功能配 ...

  10. 10、WGET

    这个我看过比较好的  http://www.cnblogs.com/peida/archive/2013/03/18/2965369.html WGET 支持HTTP和FTP协议,断点续传功能,自动递 ...