是针对HTML和XML文档的一个API(应用程序编程接口),DOM可以将任何HTML,XML文档描绘成一个由多层节点构成的结构,每个节点都拥有各自的特点,数据和方法,另外与其他节点存在某种关系。
1. Node类型
javascript中所有的节点类型都继承自Node类型,所有节点类型都共享着相同的基本属性和方法。
1) 节点关系
childNodes :属性,保存一个NodeList对象,NodeList是一种类数组对象用来保存一组有序的节点,NodeList是基于DOM结构动态执行查询的结果,DOM结构变化可以自动反应到NodeList对象中。访问时可以通过中括号访问,也可以通过item()方法访问。
可以使用slice方法将NodeList转换为数组
var arr = Array.prototype.slice.call(nodes,0);
parentNode :属性,指向文档树中的父节点。包含在childNodes列表中所有的节点都具有相同的父节点,每个节点之间都是同胞节点。
previousSibling :属性,兄弟节点中的前一个节点
nextSibling :属性,兄弟节点中的下一个节点
firstChild :属性,childNodes列表中的第一个节点
lastChild :属性,childNodes列表中的最后一个节点
ownerDocument :属性,指向表示整个文档的文档节点。
hasChildNodes() :方法,在包含一个或多个子节点的情况下返回true
2) 操作节点
以下四个方法都需要父节点对象进行调用!
appendChild() :向childNodes列表末尾添加一个节点。返回新增的节点。关系更新如果参数节点已经为文档的一部分,位置更新而不插入,dom树可以看做是由一系列的指针连接起来的,任何DOM节点不能同时出现在文档中的多个位置。
insertBefore() :第一个参数:要插入的节点;第二个参数:作为参照的节点。被插入的节点会变成参照节点的前一个同胞节点,同时被方法返回。如果第二个参数为null将会将该节点追加在NodeList后面
replaceChild() :第一个参数:要插入的节点;第二个参数:要替换的节点。要替换的节点将由这个方法返回并从文档树中被移除,同时由要插入的节点占据其位置。
removeChild() 接受一个参数,即要移除的节点。移除的节点将作为方法的返回值。其他方法,任何节点对象都可以调用。
cloneNode() 用于创建调用这个方法的节点的一个完全相同的副本。有一个参数为布尔类型参数为true时,表示深复制,即复制节点以及整个子节点树。参数为false的时候,表示浅复制,只复制节点本身。
normalize() 处理文档树中的文本节点,由于解析器的实现或DOM操作等原因,可能会出现文本节点不包含文本,或者接连出现两个文本节点,当在某个节点上调用了该方法,会删除空白节点,会找到相邻的两个文本节点,并将他们合并为一个文本节点。
2. Document类型
nodeType : 9 节点类型
nodeName : "#document" 节点名
nodeValue: null 节点值
javascript通过使用Document类型表示文档。在浏览器中,document对象是HTMLDocument的一个实例,表示整个HTML页面。document对象是window对象的一个属性,因此可以直接调用。
HTMLDocument继承自Document
1) 文档子节点
可以继承Node中所有的属性和方法
documentElement 属性始终指向HTML页面中的html元素。
body 属性,直接指向body元素
doctype 属性,访问DOCTYPE, 浏览器支持不一致,很少使用
title 属性,获取文档的标题
URL 属性,取得完整的URL
domain 属性,取得域名
referrer 属性,取得来源页面的URL
images 获取所有的img对象,返回HTMLCollection类数组对象
forms 获取所有的form对象,返回HTMLCollection类数组对象
2) 查找元素
getElementById()
参数为要取得元素的ID,如果找到返回该元素,否则返回null如果页面中多个元素的ID值相同,只返回文档中第一次出现的元素。如果某个表单元素的name值等于指定的ID,该元素也会被匹配。
getElementsByTagName()
参数为要取得元素的标签名,返回包含另个或者多个元素的NodeList,在HTML文档中该方法返回的是
HTMLCollection对象,与NodeList非常类似。可以通过[index/name],item(),namedItem(name)访问
getElementsByName()
参数为元素的name,返回符合条件的HTMLCollection
IE8及以下版本不支持
getElementsByClassName()
参数为一个字符串,可以由多个空格隔开的标识符组成。当元素的class属性值包含所有指定的标识符时才匹配。HTML元素的class属性值是一个以空格隔开的列表,可以为空或包含多个标识符。
IE8及以下版本不支持
3. Element类型
nodeType : 1
nodeName : 元素的标签名
nodeValue : null
1) HTML元素
所有的HTML元素都由HTMLElement类型表示,或者其子类型表示。每个HTML元素都
应具有如下一些属性以及html元素特有的属性。
id 元素在文档中的唯一标识符
title 有关元素的附加说明信息
className 与元素class特性对应
src img元素具有的属性
alt img元素具有的属性
lang 元素内容的语言代码,很少使用!
dir 语言方向,ltr,rtl 左到右,右到左、
可以通过属性访问到该属性对应的值
a. 取得属性
getAttribute() 参数为实际元素的属性名,calss,name,id,title,lang,dir一般只有在取得自定义特性值的情况下,才会用该方法,大多数直接使用属性进行访问,比如style,onclick
b. 设置属性
setAttribute() 两个参数,第一个参数为要设置的特性名,第二个参数为对应的值。如果该值存在,替换。
c. 移除属性
removeAttribute() 移除指定的特性
d. attributes属性,其中包含了一个NamedNodeMap与NodeList类似。
getNamedItem(name) 通过属性名获取属性对象
removeNamedItem(name) 从列表中删除nodeName属性等于name的值
setNamedItem(node) 向列表中添加一个节点
item(pos) 返回位于数字pos位置处的节点
e. 创建元素
createElement() 一个参数,要创建元素的标签名。
f. 元素的子节点
- item1
- item2
- item3
ie8及以下版本浏览器 : 3个子节点
其他浏览器 : 7个子节点
getElementByTagName() 当通过元素调用这个方法的时候,搜索起点为当前元素。
2)作为文档树的文档
将文档看做是Element对象树,忽略文档Text,Comment节点
Element中的属性
children :类似于childNodes,返回NodeList对象,但是该对象中仅包含Element对象
firstElementChild :第一个孩子元素节点
lastElementChild :最后一个孩子元素节点
nextElementSibling :下一个兄弟元素节点
previousElementSibling :上一个兄弟元素节点
childElementCount :子元素的数量,返回值和children.length值相等
4) 元素内容
<div id="one">
<span>hellospan>
div>
one.innerHTML // <span>hellospan>
one.textContent //hello
innerHTML 返回元素内容
textContent 非ie浏览器中获取文本内容
innerText ie浏览器获取文本内容
4. Text类型: 文本类型
nodeType : 3
nodeName : "#text"
nodeValue : 文本内容 ,也可以通过data获取
文本节点。包含的是可以按照字面解释的存文本内容。
<span>这个是文本节点span>
length 属性,文本长度
appendData(text) 追加文本内容
deleteData(beginIndex,count) 删除文本内容
insertData(beginIndex,text) 插入文本内容
replaceData(beginIndex,count,text) 替换文本内容
splitText(beiginIndex) 从beginIndex位置将当前文本节点分成两个文本节点
substringData(beiginIndex,count)从beginIndex开始提取count个子字符串
document.createTextNode() 创建文本节点,参数为要插入节点中的文本
5. Comment类型: 注释类型
nodeType : 8
nodeName : "#comment"
nodeValue: 注释的内容
<div id = "myDiv">div>
Comment类型
------------------------------------------------------------------------------------
javascript与HTML之间的交互是通过事件实现的。事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间。事件三要素:
事件目标(event target) :发生的事件与之相关联或与之相关的对象
事件处理程序(event handler):处理或相应事件的函数
事件对象(event object) :与特定事件相关且包含有关该事件详细信息的对象。
1.事件流
描述的是从页面中接受事件的顺序
1) 事件冒泡
事件开始由最具体的元素接收,然后逐级向上传播到不具体的节点。
<html>
<head>head>
<body>
<div>click mediv>
body>
html>
当点击了div元素,这个click事件会按照如下顺序传播
div->body->html->document
IE8以及更早版本只支持事件冒泡。
2) 事件捕获
不太具体的节点更早接收事件,具体的节点到最后接收事件。
当点击了div元素,按照如下方式触发click事件
document->html->body->div
3) dom事件流
“DOM2级事件”规定了事件流包括三个阶段:事件捕获阶段,处理目标阶段和事件
冒泡阶段。
事件捕获: document->html->body
处理目标: 事件处理
事件冒泡: div->body->html->document
2.事件处理程序
事件就是用户或浏览器自身执行的某种动作,响应某个事件的函数为事件处理程序,事件处理程序以”on”开头(onclick,onload)
1) HTML事件处理程序
type="button" value="clickMe" onclick = "alert('is clicked')">
不能在事件中使用未经转义的HTML语法字符
type="button" value="clickMe" onclick = "showMsg()">
点击按钮会调用showMsg()函数,事件处理程序的代码在执行时,有权访问全局作用域的任何代码。
2) DOM0级事件处理程序
通过javascript制定事件处理程序的传统方式,将一个函数赋值给一个事件处理程序属性,简单,跨浏览器。
var btn = document.getElementById("btn");
btn.onclick = function(){
alert('cliked');
}
dom0级方法制定的事件处理程序被认为是元素的方法,因此这个时候事件处理程序是在元素的作用域中运行,this指向当前元素。
btn.onclick = null; //删除事件处理程序
3) DOM2级事件处理程序
1.非IE事件处理程序
addEventListener() //指定事件
removeEventListener() //删除事件
所有的dom节点都有这两个方法,并且它们接受3个参数:
要处理的事件名
作为事件处理的函数
布尔值:true在捕获阶段调用事件处理程序;false在冒泡阶段调用事件处理程序
var btn = document.getElementById("btn");
btn.addEventListener("click",function(){
alert(this.id); //该函数在其依附的元素的作用域中运行。
},false);
btn.addEventListener("click",function(){
alert(this.id);
},false);
可以添加多个事件处理程序,并且按照添加她们的顺序触发。
移除事件传入的参数与添加处理程序时使用的参数相同,添加事件时如果使用匿名函数将无法删除
var btn = document.getElementById("btn");
var handler = function(){
alert(this.id);
}
btn.addEventListener("click",handler,false);
btn.removeEventListener("click",handler,false);//移除
2.IE事件处理程序
attachEvent()
事件处理程序会在全局作用域中运行,因此this指向window对象。为一个对象添加两个相同的事件,事件处理程序的顺序是按照添加相反顺序进行处理
detachEvent()
这两个方法接受相同的两个参数:(事件处理程序名称,事件处理函数)
事件处理程序都被添加到冒泡阶段
4) 跨浏览器的事件处理程序
见代码 lib.js
3.事件对象
1) dom中的事件对象
在触发DOM上的某个事件时,会产生一个事件对象event,这个对象包含着所有与事件相关的信息,默认会将event对象传入到事件处理函数中
dom.onclick = function(event){
console.log(event);
}
dom.addEventListener("click",function(event){
console.log(event);
},false);
属性 类型 说明
bubbles Boolean 事件是否冒泡
cancelable Boolean 是否可以取消事件默认行为
currentTarget Element 当前正在处理事件的那个元素
eventPhase Integer 调用事件处理程序的阶段 1,捕获 2,处于目标 3,冒泡
target Element 事件目标
type String 事件类型
trusted Boolean 事件是否是浏览器生成的
preventDefault()Function 取消事件的默认行为
stopPropagation()Function 取消事件的进一步捕获或者冒泡
在事件处理程序内部,对象this始终等于currentTarget值,而target则只包含事件的实际目标。如果直接将事件处理程序指定给了目标元素,this,currentTarget,target包含相同的值。
2) IE中的事件对象
event可以作为window对象的一个属性存在
dom.onclick = function(){
console.log(window.event);
window.event.returnValue = false;//阻止默认行为
window.event.cancalBubble = true;//取消冒泡
}
attachEvent添加事件处理程序的时候,event对象会作为参数传入事件处理函数中
dom.attachEvent("onclick",function(event){
console.log(window.event);
});
属性 类型 说明
cancelBubble Boolean 是否取消时间冒泡,值为true取消冒泡 stopPropagation()
returnValue Boolean 取消时间默认行为,值为false阻止 preventDefault()
srcEvent Element 事件的目标 target
type String 被触发的时间 的类型
4.事件类型
1) UI事件
load: 当页面完全加载后再window上触发,当所有框架加载完毕时在框架集上触发
当图像加载完毕时在img元素上触发,当嵌入的内容加载完时在object触发
unload: 当页面完全卸载后再window上触发,当所有框架都卸载后在框架集上触发
当嵌入的内容卸载完毕后再object上触发,(firefox不支持)
select: 当用户选择文本框(input,textarea)中的一个或多个字符时
resize: 当浏览器窗口被调整到一个新的高度或者宽度时,会触发
scroll: 当用户滚动带滚动条的元素中的内容时,在该元素上触发
resize,scroll会在变化期间重复被激发,尽量保持代码简单
2) 焦点事件
blur : 元素失去焦点的时候触发
focus : 元素获得焦点的时候触发,不支持冒泡
//IE支持
focusin : 与focus等价,支持冒泡
focusout: 与blur等价,支持冒泡
3) 鼠标与滚轮事件
click : 点击主鼠标按钮或者按下回车按键的时候触发。只有在一个元素上相继发生mousedown,mouseup事件,才会触发click事件
dblclick: 双击主鼠标按钮时触发。只有在一个元素上相继触发两次click时间才会触发dbclick事件
mousedown:任意鼠标按钮按下时触发
mouseup : 释放鼠标按钮触发p;
mousemove :鼠标在元素内部移动的时候重发触发
mousewheel:滚轮事件
mouseover :鼠标位于元素外部,将其首次移入另一个元素边界之内时触发
支持子元素
mouseenter:鼠标光标从元素外部首次移动到元素范围内激发,不冒泡
不支持子元素
mouseout :在位于元素上方的鼠标光标移入到另外一个元素中
支持子元素,在被选元素上与mouseleave效果相同
mouseleave:在位于元素上方的鼠标光标移动到元素范围之外时触发,不冒泡
不支持子元素
4) 相关元素,event特殊属性
1.客户区坐标位置
clientX,clientY 事件发生时,鼠标指针在视口中的水平和垂直坐标
2.页面坐标位置
pageX,pageY 事件发生时,鼠标指针在页面本身而非视口的坐标,页面没有滚动的时候,pageX和pageY的值与clientX和clientY值相等
3.屏幕位置
screenX,screenY
4.修改键
值为boolean类型,用来判断对应的按键是否被按下
shiftKey
ctrlKey
altKey
metaKey
5.鼠标按钮
mousedown,mouseup,该事件的event对象中包含了button属性,表示按下或释放的按钮。0表示主鼠标按钮,1表示中间的滚动按钮,2表示次鼠标按钮
5) 键盘与文本事件
keydown :按下键盘任意键时触发,如果按住不放会重复触发此事件
keypress:按下键盘字符键时触发,如果按住不放会重复触发此事件
keyup :释放键盘上键时触发
当键盘事件发生时,event对象的keyCode属性中会包含一个代码与键盘上的特定键对应,对数字字母键,keyCode属性的值与ASCII码中对应的小写字母和数字编码相同
详情请查看keycode
一、基础知识
在html中,表单是由form元素表示的。在javascript中,表单对应的是HTMLFormElement类型,是HTMLElement子类型。其特有的属性和方法如下:
acceptCharset :服务器能处理的字符集。等价于accept-charset。
action :接受请求的URL;等价于HTML中的action特性
elements :表单中所有控件的集合。
enctype :请求的编码类型
application/x-www-form-urlencoded 默认值,在发送到服务器之前,所有字符都会进行编码
text/plain 空格转换为 “+” 加号,但不对特殊字符编码。
multipart/form-data 不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。
length :表单中控件的数量
method :要发送的HTTP请求类型。
name :表单的名称
target :用于发送请求和接受相应的窗口名称。
submit() :提交表单
reset() :将所有表单域重置为默认值
1) 提交表单
1.通用方式
2.自定义方式
3.图像按钮
提交表单时,浏览器会在将请求发送给服务器之前触发submit事件,可以进行表单验证。但是当调用表单对象的submit()方法的时候不会触发submit事件。
2) 重置表单
1.通用方式
2.自定义方式
在重置表单时,所有表单字段都会恢复到页面刚加载完毕时的初始值。
3) 表单字段
elements属性,该属性是表单中所有表单元素的集合,这个elements集合是一个有序列表,其中包含着表单的所有字段 input,textarea,button…。如果有多个表单控件都在使用一个name(单选),则返回以该name命名的一个NodeList
1.共有的表单字段属性
disabled :布尔值,表示当前字段是否被禁用
form :指向当前字段所属表单的指针,只读
name :当前字段的名称
readOnly :Boolean,表示当前字段是否只读
type :表示当前字段类型, checkbox,radio
type="select-one"
type="select-multiple"
...
value :当前字段将被提交给服务器的值。
表单重复提交的解决方案
EventUtil.addHandler(form,"submit",function(event){
event= EventUtil.getEvent(event);
var target = EventUtil.getTarget(event);
var btn = target.elements["submit-btn"];
btn.disabled = true;
});
详情请查看EventUtil
2.共有的表单字段方法
focus() :用于将浏览器的焦点设置到表单字段,使其可以相应键盘事件。
blur() :用于将浏览器的焦点从元素中移走。
3.共有的表单字段事件
blur :当前字段失去焦点时触发
change:对于input,textarea元素,失去焦点切value值改变时触发;对于select元素在其选项改变时触发
focus :当前字段获得焦点时触发。
二、文本框脚本
<input type="text" value="初始值">
<textarea name="" cols="30" rows="10">初始值textarea>
都将用户输入的内容保存到value属性中。
1) 选择文本方法
select() :用于选择文本框中所有的文本
2) 选择文本事件
select :选择了文本框中的文本时,就会触发该事件
三、选择框脚本
通过select,option元素创建,属于HTMLSelectElement类型,提供了以下属性和方法
1) HTMLSelectElement类型
add(newOption,relOption); :向控件中插入新的option元素,在relOption之前
remove(index); :移除给定位置的选项
multiple :boolean值,表示是否允许多项选择。
options :控件中所有
2) HTMLOptionElement类型 option
index :当前项在options集合中的索引
lable :当前项的标签
selected:布尔值,表示当前项是否被选中。
text :选项的文本
value :选项的值。
var selectedOption = selectbox.options[selectbox.selectedIndex];