前端(六):JavaScript面向对象之宿主对象
宿主对象即浏览器提供的对象,主要包括DOM对象和BOM对象。
一、DOM源起
1.SGML、XML和XHTML
SGML(标准通用标记语言)是定义使用标签来表示数据的标记语言的语法。
- 标签由一个小于号和一个大于号之间的文本组成,如<title>
- 标签分为起始标签和结束标签,分别表示一个特定区域的开始和这个特定区域的结束,如<title>标题</title>
- 特性是定义在起始标签内的值。如<img src="pircutre.jpg">,src就是其特性
HTML遵循SGML标记语言的语法,它是的SGML一种应用。或者说,SGML用来定义HTML的文档类型定义(DTD)。SGML还用来编写XML的DTD。
XML对SGML的语法做了更细致和严谨的扩展。
- SGML的奇怪语法:
- 某些标签不语序出现结束标签,如HTML中的<img>标签,否则会出现错误。
- 某些标签的结束标签可以不写,如HTML中的<p>标签。
- 标签可以以任何顺序嵌套,如<div><span></div></span>。
- 某些特性必须包含值,如<img src="picture.jpg">。
- 某些特性不要求一定有值,如<td nowrap>。
- 定义特性的两边有没有加双引号都是可以的,如<img src=picture.jpg>也是允许的。
- XML去掉了许多SGML中的随意语法,并且规定了新的语法:
- 任何的起始标签都必须有一个结束标签。
- 可以采用另一种简化语法,即一个标签同时表示起始标签和结束标签,即<tag />,如<br />,<hr />。
- 标签必须按合适的顺序嵌套。就近原则书写结束标签。
- 所有的特性都必须有值。
- 所有的特性都必须在值得周围加上双引号。
XML衍生出了MathML、SVG、RDF、RSS等等。同时,HTML被改进为XHML,即遵循XML语法的HTML。XHMTL被称为严格模式。
2.XML的API
XML定义了HTML的数据排版和解析方式。根据XML语言规范,需要制定API来实现对这些数据的操作和访问。
DOM模型就是最为流行的针对XML的基于树的API。它将XML解析为一颗有节点的树模型,并使用一系列互相关联的对象来表示XML的代码。从而能够指导开发增删改查等具体API的实现。
DOM是语言无关的API,它并不与其它语言绑定。但对于JavaScript而言,DOM被习惯理解成API集合。
HTML DOM (文档对象模型)
- 当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。
- HTML DOM 模型被构造为对象的树。通过 HTML DOM,可访问 HTML 文档的所有元素。
- <html>
<head>
<title>...</title>
...
</head>
<body>
<div>
...
</div>
...
</body>
</html>
- 通过可编程的文档对象模型,JavaScript 获得了足够的能力来创建动态的 HTML。即Javascript可以操作四个内容:元素、属性、样式和事件。html元素、html属性、css样式、事件。html元素、元素属性、元素样式和事件。html元素、html属性、css样式、事件。
- HTML DOM 是浏览器对象BOM的一个属性。
3.DOM node接口和属性访问
DOM定义了树节点(node)的层次和其Node接口,以及这些节点的类型和其数字标号。这些常量会在选择节点之后以属性的方式查询。
接口名称 |
释义 |
属性访问方式 |
数字表示 |
Element |
表示起始标签和结束标签之间的内容。这是唯一可以同时包含特性和子节点的节点类型。 |
Node.ELEMENT_NODE |
1 |
Attr |
代表一对特姓名和特性值。这个节点类型不能包含子节点。 |
Node.ATTRIBUTE_NODE |
2 |
Text |
代表XML文档中的在其实标签和结束标签之间的,或者CData Se*n内的普通文本。这个节点类型不能包含子节点。 |
Node.TEXT_NODE |
3 |
CDataSection |
<![CDATA[]]>的对象表现形式。这个几点类型仅能包含文本节点Text作为子节点。 |
Node.CDATA_SECTION_NODE |
4 |
Entity |
表示在DTD中的一个实体定义,例如<!ENTITY foo "foo">。这个节点类型不能包含子节点。 |
Node.ENTITY_NODE |
5 |
EntityReference |
代表一个实体引用,例如"。这个节点类型不能包含子节点。 |
Node.ENTITY_REFERENCE_NODE |
6 |
ProcessingInstruction |
代表一个PI。这个节点类型不能包含子节点。 |
Node.PROCESSING_INSTRUCTION_NODE |
7 |
Comment |
代表XML注释。这个节点类型不能包含子节点。 |
Node.COMMENT_NODE |
8 |
Document |
代表在DTD中定义的记号。这个很少用到。 |
Node.DOCUMENT_NODE |
9 |
DocumentType | 最顶层的节点,所有的其它节点都是附属于它的。 | Node.DOCUMENT_TYOE_NODE | 10 |
DoucmentR=Frament | DTD引用(使用<!DOCTYPE>),如<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">。它不能包含子节点。 | Node.DOCUMENT_FRAMENT_NODE | 11 |
Notation |
可以像Document一样来保存其它节点。 |
Node.NOTATION_NODE |
12 |
4.节点特性和方法
Node接口定义了所有节点类型都包含的特性和方法。
特性/方法 | 类型/返回类型 | 说明 |
nodeName | String | 节点的名字 |
nodeValue | String | 节点的值 |
nodeType | Number | 节点的类型常量值 |
ownerDocument | Document | 节点的所属文档 |
childNodes |
NodeList | 节点的所有子节点列表 |
firstChild | Node | 子节点列表的第一个节点 |
lastChild | Node | 子节点列表的最后一个节点 |
hasChildNodes() | Boolean | 是否包含子节点 |
appendChild(node) | Node | 将node添加到childNodes末尾 |
removeChild(node) | Node | 从childNodes中删除node |
replaceChild(newnode,oldnode) | Node | 将childNodes中的oldnode替换成newnode |
insertBefore(newnode, refnode) | Node | 在childNodes中的refnode之前插入newnode |
previousSibling | Node | 指向前一个兄弟节点,如果这个节点就是第一个兄弟节点,那么该值为null |
nextSibling | Node | 指向后一个兄弟节点,如果这个节点就是最后一个兄弟节点,那么该值为null |
attributes | NamedNodeMap | 包含了代表一个元素的特性的Attr对象,仅用于Element节点 |
5.HTML DOM
任何基于XML的语言,如XHTML和SVG,因为它们遵循XML语法,所以可以使用上述的Node接口操作。然而很多语言会继续定义它们自己的DOM来扩展XML以提供特定功能。
开发XML DOM的同时,W3C还一起开发了针对XHTML(以及HTML)的DOM。这个DOM定义了一个HTMLDocument一个HTMLElement作为实现基础。
每个HTML元素通过Ω它自己的HTMLElement类型表示,如HTMLDivElement代表了<div>元素。但有少数的除外。
二、DOM通用节点对象操作
1.DOM的通用属性
alinkColor |
激活的链接的颜色,如<body alink="color">定义的。 |
bgColor |
页面的背景颜色,如<body bgcolor="color">定义的。 |
fgColor |
页面的文本颜色,如<body text="color">定义的。 |
lastModified |
最后修改页面的日期,是字符串。 |
linkColor |
链接的颜色,如<body link="color">定义的 |
referrer |
浏览器当前页后退一个位置的url |
title |
<title>标签中显示的文本 |
URL |
当前页面的url |
vlinkColor |
访问过的链接的颜色,如<body vlink="color">定义的 |
* 这些属性是引用了<body>标签中的旧HTML特性,应该用样式表代替它们。 |
2.DOM的通用集合
ahchors |
页面中所有锚的集合(由<a name="ahchorname></a>标签表示)。 |
applets |
页面中所有applet的集合。 |
embeds |
页面中所有嵌入式对象的集合(由<embed>标签表示) |
forms |
页面中所有表单的集合。 |
images |
页面中所有图像的集合。 |
links |
页面中所有链接的集合(由<a href="somewhere.htm"><a>表示。 |
3.DOM通用节点操作
document对象是BOM的一部分,同时也是HTML DOM的HTMLDocument对象的表现形式,即它也是XML DOM Document对象。
1查找节点
document[Element].getElementById() | 返回对拥有指定 id 的第一个对象的引用。 |
document[Element].getElementsByName() | 返回带有指定名称的对象集合。 |
document[Element].getElementsByTagName() | 返回带有指定标签名的对象集合。 |
document[Element].getElementsByClassName() | 返回带有指定类名的对象集合。 |
2创建节点
document.createAttribute(name) |
创建属性名为name的属性节点。 |
document.createElement() |
创建标签名为tagName的元素。 |
document.createTextNode(text) |
创建包含文本text的文本节点。 |
* 创建其它Node接口定义的节点没有太大用处。因为被更简便的操作替代。 |
3添加节点
Element.appendChild(Node) |
添加Node子元素。 |
Element.insertBefore(newNode, oldNode) |
在某个子节点对象前添加新节点。 |
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>节点选取</title> <style type="text/css"> .outer { width: 200px; background-color: yellow; } .inner{ float: left; height: 50px; width: 50px; } .inner:first-child{ background-color: red; } .inner:last-child{ background-color: blue; } .header, .bottom{ height: 50px; width: 200px; background-color: green; } .clearfix:before, .clearfix:after{ content: ""; height: 0; line-height: 0; display: block; visibility: hidden; clear: both; } </style> </head> <body> <div class="header"></div> <div class="outer clearfix"> </div> <div class="bottom"></div> <script> function newDiv() {} newDiv.create = newDiv.prototype.create = function (className) { var oDiv = document.createElement("div"); // 第一种方式 /* var oText = document.createTextNode("第一个子div"); oDiv.appendChild(oText); var oAttr = document.createAttribute("class"); oAttr.nodeValue = className; oDiv.setAttributeNode(oAttr); */ // 第二种方式 oDiv.innerHTML = "第二个子div"; oDiv.setAttribute("class", className); return oDiv; }; var oDiv = new newDiv(); var oDivFather = document.getElementsByClassName("outer")[0] oDivFather.appendChild(oDiv.create("inner")); oDivFather.appendChild(oDiv.create("inner")); </script> </body> </html>
4删除节点
Element.removeChild(Node) 删除Node子元素。
5替换节点
Element.replacChild(newNode, oldNode) 替换子元素。
6.节点属性和方法
节点属性和方法包含DOM NOde接口定义的所有属性和方法。HTML DOM 还包括其它的一些属性和方法。详细参见http://www.w3school.com.cn/jsref/dom_obj_all.asp。
Element.tagName |
返回元素的标签名。 |
Element.cloneNode() |
复制当前元素。 |
Element.normalize() |
合并元素中相邻的文本节点,并移除空的文本节点。 |
Element.parentNode |
返回元素的父节点。 |
Element.ownerDocument |
返回元素的根元素(文档对象)。 |
nodelist.item() |
返回 NodeList 中位于指定下标的节点。 |
nodelist.length |
返回 NodeList 中的节点数。 |
Element.toString() |
把元素转换为字符串。 |
4.DOM通用属性操作
1.查找属性
Element.hasAttribute() |
如果元素拥有指定属性,则返回true,否则返回 false。 |
Element.hasAttributes() |
如果元素拥有属性,则返回 true,否则返回 false。 |
2.获取属性
Element.getAttribute() |
返回元素节点的指定属性值。 |
Element.getAttributeNode() |
返回指定的属性节点。 |
3.设置属性
Element.setAttribute() |
把指定属性设置或更改为指定值。 |
Element.setAttributeNode() |
设置或更改指定属性节点。 |
4.删除属性
Element.removeAttribute() |
从元素中移除指定属性。 |
Element.removeAttributeNode() |
移除指定的属性节点,并返回被移除的节点。 |
5.getattr和setattr获取或设置属性
除了hasAttribute、getAttributes、setAttributes、removeAttribute操作属性,一些属性也可以通过节点.属性的方式获取/设置属性。
Element.id |
设置或返回元素的 id。 |
Element.style |
设置或返回元素的 style 属性。 |
Element.innerHTML |
设置或返回元素的内容。 |
Element.className |
设置或返回元素的 class 属性。 |
Element.title |
设置或返回元素的 title 属性。 |
Element.textContent |
设置或返回节点及其后代的文本内容。 |
Element.contentEditable |
设置或返回元素的文本方向。 |
Element.dir |
设置或返回元素的内容是否可编辑。 |
Element.accessKey |
设置或返回元素的快捷键。 |
Element.lang |
设置或返回元素的语言代码。 |
Element.namespaceURI |
返回元素的 namespace URI。 |
Element.tabIndex |
设置或返回元素的 tab 键控制次序。 |
设置距离、偏移和可见宽高。
Element.clientHeight |
返回元素的可见高度。 |
Element.clientWidth |
返回元素的可见宽度。 |
Element.offsetWidth |
返回元素的宽度。 |
Element.offsetLeft |
返回元素的水平偏移位置。 |
Element.offsetParent |
返回元素的偏移容器。 |
Element.offsetTop |
返回元素的垂直偏移位置。 |
Element.scrollHeight |
返回元素的整体高度。 |
Element.scrollLeft |
返回元素左边缘与视图之间的距离。 |
Element.scrollTop |
返回元素上边缘与视图之间的距离。 |
Element.scrollWidth |
返回元素的整体宽度。 |
6.检查元素
Element.isContentEditable |
设置或返回元素的内容。 |
Element.isDefaultNamespace() |
如果指定的 namespaceURI 是默认的,则返回 true,否则返回 false。 |
Element.isEqualNode() |
检查两个元素是否相等。 |
Element.isSameNode() |
检查两个元素是否是相同的节点。 |
Element.compareDocumentPosition() |
比较两个元素的文档位置。 |
Element.isSupported() |
如果元素支持指定特性,则返回 true。 |
三、DOM节点的特殊属性和方法
本节内容摘自JavaScript使用手册。
1.form表单
1.使用方式
文件对象的子对象,Javascript的runtime engine自动为每一个表单建立一个表单对象。
格式:
- document.forms[索引].属性
- document.forms[索引].方法(参数)
- document.表单名称.属性
- document.表单名称.方法(参数)
2.form属性
action | 表单动作 |
elements | 以索引表示的所有表单元素 |
encoding | MIME的类型 |
length | 表单元素的个数 |
method | 方法 |
name | 表单名称 |
target | 目标 |
3.form方法
handleEvent(事件) | 使事件处理程序生效 |
reset() | 重置 |
submit() | 提交 |
4.form子元素共有的属性和方法
form子元素共有的属性:
form | 该对象所在的表单 |
name | 该对象的name属性 |
type | 该对象的type属性 |
value | 该对象的value属性 |
form子元素共有的方法:事件。
带有"checked"属性的子元素:单选按钮、复选框。
2.a对象
网页中的链接均会被自动看作链接对象,可以通过document.links访问。它是一个当前页面的所有a链接的集合。
1.a属性
href | 完整的URL字串 |
host | 主机域名或IP地址 |
hostname | URL中的host+port |
port | URL中端口部分 |
hash | URL中的锚点名称 |
protocol | URL中通讯协议部分 |
pathname | URL中path部分 |
上一篇: react 之 reflux 填坑
下一篇: IE中操作粘贴板复制和粘贴
推荐阅读
-
面向对象的六大原则之 单一职责原则——SRP
-
前端(六):JavaScript面向对象之宿主对象
-
python 之 前端开发( JavaScript变量、数据类型、内置对象、运算符、流程控制、函数)
-
前端笔记之JavaScript面向对象(三)初识ES6&underscore.js&EChart.js&设计模式&贪吃蛇开发
-
前端笔记之JavaScript面向对象(四)组件化开发&轮播图|俄罗斯方块实战
-
前端笔记知识点整合之JavaScript面向对象(一)Object&函数上下文&构造函数&原型链
-
从零开始学习前端JAVASCRIPT — 12、JavaScript面向对象编程
-
重学js之JavaScript 面向对象的程序设计(创建对象)
-
javascript高级程序设计第三版 第六章 面向对象的程序设计
-
《JavaScript高级程序设计》笔记:面向对象的程序设计(六)
发表评论