Text类型
nodeType值为3,nodeName为#text,nodeValue是包含的文本。
doucment.createTextNode(str):创建新的文本节点
1
2
3
4
5
6
7
8
9var ele = document.createElement("div");
var textnode = document.createTextNode("hello");
ele.appendChild(textnode);
//或者再添加一个文本节点(同胞节点)
var textnode2 = document.createTextNode(" world");
ele.appendChild(textnode2);
document.body.appendChild(ele);normalize():合并目标下所有文本节点
1
2
3
4
5
6//在上一段的基础上
console.log(ele.childNode.length); //2
ele.normalize();
console.log(ele.childNode.length); //1
console.log(ele.firstNode.nodeValue); //hello worldsplitText(index):分割文本节点,按照指定位置分割成两个文本节点
Comment类型
nodeType值为8,nodeName为#comment,nodeValue是注释的内容。
1 | var comment = document.createComment("a comment"); |
Attr类型
nodeType值为2,nodeName为特性的名称,nodeValue是特性的值。
1 | var attr = document.createAttribute('align'); |
动态脚本
1 | //动态引入外部脚本 |
动态样式
和动态脚本类似。
1 | //引入外部style |
操作表格
DOM扩展
querySelector()方法
接收一个css选择符,返回匹配的第一个元素或者 null。
1 | var mydiv = document.querySelector('#mydiv'); |
querySelectorAll()方法
返回一个nodelist的实例。和querySelector类似。
matchesSelector()方法
检测调用元素与该选择符是否匹配。(部分浏览器不支持)
元素遍历
- childElementCount:返回子元素的个数
- firstElementChild和lastElementChild:指向第一个子元素/最后一个子元素
- previousElementSibling和nextElementSibling:指向前一个兄弟元素/后一个兄弟元素
html5相关
- getElementsByClassName()
接收一个或多个类名的字符串,返回nodelist。
1 | var ele = document.getElementsByClassName('username current'); |
classList属性
1
2
3
4
5
6div.classList.remove('classA').add('classB').toggle('classC');
//div移除类classA 添加classB 切换classC
//判断元素是否包含类名
if(div.classList.contains('classA') && !div.classList.contains('classB')){
//dosomething
}焦点管理
document.activeElement 属性:引用DOM中当前聚焦元素。默认情况下文档加载完时保存的是document.body,文档加载期间是null
document.hasFocus():判断是否聚焦
4. HTMLdocument扩展
document.readyState:loading正在加载文档;complete加载完成
document.compatMode:CSS1Compat标准模式;BackCompat混杂模式
document.charset和document.defaultCharset:文档使用的字符集
5. 插入标记
window.toStticHTML():传入html字符串,返回删除所有脚本节点和事件处理属性的html字符串
outerHTML():返回指定元素及其子元素的html标签;或替换指定元素及其子元素
innerHTML():返回指定节点的子元素;或替换子元素
insertAdiacentHTML():参数传插入位置(beforebegin/afterbegin/beforeend/afterend)和插入的html文本。
6. 其他扩展
parentNode.contains(node):检测该节点是否是后代节点
innerText():返回指定元素文档树中的文本;或插入文本替换指定元素的所有子节点
scrollIntoView():滚动
样式
访问元素的样式
1 | var div = document.getElementById('mydiv'); |
DOM样式属性和方法:
1 | //设置 |
计算属性(只读):
1 | //获取完整的属性(包括<style>样式表中的属性) |
操作样式表
css规则:
1 | //获取样式表中的css |
元素大小
偏移量
- offsetHeight:元素在垂直方向占用的空间(border+padding+content)
- offsetWidth:元素在水平方向占用的空间
- offsetLeft:元素的左外边框至父元素的左内边框的距离
- offsetTop:元素的上外边框至父元素的上内边框的距离
客户区大小:
clientHeight = height + paddingTop + paddingBottom
1 | //浏览器的视口大小 |
滚动大小:
- scrollHeight:在没有滚动条时的元素内容总高度
- scrollWidth:在没有滚动条时的元素内容总宽度
- scrollTop:滚动高度
- scrollLeft:横向滚动距离
遍历
NodeIterator
1
2
3
4
5
6
7
8
9
10
11
12var filter = function(node){
return node.tagname.toLowerCase() == 'p' ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;
};
var iterator = document.createNodeIterator(root,NodeFilter.SHOW_ELEMENT,filter,false);
//创建实例(遍历的根节点,显示的节点类型,过滤器,是否扩展实体引用)
var node = iterator.nextNode(); //指向下一个节点
//var node = iterator.previousNode();
while (node != null){
console.log(node.tagName); //输出标签名
node = iterator.nextNode();
}TreeWalker
document.createTreeWalker()和document.createNodeIterator方法类似,因此TreeWalker可以代替NodeIterator。TreeWalker可以在DOM结构中沿任何方向移动。
1 | var div = documnet.getElementById('div'); |
范围
简单选择:
1 | var range1 = document.createRange(), |
复杂选择:
借助setStart()和setEnd()可以选择节点的一部分。
1 | var p = document.getElementById('p'); |
操作选区:
1 | //接上 |
事件
事件是用户或浏览器自身执行的某种动作。
事件冒泡
事件开始时由最具体的元素接收然后逐级向上传播。
事件捕获
事件捕获是不具体的节点更早接收事件,然后往下传播到最具体的点。
事件处理程序
响应某个事件的函数。
DOM0级事件处理程序
1
2
3
4
5
6
7var btn = document.getElementById("mybtn");
btn.onclick = function(){//事件处理程序在所属元素的作用域内运行
console.log(this.id);
}
//删除
btn.onclick = null;DOM2级事件处理程序
addEventListener():传递3个参数,要处理的事件名,函数,true(事件捕获)/false(事件冒泡)
1 | var btn = document.getElementById("mybtn"); |
- IE事件处理程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15var btn = document.getElementById("mybtn");
btn.attachEvent("onclick",function(){
//事件处理程序在全局作用域中运行
console.log(this === window); //true
},false);
btn.attachEvent("onclick",function(){
console.log("click2"); //true
},false);//按照相反的顺序执行
var func = function(){
alert("abc");
}
btn.attachEvent("onclick",func);//匿名函数才能移除
btn.detachEvent("onclick",func);//移除事件
事件对象
DOM中的事件对象
1 | var btn = document.getElementById("mybtn"); |
在事件处理程序内部,对象this等于event.currentTarget。而event.target只包含事件的实际目标。
1 | var btn = document.getElementById("mybtn"); |
处理多个事件:
1 | var btn = document.getElementById("mybtn"); |
其他:
1 | var btn = document.getElementById("mybtn"); |
IE的事件对象
事件处理程序的作用域是根据指定他的方式来确定的。
1 | var btn = document.getElementById("button"); |
跨浏览器事件
1 | var EventUtil = { |
事件类型
1 | //确定浏览器是否支持DOM3级事件 |
- load : 页面完全加载后(包括外部资源加载完成后)触发
- unload : 文档被完全卸载后触发(从一个页面切换到另一个页面)。
- resize : 当窗口或者框架大小变化时触发
- scroll : 窗口或元素滚动时触发
- abort : 停止下载时,嵌入的内容没有加载完在object上触发
- error : 发生错误时
- select : 选择文本框中的字符时
- blur/focusout : 失焦(不冒泡/冒泡)
- focus/focusin : 聚焦
- click : 单击(左键)或按下回车
- dblclick : 双击(左键)
- mousedown : 按下任意鼠标
- mouseenter : 首次移动到元素范围内触发
- mouseleave : 移到元素范围外
- mousemove : 在元素内部移动时重复触发
- mouseout : 移到另一个元素
- mouseover : 鼠标在一个元素外部,首次移入另一个元素
- mouseup : 释放鼠标按钮触发
- mousewheel : 鼠标滚轮事件
- keydown : 按键盘任意键触发,按住不放会重复触发
- keypress : 按键盘字符键触发,按住不放会重复触发
- keyup : 释放按键触发
- textInput : 文本框输入
事件位置
- event.clientX/Y : 鼠标事件在客户端坐标信息
- pagaX/Y : 在页面中的坐标
- screenX/Y : 相对浏览器的位置
HTML5事件
- contextmenu : 自定义显示上下文菜单(如点击鼠标右键)
1 | var div = document.getElementById("mydiv"); |
beforeunload : 页面卸载前触发
1
2
3
4
5
6EventUtil.addHandler(window,"beforeunload",function(event){
event = EventUtil.getEvent(event);
var msg = "确定关闭?";
event.returnValue = msg;
return msg;
})DOMContentLoaded : 页面load时形成完整的DOM树就触发,在load前触发
readystatechange :提供文档或元素有关的加载信息
pageshow和pagehide : (往返缓存有关,有些浏览器回退页面时不触发load)在页面显示时触发,一般在load之后;pagehide是在卸载页面时触发,在unload前触发;event保存属性persisted判断页面是否是回退的(在bfcache中)
haschange : 在url参数变化时触发
1
2
3EventUtil.addHandler(window,"beforeunload",function(event){
console.log("current hash:"+location.hash)
})
设备事件
- orientationchange : (苹果safari)设备切换(横纵)方向时触发;window.orientation属性中保存当前旋转角度
- MozOrientation : (firefox)设备方向改变
- deviceorientation : 设备方向改变
- devicemotion : 包含设备的运动信息
触摸事件
- touchstart : 当手指触摸屏幕时
- touchmove : 手指在屏幕上滑动时连续触发。期间调用preventDefault()可以阻止滚动
- touchend : 手指从屏幕移开
- touchcancel : 当系统停止跟踪触摸
以上事件都是冒泡的,也都是可以取消的。包含用于跟踪触摸的属性:
- touches : 表示当前跟踪触摸的对象数组
- targetTouchs : 特定于事件目标的Touch对象的数组
- changeTouches : 表示从上次触摸以来改变了的对象的数组
顺序:touchstart - mouseover - mousemove - mousedown - mouseup - click - touchend
手势事件:只有两个手指都触摸时才会触发
- getsturestart : 当一个手指按在屏幕而另一个手指又触摸屏幕
- getsturechange : 当触摸屏幕的手指位置变化
- getstureend : 当手指移开屏幕
内存和性能
事件委托
在js中,添加到页面上的事件处理程序数量将直接关系到页面的整体运行。因此需要事件委托,事件委托利用了事件冒泡,只指定一个事件处理程序管理某一类型的事件。
1 | var list = doucment.getElementById("links"); |
PS: 当事件处理程序指定给元素时,浏览器代码和脚本就会建立连接,这种连接越多页面越慢。除了利用事件委托还可以移除无用的事件处理程序来提升性能。
1 | btn.onclick = function(){ |
模拟事件
可以在任何时候触发模拟事件,可用来测试web程序。模拟事件也可以冒泡。
1 | //模拟鼠标事件 |
表单脚本
表单
1 | //获取表单 |
- 提交表单
表单中包含button/input,type=”submit”或者type=”image”(图片按钮),点击或enter可提交表单。
form.submit()提交表单时不会触发submit事件,所以在此之前要先验证表单数据。
2. 重置表单
input/button,type=”reset”可以重置表单。form.reset()会触发reset事件。
3. 表单字段
1 | var form = document.getElementById("form1"); |
表单字段属性:
1 | var form = document.getElementById("myform"); |


