DOM节点

DOM节点

共有12种节点类型,每个节点都有一个nodeType属性

1、Node类型

JavaScript中的所有节点类型都是继承自Node类型,每个节点都有一个nodeType属性,用于表明节点的类型,节点类型由Node类型中定义的下列12个数值常量来表示:

  • Node.ELEMENT_NODE(1);
  • Node.ATTRIBUTE_NODE(2);
  • Node.TEXT_NODE(3);
  • Node.CDATA_SECTION_NODE(4);
  • Node.ENTITY_REFERENCE_NODE(5);
  • Node.ENTITY_NODE(6);
  • Node.PROCESSING_INSTRUCTION_NODE(7);
  • Node.COMMENT_NODE(8);
  • Node.DOCUMENT_NODE(9);
  • Node.DOCUMENT_TYPE_NODE(10);
  • Node.DOCUMENT_FRAGMENT_NODE(11);
  • Node.NOTATION_NODE(12).
    (1)nodeName和nodeValue属性
    (2)节点关系
    在这里插入图片描述(3)操作节点
    向childNodes列表的末尾添加一个节点:
var returnedNode = someNode.appendChild(newNode); 

向childNodes的某个特点位置插入节点:

returnedNode = someNode.insertBefore(newNode, insertIndex);

移除节点

var returnedNode = someNode.removeChild(someNode); 

复制节点

// 深复制,包含子节点
var deepList = myList.cloneNode(true); 
alert(deepList.childNodes.length); //3
// 浅复制,不包含子节点
var shallowList = myList.cloneNode(false); 
alert(shallowList.childNodes.length); //0
2、Document类型

对象document是windows对象的一个属性,,因此可以将此作为全局对象来访问。
特性:

  • typeNode 值为9
  • nodeName 值为"#document"
  • nodeValue 值为null
  • parentNode 值为null
  • ownerDocument 值为null

(1)文档子节点
虽然Document子节点可以是DocumentType、Element、ProcessingInstruction或Comment,但是其有两个内置方法其子节点的快捷方式,第一个是documentElement属性,始终指向,另一个是通过childNodes访问文档元素,例:

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

该页面经过解析后,其文档中只包含一个子节点,即元素:

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

作为HTMLDocument,document对象还有一个body属性:

var body = document.body; // 取得对body的引用 

(2)文档信息
title属性

//获取文档标题
var originalTitle = document.title;
//设置文档标题
document.title = "New page title"; 

3个与网页请求有关的属性

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

其中,URL与domain是关联的,如果document.URL等于http://www.wrox.com/WileyCDA,那么document.domain就等于www.wrox.com。
(3)查找元素

<div id="myDiv">Some text</div>
var div = document.getElementById("myDiv"); // 取得对<div>的引用
var images = document.getElementsByTagName("img");  //
alert(images.length); //  图像的数量
alert(images[0].src); // 输出第一个图像元素的src特性
alert(images.item(0).src); //  输出第一个图像元素的src特性
<input type="radio" value="green" name="color" id="colorGreen">
var radios = document.getElementsByName("color"); 

(4)特殊集合
document.anchors // 带name特性的<a>
document.applets // 不推荐使用
document.forms
document.images
document.links // 带href特性的<a>
(5)文档写入
将输出流写入到网页中:

<html>
<body>
 <p>The current date and time is:
 <script type="text/javascript">
 document.write("<strong>" + (new Date()).toString() + "</strong>");
 </script>
 </p>
</body>
</html> 

页面输出效果:
还可以使用write()和writeln()方法动态地包含外部资源:

 <script type="text/javascript">
 document.write("<script type=\"text/javascript\" src=\"file.js\">" +
 "<\/script>");
 </script>

注意"</script>“需要转义为”<\/script>",否则被解释为与外部"<script>匹配。

3、Element类型

特征:

  • typeNode值为1
  • nodeName为元素的标签名(也可以用属性tagName)
  • nodeValue为null
  • parentNode为Document或者Element
<div id="myDiv"></div>

像下面那样获取标签名,注意输出标签名为大写:

var div = document.getElementById("myDiv");
alert(div.tagName); //"DIV"
alert(div.tagName == div.nodeName); //true 

(1)html元素
标准特性:id、title、lang、dir、className,以下面的html元素为例:

var div = document.getElementById("myDiv");
alert(div.tagName); //"DIV"
alert(div.tagName == div.nodeName); //true 

元素中指定的元素信息,可以通过JavaScript代码取得:

var div = document.getElementById("myDiv");
alert(div.id); //"myDiv""
alert(div.className); //"bd"
alert(div.title); //"Body text"
alert(div.lang); //"en"
alert(div.dir); //"ltr" 

// 修改对应特性
div.id = "someOtherId";
div.className = "ft";
div.title = "Some other text";
div.lang = "fr";
div.dir ="rtl"; 

或者

// 获取特性
var div = document.getElementById("myDiv");
alert(div.getAttribute("id")); //"myDiv"

// 设置特性
div.setAttribute("id", "someOtherId");

(2)attributes属性
Element类型是使用attributes属性的唯一一个DOM节点类型,attributes属性包含一个NamedNodeMap,每个节点保存在其中,NamedNodeMap拥有下列方法:

  • getNamedItem(name) :返回nodeName属性等于name的节点
  • removeNamedItem(name):移除。。。
  • setNamedItem(node):添加节点
  • item(pos):返回位于pos的节点

(3)创建元素

var div = document.createElement("div"); 
div.id = "myNewDiv";
div.className = "box"; 
4、Text类型

特性:

  • typeNode 值为3
  • nodeName 值为"#text"
  • nodeValue 值为节点所包含的文本
  • parentNode 是一个Element
  • 不支持(没有)子节点

