DOM文档对象模型
DOM(Document Object Model): 文档对象模型
其实就是操作 html 中的标签的一些能力 我们可以操作哪些内容
- 获取一个元素
- 移除一个元素
- 创建一个元素
- 向页面里面添加一个元素
- 给元素绑定一些事件
- 获取元素的属性
- 给元素添加一些 css 样式
- ...
DOM 的核心对象就是 docuemnt 对象
document 对象是浏览器内置的一个对象,里面存储着专门用来操作元素的各种方法
DOM: 页面中的标签,我们通过 js 获取到以后,就把这个对象叫做 DOM 对象
document对象
document对象属性
- title 文档标题,即title标签内容
document对象方法
- document.write() 输入文本到当前打开的文档
一、document对象
document对象是window对象中的子对象。
document对象除了write()方法外,跟其他对象一样,也有自身一套属性和方法。
document对象,即文档对象。顾名思义,其实很好理解,文档对象嘛,操作的都是HTML文档。为了更好理解什么叫“HTML文档”,
- 1、document对象属性
document对象属性
属性 说明
title 文档标题,即title标签内容
URL 文档地址
fileCreateDate 文档创建日期
fileModifiedDate 文档修改时间(精确到天)
lastModified 文档修改时间(精确到秒)
fileSize 文档大小
fgColor 定义文档的前景色
bgColor 定义文档的背景色
linkColor 定义“未访问”的超链接颜色
alinkColor 定义“被激活”的超链接颜色
vlinkColor 定义“访问过”的超链接颜色
- 2、document对象方法
document对象方法
方法 说明
document.write() 输入文本到当前打开的文档
document.writeIn() 输入文本到当前打开的文档,并添加换行符“\n”
document.getElementById() 获取某个id值的元素
document.getElementsByName() 获取某个name值的元素,用于表单元素
上面列出了document对象常用的属性和方法,跟window对象的学习一样
实例:
在浏览网页的时候,我们经常看到不少网页标题在闪动。这一节我们给大家讲解一个实际开发中的技巧“网页动态标题”。
实现代码如下:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script type="text/javascript">
//定义全局变量,用于标识
var flag = 0;
window.onload = function () {
//定时器
setInterval("titleChange()", 1000);
}
//定义函数
function titleChange() {
if(flag==0)
{
document.title = "★☆★Javascript学习网★☆★";
flag = 1;
}
else
{
document.title = "☆★☆Javasctipte学习网☆★☆";
flag = 0;
}
}
</script>
</head>
<body>
</body>
</html>
获取html元素
getElementById('id属性值')
getElementById是通过标签的 id 名称来获取标签的- 因为在一个页面中 id 是唯一的,所以获取到的就是一个元素
<div id="box"></div>
<script>
var box = document.getElementById('box')
console.log(box) // <div id="box"></div>
</script>
- 获取到的就是页面中那个 id 为 box 的 div 标签
getElementsByClassName('class属性')
-
getElementsByClassName是通过标签的 class 名称来获取标签的 -
因为页面中可能有多个元素的 class 名称一样,所以获取的是一组元素
-
哪怕你获取的 class 只有一个,那也是获取一组元素,是不过这一组只有一个 DOM 元素而已
<div class="box"></div>
<script>
var box = document.getElementsByClassName('box')
console.log(box) // <div></div>
console.log(box[0]) // <div></div>
</script>
-
获取到的是一组元素,是一个长度和数组一样的数据结构,但不是数组,是伪数组
-
这个一组数据也是按照索引排列的,所以我们想要准确的拿到这个 div ,需要用索引来获取
类数组(伪数组)
- 1.类数组不能使用Array的常用方法 如:push,pop等
- 2.类数组可以遍历,可以使用[]访问元素
getElementsByTagName('标签名')
-
getElementsByTagName是用过标签的 标签 名称来获取标签的 -
因为页面中可能有多个元素的 标签 名称一样,所以获取到的是一组元素
-
哪怕真的只有一个这个标签名,那么也是获取一组元素,只不过这一组中只有一个 DOM 元素而已
<div></div>
<script>
var box = document.getElementsByTagName('div')
console.log(box) // [<div></div>]
console.log(box[0]) // <div></div>
</script>
- 和
getElementsByTagName一样,获取到的是一个长得很像数组的元素 - 必须要用索引才能够得到准确的 DOM 元素
getElementsByName('name属性')
querySelector 和 querySelectorAll
querySelector是按照选择器的方式来获取元素- 也就是说,按照我们写 css 是时候的选择器来获取
- 这个方法只能获取到一个元素,并且是页面中第一个满足条件的元素
console.log(document.querySelector('div')) // 获取页面中的第一个 div 元素
console.log(document.querySelector('.box')) // 获取页面中第一个有 box 类名的元素
console.log(document.querySelector('#box')) // 获取页面中第一个 id 名为box 的元素
querySelectorAll是按照选择器的方式来获取元素- 这个方法能获取到所有满足条件的元素,以一个伪数组的形式返回
console.log(document.querySelectorAll('div')) // 获取页面中的所有的 div 元素
console.log(document.querySelectorAll('.box')) // 获取页面中的所有有 box 类名的元素
- 获取到的是一组数据,也是需要用索引来获取到准确的每一个 DOM 元素
querySelector 和 querySelectorAll 的使用非常的简单,就像标题说到的一样,它和 CSS 的写法完全一样,对于前端开发人员来说,这是难度几乎为零的一次学习。假如我们有一个 id 为 test 的 DIV,为了获取到这个元素,你也许会像下面这样:
<style>
#test{
color:red;
}
</style>
<div id='test' class='test'></div>
<div id='test1' class='test'></div>
document.getElementById("test");
现在我们来试试使用新方法来获取这个 DIV:
document.querySelector("#test");
document.querySelectorAll(".test")[0];
获取文档中 class=”example” 的第一个 <p> 元素:
document.querySelector("p.example");
获取文档中有 “target” 属性的第一个 <a> 元素:
document.querySelector("a[target]");
操作事件
给元素绑定点击事件,直接给元素添加onclick属性实现
绑定事件
- 1.属性事件
- 2.元素和事件行为分离
操作元素内容
innerHTML
- 获取元素内部的 HTML 结构
<body>
<div>
<p>
<span>hello</span>
</p>
</div>
<script>
var div = document.querySelector('div')
console.log(div.innerHTML)
/*
<p>
<span>hello</span>
</p>
*/
</script>
</body>
- 设置元素的内容
<body>
<div></div>
<script>
var div = document.querySelector('div')
div.innerHTML = '<p>hello</p>'
</script>
</body>
- 设置完以后,页面中的 div 元素里面就会嵌套一个 p 元素
innerText
- 获取元素内部的文本(只能获取到文本内容,获取不到 html 标签)
<body>
<div>
<p>
<span>hello</span>
</p>
</div>
<script>
var div = document.querySelector('div')
console.log(div.innerText) // hello
</script>
</body>
- 可以设置元素内部的文本
<body>
<div></div>
<script>
var div = document.querySelector('div')
div.innerText = '<p>hello</p>'
</script>
</body>
- 设置完毕后,会把
<p>hello</p>当做一个文本出现在 div 元素里面,而不是把 p 解析成标签
value
操作非表单元素:innerHTML , innerText
操作表单元素:value
onclick事件绑定引入
改变元素内容
p.innerHtml="<h1>Html内容</h1>";
p.innerText="纯文本内容";
p.value = "表单内容";
在JavaScript中,我们可以使用innerHTML和innerText这2个属性很方便地获取和设置某一个元素内部子元素或文本。
innerHTML属性被多数浏览器所支持,而innerText只能被IE、chrome等支持而不被Firefox支持。
innerHTML属性声明了元素含有的HTML文本,不包括元素本身的开始标记和结束标记。设置该属性可以用于为指定的HTML文本替换元素的内容。
innerText属性与inerHTML属性的功能类似,只是该属性只能声明元素包含的文本内容。即使指定的是HTML文本,它也会认为是普通文本而原样输出。
DOM对象的innerHTML属性改变元素内容:
window.onload = function(){
var p1 = document.getElementById("p1"); //通过id获取html元素
p1.style.color="green"; //字体颜色
p1.style.fontSize="40px";
p1.innerHTML="新的html文档段落内容"; //改变p1内容
}
操作元素CSS样式
style 行内样式
- 专门用来给元素添加 css 样式的
- 添加的都是行内样式
<body>
<div></div>
<script>
var div = document.querySelector('div')
div.style.width = '100px'
div.style.height = '100px'
div.style.background = 'pink'
console.log(div)
// <div style="width: 100px;height: 100px;background: pink;"></div>
</script>
</body>
- 页面中的 div 就会变成一个宽高都是100,背景颜色是粉色
className class类样式
- 专门用来操作元素的 类名 的
<body>
<div class="box"></div>
<script>
var div = document.querySelector('div')
console.log(div.className) // box
</script>
</body>
- 也可以设置元素的类名,不过是全覆盖式的操作
<body>
<div class="box"></div>
<script>
var div = document.querySelector('div')
div.className = 'test'
console.log(div) // <div class="test"></div>
</script>
</body>
- 在设置的时候,不管之前有没有类名,都会全部被设置的覆盖
JS代码操作样式名 样式名用驼峰命名
如:font-size => fontSize
classList 动态添加移除class类样式
添加样式
div.classList.add('active');
移除指定样式
div.classList.remove('active');
在JavaScript中,对于元素的CSS操作,我们使用的是DOM对象中的style对象来操作。
语法:
obj.style.属性名;
说明:
obj指的是DOM对象,也就是通过document.getElementById()等获取而来的DOM元素节点对象。
属性名为CSS属性名。有一点大家要非常清楚,就是这里的属性名使用的“骆驼峰”型的CSS属性名。何为“骆驼峰”型呢?举个例子,“font-size”应该写成“fontSize”,“border-bottom-width”应该写成“borderBottomWidth”,以此类推。
举例:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script type="text/javascript">
function change() {
var e = document.getElementById("lvye");
e.style.color = "red";
e.style.border = "1px solid gray";
}
</script>
</head>
<body>
<h1 id="lvye">学习网</h1>
<input type="button" value="改变样式" onclick="change()"/>
</body>
</html>
操作属性
getAttribute('属性名')
- 获取元素的某个属性(包括自定义属性)
<body>
<div class="box" a="100"></div>
<script>
var div = document.querySelector('div')
console.log(div.getAttribute('a')) // 100
console.log(div.getAttribute('class')) // box
</script>
</body>
ele.getAttribute('属性名')
=>属性值
ele.属性 必须是本身拥有的属性
=>属性值
setAttribute('属性名',"属性值")
- 给元素设置一个属性(包括自定义属性)
<body>
<div></div>
<script>
var div = document.querySelector('div')
div.setAttribute('a', 100)
div.setAttribute('class', 'box')
console.log(div) // <div class="box" a="100"></div>
</script>
</body>
removeAttribute('属性名')
- 直接移除元素的某个属性
<body>
<div class="box" a="100"></div>
<script>
var div = document.querySelector('div')
div.removeAttribute('class')
console.log(div) //<div a="100"></div>
</script>
</body>
自定义属性
- data-属性名
- ele'dataset.属性名