DOM
Document Object Model 文档对象模型
JS中通过DOM来对HTML文档进行操作。
只要理解了DOM就可以随心所欲的操作WEB页面
文档
文档表示的就是整个HTML网页文档
对象
对象表示将网页中的每一个部分都转换为了一个对象。
模型
使用模型来表示对象之间的关系,这样方便我们获取对象。
节点
节点:Node,构成网页的最基本的组成部分,网页中的每一个部分都可以称为一个节点
常用节点分为四类
文档节点:整个HTML文档
元素节点:HTML文档中的HTML标签
属性节点:元素的属性
文本节点:HTML标签中的文本内容
比如:html标签,属性,文本,注释,整个文档等都是一个节点
虽然都是节点,但是实际上他们的具体类型是不同的
比如:标签我们称为元素节点,属性称为属性节点,文本称为文本节点,文档称为文档节点。
节点的类型不同,属性和方法也都不尽相同。
事件的简介
事件,就是文档或浏览器窗口发生的一些特定的交互瞬间
JavaScript与HTML之间的交互是通过事件实现的
对于Web应用来说,有下面这些代表性的事件:点击某个元素,将鼠标移动至某个元素上方,按下键盘上某个键等等
//处理事件
//我们可以在事件的对应属性中设置一些js代码
//这样当事件被触发时,这些代码将会执行
//这种写法我们称为结构和行为耦合,不方便维护,**不推荐使用**
可以为按钮的对应事件绑定处理函数的形式来响应事件
这样当事件被触发时,其对应的函数将会被调用
获取对象
var btn = document.getElementById("btn");
绑定一个单机事件
像这种为单机事件绑定的函数,我们称为单机响应函数
btn.onclick = function(){
alert("你还点");
};
文档的加载
浏览器在加载一个页面时,是按照自上向下的顺序加载的
读取到一行就运行一行,如果将script标签现到页面的上边,
在代码执行时,页面还没有加载DOM对象也没有加载,会导致无法获取到DOM对象
将js 代码编写到页面下部就是为了可以在页面加载完毕后在执行js代码
onload事件会在整个页面加载完成之后才触发
为window绑定一个onload事件
该事件对应的响应函数将会在页面加载完成之后执行
这样可以确保我们的代码执行时所有的DOM对象已经加载完毕了
先加载后执行
//body
window.onload = function(){ //script
var btn = document.getElementById("btn");
btn.onclick = function(){
alert("你还点");
};
};
DOM查询
获取元素节点
通过document对象调用
1.getElementById()
通过id属性获取一个元素节点对象
2.getElementsByTagName()
通过标签名获取一组元素节点对象
3.getElementByName()
通过name属性获取一组元素节点对象
获取元素节点的子节点
通过具体的元素节点调用
1.getElementsByTagName()
方法,返回当前节点的指定标签名后代节点
2.childNodes
属性,表示当前节点的所有子节点
3.firstChild
属性,表示当前节点的第一个子节点
4.lastChild
属性,表示当前节点的最后一个子节点
获取body
在document中有一个属性body,它保存的是body的引用
var body = document.body;
html根标签
document.documentElement保存的是html根标签
var html = document.doucumentElement;
根据元素的class属性值查询一组元素节点对象
gentElementsByClassName()可以根据class属性值获取一组元素节点对象,
但是该方法不支持IE8及以下的浏览器
var box1 = document.gentElementsByClassName("box1");
document.querySelector()
需要一个选择器的字符串作为参数,可以根据一个css选择器来查询一个元素节点对象
虽然ie8中没有gentElementsByClassName,但是可以使用document.querySelector()代替
使用该方法总会返回唯一的一个元素,如果满足条件的元素有多个,那么它只会返回第一个
document.querySelectorAll()
该方法与document.querySelector()用法类似,不同的是它会将查询的元素封装到一个数组
即使符合条件的元素只有一个,他也会返回数组
DOM查询
通过具体的元素节点来查询
元素.getElementsByTagName()
通过标签名查询当前元素的指定后代元素
元素.childNodes
获取当前元素的所有子节点
会获取到空白的文本子节点
元素.children
获取当前元素的所有子元素
元素.firstChild
获取当前元素的第一个子节点
元素.lastChild
获取当前元素的最后一个子节点
元素.parentNode
获取当前元素的父元素
元素.previousSibling
获取当前元素的前一个兄弟节点
元素.nextSibling
获取当前元素的后一个兄弟节点
innerHTML和innerText
这两个属性并没有在DOM标准定义,但是大部分浏览器都支持这两个属性
两个属性作用类似,都可以获取到标签内部的内容,
不同是innerHTML会获取到html标签,而innerText会自动去除标签
如果使用这两个属性来设置标签内部的内容时,没有任何区别的
读取标签内部的文本内容
h1中的文本内容
元素.firstChild.nodeValue
document对象的其他的属性和方法
document.all
获取页面中的所有元素,相当于document.getElementsByTagName("*");
document.documentElement
获取页面中html根元素
document.body
获取页面中的body元素
document.getElementsByClassName()
根据元素的class属性值查询一组元素节点对象
这个方法不支持IE8及以下的浏览器
document.querySelector()
根据CSS选择器去页面中查询一个元素
如果匹配到的元素有多个,则它会返回查询到的第一个元素
document.querySelectorAll()
根据CSS选择器去页面中查询一组元素
会将匹配到所有元素封装到一个数组中返回,即使只匹配到一个
DOM修改
document.createElement()
可以根据标签名创建一个元素节点对象
document.createTextNode()
可以根据文本内容创建一个文本节点对象
父节点.appendChild(子节点)
向父节点中添加指定的子节点
父节点.insertBefore(新节点,旧节点)
将一个新的节点插入到旧节点的前边
父节点.replaceChild(新节点,旧节点)
使用一个新的节点去替换旧节点
父节点.removeChild(子节点)
删除指定的子节点
推荐方式:子节点.parentNode.removeChild(子节点)
DOM对CSS的操作
读取和修改内联样式
- 使用style属性来操作元素的内联样式
读取内联样式:
语法:
元素.style.样式名
例子:
元素.style.width
元素.style.height
注意:如果样式名中带有-,则需要将样式名修改为驼峰命名法
将-去掉,然后-后的字母改大写
比如:background-color --> backgroundColor
border-width ---> borderWidth
修改内联样式:
语法:
元素.style.样式名 = 样式值
通过style修改的样式都是内联样式,由于内联样式的优先级比较高,
所以我们通过JS来修改的样式,往往会立即生效,
但是如果样式中设置了!important,则内联样式将不会生效。
读取元素的当前样式
正常浏览器
使用getComputedStyle()
这个方法是window对象的方法,可以返回一个对象,这个对象中保存着当前元素生效样式
- 参数:
1.要获取样式的元素
2.可以传递一个伪元素,一般传null
例子:
获取元素的宽度
getComputedStyle(box , null)["width"];
通过该方法读取到样式都是只读的不能修改
- IE8
- 使用currentStyle
- 语法:
元素.currentStyle.样式名
- 例子:
box.currentStyle["width"]
- 通过这个属性读取到的样式是只读的不能修改
其他的样式相关的属性
注意:以下样式都是只读的
clientHeight
元素的可见高度,指元素的内容区和内边距的高度
clientWidth
元素的可见宽度,指元素的内容区和内边距的宽度
offsetHeight
整个元素的高度,包括内容区、内边距、边框
offfsetWidth
整个元素的宽度,包括内容区、内边距、边框
offsetParent
当前元素的定位父元素
离他最近的开启了定位的祖先元素,如果所有的元素都没有开启定位,则返回body
offsetLeft
offsetTop
当前元素和定位父元素之间的偏移量
offsetLeft水平偏移量 offsetTop垂直偏移量
scrollHeight
scrollWidth
获取元素滚动区域的高度和宽度
scrollTop
scrollLeft
获取元素垂直和水平滚动条滚动的距离
判断滚动条是否滚动到底
垂直滚动条
scrollHeight - scrollTop = clientHeight
水平滚动
scrollWidth - scrollLeft = clientWidth
事件(Event)
事件对象
当响应函数被调用时,浏览器每次都会将一个事件对象作为实参传递进响应函数中,
这个事件对象中封装了当前事件的相关信息,比如:鼠标的坐标,键盘的按键,鼠标的按键,滚轮的方向。。
可以在响应函数中定义一个形参,来使用事件对象,但是在IE8以下浏览器中事件对象没有做完实参传递,而是作为window对象的属性保存
- 例子:
元素.事件 = function(event){
event = event || window.event;
};
元素.事件 = function(e){
e = e || event;
};
事件的冒泡(Bubble)
事件的冒泡指的是事件向上传导,当后代元素上的事件被触发时,将会导致其祖先元素上的同类事件也会触发。
事件的冒泡大部分情况下都是有益的,如果需要取消冒泡,则需要使用事件对象来取消
可以将事件对象的cancelBubble设置为true,即可取消冒泡
- 例子:
元素.事件 = function(event){
event = event || window.event;
event.cancelBubble = true;
};