JS基础DOM篇之二:DOM级别与节点层次?
Explorer 4.0和Netscape Navigator 4.0最初支持的DHTML。那下面就介绍一下这存在的三个级别。
Core)和DOM HTML。其中,DOM核心规定的是如何映射基于XML的文档结构,以便简化对文档中任意部分的访问和操作。DOM
HTML模块则在DOM核心的基础上加以扩展,添加了针对HTML的对象和方法。总的来说DOM1级的主要目标是映射文档的结构,并提供查询的接口。
Style Sheets,层叠样式表)的支持。DOM1级中的DOM核心模块也经过扩展开始支持XML命名空间。
DOM2级引入了下列新模块,也给出了众多新类型和新接口的定义。
DOM视图(DOM Views):定义了跟踪不同文档(例如,应用CSS之前和之后的文档)视图的接口;
DOM事件(DOM Events):定义了事件和事件处理的接口;
DOM样式(DOM Style):定义了基于CSS为元素应用样式的接口;
DOM遍历和范围(DOM Traversal and Range):定义了遍历和操作文档树的接口。
DOM3级则进一步扩展了DOM,引入了以统一方式加载和保存文档的方法——在DOM加载和保存(DOM Load and
Save)模块中定义;新增了验证文档的方法——在DOM验证(DOM
Validation)模块中定义。DOM3级也对DOM核心进行了扩展,开始支持XML 1.0规范,涉及XML Infoset、XPath和XML
Base。
2.节点层次
我们知道DOM可以将任何HTML或Xml文档描绘成一个由多层节点构成的以特定节点为根节点的树形结构。这些节点分为不同类型,每种类型分别表示文档中不同的信息。每个节点都拥有各自的特点、数据、方法,切合其他节点也存在关系。他们之间的关系就构成了节点层次。
- 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)
通过将noseType属性与数字之比较很容易确定节点类型。
if(somenode.nodeType==1){
alert("Node is an element")
}
但是要注意比不是所有节点类型都受到web浏览器的支持。我们最常用的就是元素和文本节点。具体的节点类型介绍就不一一展开,有兴趣的可以参看“小红书”第十章自行了解。接下来看一下我认为比较常用的节点类型。
Document类型
我们大家需要知道JavaScript是通过Document类型来表示HTML页面或者其他基于XML文档。还有就是在浏览器中,document对象是HTMLDocument(它继承自Document类型)的一个实例,用来表示整个HTML页面。而且document对象是window对象的一个属性,因此可以将它做为全局对象来访问,通过这个文档对象不仅可以取得与页面有关的信息,而且还能操作页面的外观及其底层结构。
文档信息
document对象有一些标准的Document对象所没有的属性,提供了 document对象所表现的网页的一些信息。
//取得文档标题 var title = document.title;
//设置文档标题 document.title = "New page title";
//取得完整的URL var url = document.URl;
//取得域名 var domain = document.domain;
//页面上边距 document.body.leftMargin
//页面左边距 document.body.rightMargin
//页面右边距 document.body.bottomMargin
//页面下边距 document.body.background //背景图片
查找元素
Document类型提供两个查找元素的方法:
getElementById()
,如果找到相应的元素则返回该元素,如果不存在带有相应ID的元素,则返回null。getElementByTagName()
,返回包含零或多个元素的NodeList,在HTMl文档中,这个方法会返回一个HTMLCollection对象,与NodeList非常类似。其中THMLCollection对象有一个方法namedItem()getElementsByName()
,会返回带有给定name特性的所有元素。
文档写入
document.write()方法可以用在两个方面:
- 页面载入过程中用实时脚本创建页面内容
- 用延时脚本创建本窗口或新窗口的内容
只有当页面被加载的时候document.write()函数才会被执行
doucment.writeln()与上述类似,区别在于换行。
open()和close()分别用于打开和关闭网页的输出流,如果在页面加载期间使用write(),则不需要用这两个方法。
Element类型
除了Document类型之外,Element类型基本上要算是web变成中最常用的类型了。Element类型用于表现XML或者HTML元素,提供了对元素标签名、子节点及特性的访问。
元素标签名访问
要访问元素的标签名,可以用 nodeName
属性,也可以用 tagName
属性;这两个属性会返回相同的值。在 HTML 中,标签名始终都以全部大写表示,而在 XML(有时候也包括 XHTML)中,标签名始终和源代码中保持一致。假如你不确定自己的脚本将会在 HTML 还是 XML 文档中执行,最好还是在比较之前将标签名转换成相同的大小写形式:
var myDiv = document.querySelector('div');
console.log(myDiv.tagName); // DIV
console.log(myDiv.nodeName); // DIV if (myDiv.tagName.toLowerCase() === 'div') { // 这样最好,适用于任何文档
// ...
}
子节点访问
<ul id='myUl'>
<li> Item 1 </li>
<li> Item 2 </li>
<li> Item 3 </li>
</ul> <script>
var myUl = document.getElementById('myUl');
console.log(myUl.childNodes.length); // IE: 3 其他浏览器: 7
</script>
以上代码,如果是 IE 来解析,那么 <ul>
元素会有 3 个子节点,分别是 3 个 <li>
元素;而如果是其他浏览器解析,则会有 7 个子节点,包括 3 个 <li>
元素 和 4 个文本节点。
如果像下面这样将元素之间的空白符删除,那么所有浏览器都会返回相同数目的子节点:
<ul id='myUl'><li> Item 1 </li><li> Item 2 </li><li> Item 3 </li></ul> <script>
var myUl = document.getElementById('myUl');
console.log(myUl.childNodes.length); // 所有浏览器: 3
</script>
特性的访问
每个元素都有一个或多个特性,这些特性的用途是给出相应元素或其内容的附加信息。操作特性的 DOM 方法主要有三个,分别是 getAttribute()
setAttribute()
removeAttribute()
。
注意,传递给 getAttribute()
的特性名与实际的特性名相同,因此要想得到 class
特性值,应该传入 class
而不是 className
,后者只有在通过对象属性(property)访问特性时才用。如果给定名称的特性不存在,getAttribute()
返回 null。
<div id='myDiv' title='hanzichi'> </div>
<script>
var myDiv = document.querySelector('div'); // attribute
console.log(myDiv.getAttribute('id')); // myDiv
console.log(myDiv.getAttribute('class')); // null
console.log(myDiv.getAttribute('title')); // hanzichi
console.log(myDiv.getAttribute('lang')); // null
console.log(myDiv.getAttribute('dir')); // null // property
console.log(myDiv.id); // myDiv
console.log(myDiv.className); // ''
console.log(myDiv.title); // hanzichi
console.log(myDiv.lang); // ''
console.log(myDiv.dir); // ''
</script>
通过 getAttribute() 方法也可以取得自定义特性。
在实际开发中,开发人员不常用 getAttribute()
,而是只使用对象的属性(property)。只有在取得自定义特性值的情况下,才使用 getAttribute()
方法。为什么呢?比如说 style
,在通过 getAttribute()
访问时,返回的 style
特性值包含的是 css 文本,而通过属性来访问会返回一个对象。再比如 onclick
这样的事件处理程序,当在元素上使用时,onclick
特性包含的是 Javascript 代码,如果通过 getAttribute()
访问,将会返回相应代码的字符串,而在访问 onclick
属性时,则会返回 Javascript 函数。
与 getAttribute()
对应的是 setAttribute()
,这个方法接受两个参数:要设置的特性名和值。如果特性已经存在,setAttribute()
会以指定的值替换现有的值;如果特性不存在,setAttribute()
则创建该属性并设置相应的值。
而 removeAttitude()
方法用于彻底删除元素的特性。调用这个方法不仅会清除特性的值,而且也会从元素中完全删除特性。
div.setAttribute('id', 'someOtherId');
div.setAttribute('title', 'some other text'); div.removeAttribute('class')
唉,原本打算将DOM系列洋洋洒洒来几篇,越写越发现自己肚里没东西。据说要想写出个100字左右的博文,你得有1000字左右的知识储备。看来我现在继续充电完善自己,等感觉自己能继续驾驭这个题目时再来继续这个系......
JS基础DOM篇之二:DOM级别与节点层次?的更多相关文章
- JS基础入门篇(二十七)—BOM
虽然上次写到js基础篇(二十四),这次直接写到(二十七).是为了提醒自己中间有几篇没写.特此说明一下啊. 1.window.open() 使用a标签呢,点击一下a标签页面才会跳转,有时候我们需要做的操 ...
- JS基础入门篇(二十四)—DOM(下)
1.offsetLeft/offsetTop offsetLeft/offsetTop : 到定位父级节点的距离. <!DOCTYPE html> <html lang=" ...
- JS基础入门篇(二十四)—DOM(上)
1.常用的节点类型,nodeType,attributes,childNodes. 1.元素节点 - 1 2.属性节点 - 2 3.文本节点 - 3 4.注释节点 - 8 5.文档节点 - 9 查看节 ...
- JS基础入门篇(二十)—事件对象以及案例(二)
案例一.点击按钮,选中input中的全部内容 select()方法:选中全部. 点击按钮选中输入框中的内容!!!! <!DOCTYPE html> <html lang=" ...
- JS基础入门篇(三十五)—面向对象(二)
如果没有面向对象这种抽象概念的小伙伴,建议先看一下我写的JS基础入门篇(三十四)-面向对象(一)
- JS基础--函数与BOM、DOM操作、JS中的事件以及内置对象
前 言 絮叨絮叨 这里是JS基础知识集中讲解的第三篇,也是最后一篇,三篇JS的基础,大多是知识的罗列,并没有涉及更难得东西,干货满满!看完这一篇后,相信许多正在像我一样正处于初级阶段的同学, ...
- jQuery基础修炼圣典—DOM篇(二)jQuery遍历
1.children()方法 jQuery是一个合集对象,如果想快速查找合集里面的第一级子元素,此时可以用children()方法.这里需要注意:.children(selector) 方法是返回匹配 ...
- jquery基础学习之DOM篇(二)
在此之前请牢记,jquery 是一个合集对象!!!! 1.节点创建 js创建方法: 创建元素:document.createElement 设置属性:setAttribute 添加文本:innerHT ...
- JS基础速成(三)- DOM(文件对象模型)
.t1 { background-color: #ff8080; width: 1100px; height: 40px } 一.DOM树的基本结构 DOM节点分为三大类:元素节点(标签节点),属性节 ...
随机推荐
- Selenium Tutorial (2) - Selenium IDE In Depth
Installing Firefox and Firebug Installing and Opening Selenium IDE Starting with test cases and test ...
- PHP中 对象自动调用的方法:__set()、__get()、__tostring()
总结: (1)__get($property_name):获取私有属性$name值时,此对象会自动调用该方法,将属性name值传给参数$property_name,通过这个方法的内部 执行,返回我们传 ...
- 【html】页面制作规范文档
每天都在写html/css/js代码,总结的一些页面制作的规范 文件命名规范 1) 文件目录.文件名称统一用小写的英文字母.数字.下划线组合,文件名要与表现的内容相近,不到万不得已不要以拼音作为名称, ...
- 开源Jabber(XMPP) IM服务器介绍
一.摘要 这是我粗略读了一遍Jabber协议和相关技术文章后的产物,有些地方不一定准确.在文章中引用的一些代码来自www.jabber.org上的文章. 二. 什么是Jabber Jabber就 ...
- BasicDataSource配备
BasicDataSource配置 commons DBCP 配置参数简要说明 前段时间因为项目原因,要在修改数据库连接池到DBCP上,折腾了半天,有一点收获,不敢藏私,特在这里与朋友们共享. 在配置 ...
- Android平台程序崩溃的类型及原因列举
Android平台程序崩溃大家都应该遇到过,force close和ANR应该是大家遇到较多的. 这里把Android平台程序崩溃的各种类型做一个简述和原因列举. 1.ANR(可见ANR): 发生场景 ...
- Android 引用library project
1.如何将一个android工程作为库工程(library project) library project是作为jar包被其它android工程使用的,首先它也是普通的android工程.然后: 1 ...
- String.valueOf()
1. 由 基本数据型态转换成 String String 类别中已经提供了将基本数据型态转换成 String 的 static 方法 也就是 String.valueOf() 这个参数多载的方法 有下 ...
- extjs form submit 总是执行failure
代码: function createWeekReort() { if (form.getForm().isValid()) { Ext.Msg.confirm("提示", &qu ...
- Motan:目录结构
motan是由maven管理的,在最外层的pom.xml中可以看出这个项目有多个模块组成. <modules> <module>motan-core</module> ...