查找:
1. 按选择器查找: 今后如果元素藏的很深,非常分散时,查找条件变得很复杂,都可用按选择器查找.
(1). 只查找一个符合要求的元素
a. var 一个元素对象=任意父元素.querySelector("选择器")
按选择器
查询
(2). 查找多个符合要求的元素
b. var 类数组对象=任意父元素.querySelectorAll("选择器")
修改: 3种东西
1. 内容: 3种:
(1). 获取或修改元素开始标签到结束标签之间的原始的HTML内容
a. 元素对象.innerHTML
内部 HTML内容
b. 获取元素内容时: innerHTML原样返回HTML代码中的html内容个,不做任何加工
c. 修改元素内容时: innerHTML会先将字符串内容交给浏览器解析,然后将解析后的可以给人看的内容显示在页面上
(2). 获取或修改元素开始标签到结束标签之间的纯文本内容
a. 元素对象.textContent
文本 内容
b. 获取元素内容时: textContent去掉内嵌的标签,并将特殊符号转为正文,然后在返回修改后的内容。
c. 修改元素内容: 不会将字符串内容交给浏览器解析,而是直接保持字符串的原样内容输出
d. 示例: 分别使用innerHTML和textContent获取和修改元素的内容
0_html_text_value.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h3 id="msg">来自<a href="#"><<新华社>></a>的消息</h3>
<h3 id="msg2"></h3>
<h3 id="msg3"></h3>
<script>
var h3Msg=document.getElementById("msg");
var h3Msg2=document.getElementById("msg2");
var h3Msg3=document.getElementById("msg3");
//想获取msg的内容
console.log(h3Msg.innerHTML)
console.log(h3Msg.textContent)
//想修改msg2和msg3的内容
var str=`来自<a href="#"><<新华社>></a>的消息`;
h3Msg2.innerHTML=str;
h3Msg3.textContent=str;
</script>
</body>
</html>
运行结果:
(3). 获取或修改表单元素的内容:
a. 问题: 绝大多数表单元素都是input元素,而input元素是单标记,没有结束标签,所以不能使用innerHTML和textContent来获取或修改内容
b. 解决: 今后只要获取或修改表单元素的值,都要用value代替innerHTML和textContent.
(4). 示例: 开关门效果:
0_door.html
<!DOCTYPE HTML>
<html>
<head>
<title>读取并修改元素的内容</title>
<meta charset="utf-8" />
<style>
div {
float: left;
width: 110px;
height: 200px;
}
#d1{
background-color:#ccff00;
background-image:url(images/xsj.png);
background-size:160% 80%;
background-position:-30px 30px;
}
#d3 {
background-image:url(images/men.png);
background-size:110% 110%;
background-position:-10px -10px;
position:relative;
}
#d2 {
cursor: pointer;
background-color:#fff;
position:absolute;
width:40px; height:18px;
text-align:center;
top:65px;
font-weight:bold;
color:green;
left:50%; margin-left:-20px;
}
</style>
</head>
<body>
<div id="d1"></div>
<div id="d3">
<div id="d2">无人</div>
</div>
<script>
//DOM 4步
//1. 查找触发事件的元素
//本例中: 点d2可以开关门
var d2=document.getElementById("d2");
//2. 绑定事件处理函数
d2.onclick=function(){
//3. 查找要修改的元素
//本例中: 开关门是通过显示或隐藏d1(洗手间)来实现的
var d1=document.getElementById("d1");
//4. 修改元素
//如果当前d2的内容是"无人"
if(this.innerHTML=="无人"){
//就关门
d1.style.display="none"
//相当于手工:
//<div id="d1" style="display:none">
d2.innerHTML="有人";
d2.style.color="red";
}else{//否则如果当前d2的内容是"有人"
//就开门
d1.style.display=""
d2.innerHTML="无人";
d2.style.color="green";
}
}
</script>
</body>
</html>
运行结果:
2. 属性: 3种属性:
(1). 字符串类型的HTML标准属性:
a. 什么是: HTML标准中规定的,属性值为字符串的属性
b. 比如: class, id, name, value, href, title, ...
c. 如何: 2种方式:
1). 旧核心DOM4个函数:
i. 获取属性值: 元素对象.getAttribute("属性名")
获取 属性
ii. 修改属性值:
元素对象.setAttribute("属性名", "新值")
修改 属性
iii. 判断是否包含某个属性:
元素对象.hasAttribute("属性名")
有 属性(吗?)
iv. 移除属性: 元素.removeAttribute("属性名")
移除 属性
2). 新的简化版HTML DOM:
i. 新的HTML DOM已经将所有HTML标准属性,提前保存在了内存中的元素对象身上。只不过页面上暂时没用到的属性,默认值为""而已.
ii. 今后,只要操作HTML标准属性,就都可用".属性名"方式操作
iii. 如何用.代替以上四种操作:
①获取属性值: 元素对象.属性名
②修改属性值: 元素对象.属性名=属性值
③判断是否包含某个属性:
因为所有标准属性已经在元素对象身上了,只不过默认值为"",所以:
元素.属性名!=="" 说明包含该属性
④移除属性:
错误: delete 元素对象.属性名
正确: 元素对象.属性名=""
iv. 特例: class属性
问题: ES6基础语法中已经将class定义为关键字,有特殊功能,专门用于创建一种类型。所以,DOM标准就不能重复使用"class"这个属性名。
解决: 今后,在DOM中只要用.获取或修改元素的class属性值,都必须换成".className"。
但是,操作.className,就是在操作页面上元素的class属性。
d. 示例: 使用核心DOM和HTML DOM两种方式操作a元素的属性:
1_attribute.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<a id="a1" href="http://tmooc.cn" title="前往tmooc">go to tmooc</a>
<script>
var a1=document.getElementById("a1");
//获取a1的href属性
// console.log(a1.getAttribute("href"));
console.log(a1.href);
//修改a1的title属性
// a1.setAttribute("title","Welcome to tmooc");
a1.title="Welcome to tmooc";
//判断是否包含target属性
// console.log(a1.hasAttribute("target"));//false
console.log(a1.target!=="");//false 说明不包含
//为a1添加target属性
// a1.setAttribute("target","_blank")
a1.target="_blank";
//判断是否包含target属性
// console.log(a1.hasAttribute("target"));//true
console.log(a1.target!=="");//true 说明包含
console.log(a1);
console.dir(a1);
</script>
</body>
</html>
运行结果:
e. 示例: 手风琴/伸缩菜单效果
1_menu.html
<!DOCTYPE HTML>
<html>
<head>
<title>1. 实现伸缩二级菜单</title>
<meta charset="utf-8" />
<style>
li {
list-style: none;
}
li span {
padding-left: 20px;
cursor: pointer;
background: url("images/add.png") no-repeat center left;
}
li ul {
display: none;
}
.open {
background: url("images/minus.png") no-repeat center left;
}
.open+ul {
display: block;
}
</style>
</head>
<body>
<ul class="tree">
<li>
<span class="open">考勤管理</span>
<ul>
<li>日常考勤</li>
<li>请假申请</li>
<li>加班/出差</li>
</ul>
</li>
<li>
<span>信息中心</span>
<ul>
<li>通知公告</li>
<li>公司新闻</li>
<li>规章制度</li>
</ul>
</li>
<li>
<span>协同办公</span>
<ul>
<li>公文流转</li>
<li>文件中心</li>
<li>内部邮件</li>
<li>即时通信</li>
<li>短信提醒</li>
</ul>
</li>
</ul>
<script>
//DOM 4步
//1. 查找触发事件的元素
//本例中: 点击ul下li下所有span都能触发变化
var spans=document.querySelectorAll(
"ul>li>span"
);
//2. 绑定事件处理函数
//本例中: 因为要给每个span绑定单击事件,所以要遍历找到的每个span
for(var span of spans){
span.onclick=function(){
//3. 查找要修改的元素
//4. 修改元素
//如果当前点击的span的class是open,说明当前span是打开的,则只关闭自己即可!不用再遍历别人了
if(this.className=="open"){
this.className="";
return;//停止执行当前函数,并退出当前函数。
}
//先找到ul下所有span
var spans=
document.querySelectorAll(
"ul>li>span"
);
//遍历清除每个span上的class open,让所有的菜单暂时都隐藏
for(var span of spans){
span.className="";
}
//然后,再只给当前点击的一个span添加class open,只让当前一个菜单显示
this.className="open";
}
}
</script>
</body>
</html>
运行结果:
(2). bool类型的HTML标准属性:
a. 什么是: HTML标准中规定的,不需要写属性值,只靠属性名就可发挥作用的属性。
b. 比如:
1). checked: 用于标记一个checkbox是否被选中
2). disabled: 用于标记一个表单元素是否被禁用
... ...
c. 如何: 2种:
1). 即可用核心DOM 4个函数
i. 添加bool类型的HTML标准属性:
标准写法: 元素.setAttribute(“属性名”,”属性名”)
比如:
input.setAttribute(“disabled”,”disabled”);//禁用文本框
结果: <input disabled=“disabled”>
简写:
只要添加了disabled属性,就起作用,不给值也行
元素.setAttribute(“属性名”,””)
比如: input.setAttribute(“disabled”,””);//禁用文本框
结果: <input disabled=“”>
ii.移除bool类型HTML标准属性
元素.removeAttribute(“属性名”)
比如:
input.removeAttribute(“disabled”) //启用文本框
结果: <input disabled />
iii. 判断元素当前处于何种状态
元素.hasAttribute(“属性名”)
结果: 有哪个属性,就说明处于哪种状态
没有哪个属性,说明没有处于哪种状态
比如: input.hasAttribute(“disabled”)//判断文本框是启用,还是禁用
2). 又可用新HTML DOM来操作
元素.属性名
且属性值必须是bool类型的true或false。
比如:
判断元素现在处于何种状态: 元素.属性名
修改状态: 元素.属性名=bool值
总结:
(4). 如果通过复杂的查找条件,才能找到想要的元素时,就用按选择器查找: 2个方法
a. 只查找一个符合条件的元素:
var 一个元素=任意父元素.querySelector("任意选择器")
b. 查找多个符合条件的元素:
var 类数组对象=任意父元素.querySelectorAll("任意选择器")
2. 修改元素: 3种东西可修改
(1). 修改内容: 3种内容可修改:
a. 获取或修改元素的HTML内容:
元素.innerHTML
b. 获取或修改元素的纯文本内容:
元素.textContent
c. 获取或修改表单元素的值:
表单元素.value
(2). 修改属性: 3种
a. 字符串类型的HTML标准属性: 2种:
1). 旧核心DOM: 4个函数
i. 元素.getAttribute("属性名");
ii. 元素.setAttribute("属性名", "属性值")
iii. var bool=元素.hasAttribute("属性名")
iv. 元素.removeAttribute("属性名")
优点: 万能, 缺点: 繁琐
2). 新HTML DOM:
i. 元素.属性名
ii. 元素.属性名="属性值"
iii. 元素.属性名!==""
iv. 元素.属性名=""
优点: 简单, 缺点: 不万能
b. bool类型的HTML标准属性:2种
1). 旧核心DOM4个函数修改:
//启用某种状态
元素.setAttribute("属性名","属性名"或"")
//禁用某种状态
元素.removeAttribute("属性名")
//判断是否处于某种状态
元素.hasAttribute("属性名")
2). HTML DOM的"元素.属性名",值为bool类型
//启用某种状态
元素.属性名=true
//禁用某种状态
元素.属性名=false
//判断是否处于某种状态
元素.属性名