操作节点文本:

  • appendData(text):将tex文本添加到节点末尾
  • deleteData(offset, count):从offset指定位置删除count个字符
  • insertData(offset, text):从offset指定位插入text文本
  • replaceData(offset, count, text):用text替换从offset位置开始的到offset+count为止的文本
  • splitText(offset):从offset位置将文本节点分成两个文本节点
  • substringData(offset, count):提取从offset位置开始的到offset+count为止的文本
<!-- 没有内容,也就没有文本节点-->
<div></div>
<!-- 有一个空格有一个文本节点,节点内容为空格 -->
<div> </div>
<!-- 有内容,因而有一个文本节点,节点内容为“Hello World!” -->
<div>Hello World!</div> 

省略几百字,下一个。。。

5、Comment类型

特征:

  • typeNode值为8
  • nodeName为“#comment”
  • nodeValue为注释的内容
  • parentNode为Document或者Element
  • 不支持(没有)子节点
<div id="myDiv"><!--A comment --></div>

注释节点是div的一个子节点,所以通过下面代码访问它:

var div = document.getElementById("myDiv");
var comment = div.firstChild;
alert(comment.data); //"A comment"
6、CDATASection类型

特征:

  • typeNode值为4
  • nodeName为"#cdata-section"
  • nodeValue为CDATAZ中的内容
  • parentNode为Document或者Element
  • 不支持(没有)子节点
<div id="myDiv"><![CDATA[This is some content.]]></div> 

可以使用document.createCDataSection()来创建CDATA区域

7、DocumentType类型

特征:

  • typeNode值为10
  • nodeName为doctype的名称
  • nodeValue为CDATAZ中的内容
  • parentNode为Document
  • 不支持(没有)子节点
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
DocumentType 的name属性中保存的就是"HTML"
alert(document.doctype.name); //"HTML" 
8、DocumentFragment类型

特征:

  • typeNode值为11
  • nodeName为"#document-fragment"
  • nodeValue为null
  • parentNode为null
var fragment = document.createDocumentFragment();
9、Attr类型

特征:

  • typeNode值为2
  • nodeName为特性的名称
  • nodeValue为特性的值
  • parentNode为null
  • 不支持(没有)子节点
var attr = document.createAttribute("align");
attr.value = "left";
element.setAttributeNode(attr);
alert(element.attributes["align"].value); //"left"
alert(element.getAttributeNode("align").value); //"left"
alert(element.getAttribute("align")); //"left" 
10、DOM操作技术

(1)动态脚本
加载外部js文件:

<script type="text/javascript" src="client.js"></script> 

对应DOM代码:

var script = document.createElement("script");
script.type = "text/javascript"; 
script.src = "client.js";
document.body.appendChild(script); 

另一种指定JavaScript代码的方式是行内方式:

<script type="text/javascript">
 function sayHi(){
 alert("hi");
 }
</script>

对应DOM代码创建:

var script = document.createElement("script");
script.type = "text/javascript";
script.appendChild(document.createTextNode("function sayHi(){alert('hi');}"));
document.body.appendChild(script); 

以上在IE浏览器中报错,因为<script>被视为特殊元素,不允许DOM访问其子节点,可以使用<script>的text属性指定JavaScript代码:

var script = document.createElement("script");
script.type = "text/javascript";
script.text = "function sayHi(){alert('hi');}";
document.body.appendChild(script); 

(1)动态样式
css文件加载:

<link rel="stylesheet" type="text/css" href="styles.css"> 

对应DOM代码:

function loadStyles(url){
 var link = document.createElement("link"); 
 link.rel = "stylesheet";
 link.type = "text/css";
 link.href = url;
 var head = document.getElementsByTagName("head")[0];
 head.appendChild(link);
} 
loadStyles("styles.css"); 

使用<style>元素包含嵌入css

<style type="text/css">
body {
 background-color: red;
}
</style> 

对应DOM代码:

var style = document.createElement("style");
style.type = "text/css";
style.appendChild(document.createTextNode("body{background-color:red}"));
var head = document.getElementsByTagName("head")[0];
head.appendChild(style); 
DOM扩展
1、选择符API

(1)querySelector()方法
返回该模式匹配的第一个元素:
在这里插入图片描述
(2)querySelectorAll()方法
返回所有匹配的元素的集合(NodeList实例)

2、元素遍历

在这里插入图片描述

3、HTML5

(1)getElementsByClassName()方法

// <div class="userName current"></div>
var allCurrentUsernames = document.getElementsByClassName("username current"); 

allCurrentUsernames的数据结构:
在这里插入图片描述classList属性的方法

  • add(value)
  • contains(value)
  • remove(value)
  • toggle(value)

例:

// 删除类“username”
allCurrentUsernames[0].classList.remove("username ");

// 添加类“username”,已存在则不添加
allCurrentUsernames[0].classList.add("username ");

(2)焦点管理
document.activeElement属性:当前获得焦点的元素,获得当前元素焦点的方式有加载、用户输入(通常是通过按tab键)和在代码中调用focus()方法,例子:

var button = document.getElementById("myButton");
button.focus();
alert(document.activeElement === button); //true 

默认情况下,文档加载完之后当前焦点元素document.activeElemen保存的是document.body元素,加载期间document.activeElement为null;
另外,document.hasFocus()方法用于确定文档是否获得了焦点:

var button = document.getElementById("myButton"); 
button.focus();
alert(document.hasFocus()); //true

(3)readyState属性

  • loading 正在加载文档
  • complete 已加载完

例:

if (document.readyState == "complete"){
 // ,若已加载完成,执行操作
}

(4)scrollIntoView()方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值