javaScript的DOM与BOM操作
JavaScript的组成
ECMAScript - JavaScript的核心
定义了JavaScript 的语法规范
JavaScript的核心,描述了语言的基本语法和数据类型,ECMAScript是一套标准,定义了一种语言的标准与具体实现无关
BOM - 浏览器对象模型
一套操作浏览器功能的API
通过BOM可以操作浏览器窗口,比如:弹出框、控制浏览器跳转、获取分辨率等
DOM - 文档对象模型
一套操作页面元素的API
DOM可以把HTML看做是文档树,通过DOM提供的API可以对树上的节点进行操作
DOM
DOM经常进行的操作
获取元素对元素进行操作(设置其属性或调用其方法)动态创建元素事件(什么时机做相应的操作)
获取页面元素
掌握
getElementById()
getElementsByTagName()
了解
getElementsByName()
getElementsByClassName()
querySelector()
querySelectorAll()
根据id获取元素
var div
= document
.getElementById('main');
console
.log(div
);
注意:由于id名具有唯一性,部分浏览器支持直接使用id名访问元素,但不是标准方式,不推荐使用。
根据标签名获取元素
var divs
= document
.getElementsByTagName('div');
根据name获取元素 *
var inputs
= document
.getElementsByName('hobby');
根据类名获取元素 *
var mains
= document
.getElementsByClassName('main');
根据选择器获取元素 *
var text
= document
.querySelector('#text');
console
.log(text
);
var boxes
= document
.querySelectorAll('.box');
for (var i
= 0; i
< boxes
.length
; i
++) {
var box
= boxes
[i
];
console
.log(box
);
}
属性操作
非表单元素的属性
innerHTML和innerText
var box
= document
.getElementById('box');
box
.innerHTML
= '我是文本<p>我会生成为标签</p>';
console
.log(box
.innerHTML
);
box
.innerText
= '我是文本<p>我不会生成为标签</p>';
console
.log(box
.innerText
);
HTML转义符
" "
' '
& &
< < // less than 小于
> > // greater than 大于
空格
© ©
表单元素属性
value 用于大部分表单元素的内容获取(option除外)type 可以获取input标签的类型(输入框或复选框等)disabled 禁用属性checked 复选框选中属性selected 下拉菜单选中属性
自定义属性操作
getAttribute() 获取标签行内属性setAttribute() 设置标签行内属性removeAttribute() 移除标签行内属性与element.属性的区别: 上述三个方法用于获取任意的行内属性。
样式操作
使用style方式设置的样式显示在标签行内
var box
= document
.getElementById('box');
box
.style
.width
= '100px';
box
.style
.height
= '100px';
box
.style
.backgroundColor
= 'red';
注意
通过样式属性设置宽高、位置的属性类型是字符串,需要加上px
类名操作
修改标签的className属性相当于直接修改标签的类名
var box
= document
.getElementById('box');
box
.className
= 'show';
创建元素的三种方式
document.write()
document
.write('新设置的内容<p>标签也可以生成</p>');
innerHTML
var box
= document
.getElementById('box');
box
.innerHTML
= '新内容<p>新标签</p>';
document.createElement()
var div
= document
.createElement('div');
document
.body
.appendChild(div
);
性能问题
innerHTML方法由于会对字符串进行解析,需要避免在循环内多次使用。可以借助字符串或数组的方式进行替换,再设置给innerHTML优化后与document.createElement性能相近
节点操作
var body
= document
.body
;
var div
= document
.createElement('div');
body
.appendChild(div
);
var firstEle
= body
.children
[0];
body
.insertBefore(div
, firstEle
);
body
.removeChild(firstEle
);
var text
= document
.createElement('p');
body
.replaceChild(text
, div
);
节点属性
模拟文档树结构
function Element(option
) {
this.id
= option
.id
|| '';
this.nodeName
= option
.nodeName
|| '';
this.nodeValue
= option
.nodeValue
|| '';
this.nodeType
= 1;
this.children
= option
.children
|| [];
}
var doc
= new Element({
nodeName
: 'html'
});
var head
= new Element({
nodeName
: 'head'
});
var body
= new Element({
nodeName
: 'body'
})
doc
.children
.push(head
);
doc
.children
.push(body
);
var div
= new Element({
nodeName
: 'div',
nodeValue
: 'haha',
});
var p
= new Element({
nodeName
: 'p',
nodeValue
: '段落'
})
body
.children
.push(div
);
body
.children
.push(p
);
function getChildren(ele
) {
for(var i
= 0; i
< ele
.children
.length
; i
++) {
var child
= ele
.children
[i
];
console
.log(child
.nodeName
);
getChildren(child
);
}
}
getChildren(doc
);
节点层级
注意
childNodes和children的区别,childNodes获取的是子节点,children获取的是子元素
nextSibling和previousSibling获取的是节点,获取元素对应的属性是nextElementSibling和previousElementSibling获取的是元素
nextElementSibling和previousElementSibling有兼容性问题,IE9以后才支持
总结
节点操作,方法
appendChild()
insertBefore()
removeChild()
replaceChild()
节点层次,属性
parentNode
childNodes
children
nextSibling/previousSibling
firstChild/lastChild
事件详解
注册/移除事件的三种方式
var box
= document
.getElementById('box');
box
.onclick = function () {
console
.log('点击后执行');
};
box
.onclick
= null;
box
.addEventListener('click', eventCode
, false);
box
.removeEventListener('click', eventCode
, false);
box
.attachEvent('onclick', eventCode
);
box
.detachEvent('onclick', eventCode
);
function eventCode() {
console
.log('点击后执行');
}
解决注册删除事件的兼容代码
function addEventListener(element
, type
, fn
) {
if (element
.addEventListener
) {
element
.addEventListener(type
, fn
, false);
} else if (element
.attachEvent
){
element
.attachEvent('on' + type
,fn
);
} else {
element
['on'+type
] = fn
;
}
}
function removeEventListener(element
, type
, fn
) {
if (element
.removeEventListener
) {
element
.removeEventListener(type
, fn
, false);
} else if (element
.detachEvent
) {
element
.detachEvent('on' + type
, fn
);
} else {
element
['on'+type
] = null;
}
}
事件对象的属性和方法
event.type 获取事件类型clientX/clientY 所有浏览器都支持,窗口位置pageX/pageY IE8以前不支持,页面位置event.target || event.srcElement 用于获取触发事件的元素event.preventDefault() 取消默认行为
阻止事件传播的方式
标准方式 event.stopPropagation();IE低版本 event.cancelBubble = true; 标准中已废弃
常用的鼠标和键盘事件
onmouseup 鼠标按键放开时触发onmousedown 鼠标按键按下触发onmousemove 鼠标移动触发onkeyup 键盘按键按下触发onkeydown 键盘按键抬起触发
BOM
对话框
alert()prompt()confirm()
页面加载事件
onload
window
.onload = function () {
}
onunload
window
.onunload = function () {
}
定时器
setTimeout()和clearTimeout()
在指定的毫秒数到达之后执行指定的函数,只执行一次
var timerId
= setTimeout(function () {
console
.log('Hello World');
}, 1000);
clearTimeout(timerId
);
setInterval()和clearInterval()
定时调用的函数,可以按照给定的时间(单位毫秒)周期调用函数
var timerId
= setInterval(function () {
var date
= new Date();
console
.log(date
.toLocaleTimeString());
}, 1000);
clearInterval(timerId
);
location对象
location对象是window对象下的一个属性,时候的时候可以省略window对象
location可以获取或者设置浏览器地址栏的URL
URL
统一资源定位符 (Uniform Resource Locator, URL)
URL的组成
scheme://host:port/path?query#fragment
scheme:通信协议
常用的http,ftp,maito等
host:主机
服务器(计算机)域名系统 (DNS) 主机名或 IP 地址。
port:端口号
整数,可选,省略时使用方案的默认端口,如http的默认端口为80。
path:路径
由零或多个'/'符号隔开的字符串,一般用来表示主机上的一个目录或文件地址。
query:查询
可选,用于给动态网页传递参数,可有多个参数,用'&'符号隔开,每个参数的名和值用'='符号隔开。例如:name=zs
fragment:信息片断
字符串,锚点.
history对象
back()forward()go()
navigator对象
userAgent
通过userAgent可以判断用户浏览器的类型
platform
通过platform可以判断浏览器所在的系统平台类型.
特效
偏移量
offsetParent用于获取定位的父级元素offsetParent和parentNode的区别
var box
= document
.getElementById('box');
console
.log(box
.offsetParent
);
console
.log(box
.offsetLeft
);
console
.log(box
.offsetTop
);
console
.log(box
.offsetWidth
);
console
.log(box
.offsetHeight
);
客户区大小
var box
= document
.getElementById('box');
console
.log(box
.clientLeft
);
console
.log(box
.clientTop
);
console
.log(box
.clientWidth
);
console
.log(box
.clientHeight
);
滚动偏移
var box
= document
.getElementById('box');
console
.log(box
.scrollLeft
)
console
.log(box
.scrollTop
)
console
.log(box
.scrollWidth
)
console
.log(box
.scrollHeight
)