1 DOM简介

1.1 定义

DOM就是文档对象模型,是W3C组织推荐的处理可扩展标记语言(HTML或者XML)的标准编程接口。W3C已经定义了一系列的DOM接口,通过这些DOM接口可以改变网页的内容样式和结构。

1.2 DOM树

  • 文档(document):一个页面就是一个文档
  • 元素(element): 页面中所有的标签都是元素
  • 节点(node):网页中所有的内容都是节点(标签节点、属性节点、文本节点、注释节点等)
  • DOM把以上内容看作是对象

2. 获取元素

2.1 获取元素的方法:

  • 根据ID获取:

    getElementById()
  • 根据标签名获取:

    getElementsByTagName()
  • 通过HTML5新增的方法获取:

    getElementsByClassName() // querySelector() // querySelectorAll()
  • 特殊元素获取:

    document.body // document.documentElement

    (ps:访问https://developer.mozilla.org/zh-CN/,输入对应的方法名进行查找,可以获得该方法的使用方法)

2.2 根据ID获取---->getElementById()

  • 语法:
var element = document.getElementById("id");
  • 说明:Document的方法 getElementById()返回一个匹配特定 ID的元素. 由于元素的 ID 在大部分情况下要求是独一无二的,这个方法自然而然地成为了一个高效查找特定元素的方法。

  • 参数:id是大小写敏感的字符串,代表了所要查找的元素的唯一ID.

  • 返回值:返回一个匹配到 ID 的 DOM Element 对象。若在当前 Document 下没有找到,则返回 null。

  • 举例:

<body>
<div id="time">2019-9-9</div>
<script>
//1. 因为文档是从上往下加载,所以先得有标签 所以script写道下面来了
//后面有解决方案可以将script提上去,这个后面再说
//2. get获取 element 元素 by 通过
//3. 参数id是大小写敏感的字符串
//4. 返回值的一个element(元素)对象
var timer = document.getElementById("time");
console.log(timer); //<div id="time">2019-9-9</div>
console.log(typeof timer); //object
//5. console.dir(对象) 打印返回的元素对象 更好地查看里面的属性和方法
console.dir(timer); //div#time里面含有很多方法
</script>
</body>

2.3 根据标签名获取某些元素---->getElementsByTagName()

  • 语法:
var element = document.getElementsByTagName("tagName");
  • 使用getElementsByTagName()方法可以返回带有指定标签的对象的集合。
  • 因为得到的是一个对象的集合,所以我们想要操作里面的元素就需要遍历
<body>
<ul>
<li>知否知否,应是等你好久1</li>
<li>知否知否,应是等你好久2</li>
<li>知否知否,应是等你好久3</li>
<li>知否知否,应是等你好久4</li>
<li>知否知否,应是等你好久5</li>
</ul>
<ul id="nav">
<li>生僻字1</li>
<li>生僻字2</li>
<li>生僻字3</li>
<li>生僻字4</li>
<li>生僻字5</li>
</ul>
<script>
//得到所有的li
//1.返回的是 获取过来元素对象的集合 以伪数组的形式存储的
var lis = document.getElementsByTagName('li');
console.log(lis); //HTMLCollection(10) [li, li, li, li, li, li, li, li, li, li]
console.log(lis[0]); //<li>知否知否,应是等你好久1</li>
//2. 依次打印里面的元素对象可以采取遍历的方式
for (var i = 0; i < lis.length; i++) {
console.log(lis[i]);
} //得到生僻字所有的li
//3. element.getElementsByTagName()可以得到这个元素里面的某些标签。搜索从element开始。请注意只有element的后代元素会被搜索,不包括元素自己。
//不一定非要写document.xxx。document开头是只从文档里开始向下查找子标签
var nav = document.getElementById('nav'); //获得Nav元素
var navLis = nav.getElementsByTagName('li');
console.log(navLis); //TMLCollection(5) [li, li, li, li, li]
</script>
</body>

2.3 通过HTML5新增的方法获取(不兼容ie678)---->getElementsByClassName()、querySelector('选择器')、querySelectorAll('选择器')

  • 语法1:
var element = document.getElementsByClassName('类名');//根据类名返回元素对象集合
  • 语法2:
var element = document.querySelector('选择器');//返回指定选择器的第一个元素对象
  • 语法3:
var element = document.querySelectorALL('选择器');//返回指定选择器的所有元素对象集合
  • 举例:
<body>
<div class="box">盒子1</div>
<div class="box">盒子2</div>
<div id="nav">
<ul>
<li>首页</li>
<li>产品</li>
</ul>
</div>
<script>
//1. getElementsByClassName('类名') 根据类名获取某些元素集合
var boxs = document.getElementsByClassName('box');
console.log(boxs); //HTMLCollection(2) [div.box, div.box] //2. querySelector('选择器')返回指定选择器的第一个元素对象 切记:里面的选择器需要加符号.box #nav
var firstBox = document.querySelector('.box'); //.box默认是类名
console.log(firstBox); //<div class="box">盒子1</div> var nav = document.querySelector('#nav') //#nav表示nav是id名
console.log(nav); //<div id="nav">...</div> var li = document.querySelector('li');
console.log(li); //<li>首页</li> //3. querySelectorAll('选择器');返回指定选择器的所有元素对象 集合 伪数组
var allBox = document.querySelectorAll('.box');
console.log(allBox);//NodeList(2) [div.box, div.box]
</script>
</body>

2.4 获取特殊元素body、html---->document.body、document.documentElement

<body>
<script>
//其实也可以通过取类名和id名来获得 但是很少这么做
//1. 获取body元素
var bodyEle = document.body;
console.log(bodyEle); //<body>...</body>
console.dir(bodyEle); //返回的是一个元素对象 //2. 获取html元素
var htmlEle = document.documentElement;
console.log(htmlEle);
// <html lang = "en">
// <head>...</head>
// <body>...</body>
// </html>
</script>
</body>

3. 事件基础

js使我们有能力创建动态页面,而事件是可以被js侦测到的行为,网页中每个元素都可以产生某些可以触发Js的事件。

3.1 事件

  • 事件三要素:事件源 事件类型 事件处理程序

    (1)事件源:事件被触发的对象(按钮)

    (2)事件类型:如何触发,eg:鼠标点击(onclick)、鼠标经过、键盘按下

    (3)事件处理程序:通过一个函数赋值的方式完成
<body>
<button id="btn">唐伯虎</button>
<script>
//实现功能:点击一个按钮,弹出对话框 //(1)事件源(按钮)
var btn = document.getElementById('btn'); //获取事件源
//(2)事件类型
//(3)事件处理程序
btn.onclick = function() {
alert('点秋香');
}
</script>
</body>

3.2 事件执行步骤

  • 获取事件源
  • 注册事件(绑定事件)
  • 添加事件处理程序(采取函数赋值形式)
<body>
<div>123</div>
<script>
//实现:点击div 控制台输出 我被选中了
//1. 获取事件源
var div = document.querySelector('div');
//2. 绑定事件 注册事件
//div.onclick
//3. 添加事件处理程序
div.onclick = function() {
console.log('我被选中了');
}
</script>
</body>

3.3 常见鼠标事件

4. 操作元素

js的DOM操作可以改变网页内容、结构和样式,我们可以利用DOM操作元素来改变元素里面的内容、属性等。注意:以下都是属性:

4.1 改变元素内容---->innerText、innerHTML

innerText
  • 语法:
element.innerText = "xxx";//innerText可以修改元素的内容
  • 举例
<body>
<button>显示当前系统时间</button>
<div>点击按钮后,我会显示当前时间</div>
<p>我不用点击,自动获取时间</p>
<script>
//要求:点击按钮之后将把当前时间显示到div中
// 1. 获取元素 获取两个元素 按钮是事件源
var btn = document.querySelector('button');
var div = document.querySelector('div');
//2. 注册事件
btn.onclick = function() {
div.innerText = getDate();
} //要求:p元素自动获取事件 不给p元素添加事件
var p = document.querySelector('p');
p.innerText = getDate(); //分装成的获取当前时间函数
function getDate() {
var date = new Date();
var year = date.getFullYear();
var month = date.getMonth() + 1;
var dates = date.getDate();
var arr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
var day = date.getDay();
console.log(day); return '今天是:' + year + '年' + month + '月' + dates + '日' + arr[day];
}
</script>
</body>
<style>
div,
p {
width: 300px;
height: 30px;
line-height: 30px;
color: #fff;
background-color: pink;
}
</style>
innerHTML和innerText的区别

区别1:innerText不识别html标签,而innerHTML识别html标签

<body>
<div></div>
<script>
var div = document.querySelector('div');
div.innerText = '<strong>今天是:</strong> 2020.1.18';
//1. innerText不识别html标签,所以div中的内容只会变成:<strong>今天是:</strong> 2020.1.18
div.innerHTML = '<strong>今天是:</strong> 2020.1.18';
//2. innerHTML识别html标签,所以div中的内容会变成:今天是:2020.1.18,同时“今天是:”会加粗显示
</script>
</body>

区别2:虽然这两个属性都是可读写的,可以获取元素内容,但是innerText忽略标签,删除空格和换行,而innerHTML保留标签空格和换行

<body>
<p>
我是文字
<span>123</span>
</p>
<script>
var p = document.querySelector('p');
//这两个属性都是可读写的,可以获取元素内容 console.log(p.innerText);//忽略标签,删除空格和换行
//我是文字 123 console.log(p.innerHTML);//保留标签空格和换行
// 我是文字
// <span>123</span>
</script>
</body>

综上:innerHTML是最常用的写法

4.2 常用元素的属性操作

(1)innerText、innerHTML改变元素内容

(2)src、href

(3)id、alt、title

(ps:href 表示超文本引用(hypertext reference),在 link和a 等元素上使用。src 表示来源地址,在 img、script、iframe 等元素上。

src 的内容,是页面必不可少的一部分,是引入。href 的内容,是与该页面有关联,是引用。区别就是,引入和引用。)

  • 语法
\\元素.属性 = "xxx";
  • 举例
<body>
<button id="ldh">刘德华</button>
<button id="zxy">张学友</button><br>
<img src="images/ldh.jpg" alt="" title="刘德华">
<script>
//案例要求:点击张学友按钮出现张学友的图片,点击刘德华出现刘德华的图片
//通过修改img元素的src属性和title属性来实现
//1. 获取元素
var ldh = document.getElementById('ldh');
var zxy = document.getElementById('zxy');
var img = document.querySelector('img');
//2. 绑定事件 3. 处理程序
zxy.onclick = function() {
//通过为 “元素.属性 ”赋值来修改该元素对应的属性
img.src = 'images/zxy.jpg';
img.title = '张学友'
}
ldh.onclick = function() {
img.src = 'images/ldh.jpg';
img.title = '刘德华';
}
</script>
</body>
案例

根据不同的时间显示不同的图片和问候语,如:上午打开页面显示上午好,显示上午图片;中午打开页面显示中午好,显示中午图片;下午打开页面显示下午好,显示下午图片

<body>
<img src="images/s.gif" alt="">
<div>上午好</div>
<script>
//获取元素
var img = document.querySelector('img');
var div = document.querySelector('div');
//得到当前的小时数
var date = new Date();
var h = date.getHours();
//判断小时数,改变图片和文字信息
if (h < 12) {
img.src = "images/s.gif";
div.innerHTML = "亲,上午好!";
} else if (h < 18) {
img.src = "images/x.gif";
div.innerHTML = "亲,下午好!";
} else {
img.src = "images/w.gif";
div.innerHTML = "亲,晚上好!";
}
</script>
</body>

4.3 表单元素的属性操作

利用DOM可以操作如下表单元素属性:type、value、checked、selected、disabled

  • value:修改表单里的文字内容,不是通过innerHTML。eg:input.value = 'xxx';
  • disabled:禁用表单,不能再次点击.eg:btn.disabled = true
  • checked:如表单的type="checkbox",有一个属性checked,若写成checked='checked'则表示被选中,若不写该属性则默认未被选中。eg:input.checked = "true"表示该表单被选中,若为false则表示没有被选中。
<body>
<button>按钮</button>
<input type="text" value="输入内容">
<script>
//1. 获取元素
var btn = document.querySelector('button');
var input = document.querySelector('input');
//2. 注册事件 处理程序
btn.onclick = function() {
//input.innerHTML('被点击了');
//表单里的文字内容是通过value来修改的,而不是通过innerHTML
input.value = '被点击了';
//想要表单禁用 不能再次点击
//btn.disabled = true;
//还可以
this.disabled = true; //this指向事件函数的调用者 btn
//这里是表单禁用,若是隐藏某个div盒子应该在样式里该,所以应该写成:div.style.display = 'none';
}
</script>
</body>
案例:仿京东显示密码案例



点击按钮将密码框切换为文本框,查看密码明文;一个按钮两个状态,点击一次切换为文本框,继续点击一次切换为密码框。

<body>
<div class="box">
<label for="">
<img src="images/close.png" alt="" id="eye">
</label>
<input type="password" id="pwd">
<script>
//1. 获取元素
var eye = document.getElementById('eye');
var pwd = document.getElementById('pwd');
//2. 注册事件 处理程序
var flag = 0;
eye.onclick = function() {
if (flag == 0) {
pwd.type = 'text';
eye.src = 'images/open.png';
flag = 1;
} else {
pwd.type = 'password';
eye.src = 'images/close.png';
flag = 0;
}
}
</script>
</div>
</body>
<style>
.box {
position: relative;
width: 400px;
border-bottom: 1px solid #ccc;
margin: 100px auto;
} .box input {
width: 370px;
height: 30px;
border: 0;
outline: 0;
} .box img {
position: absolute;
top: 2px;
right: 2px;
width: 24px;
}
</style>

4.4 样式属性操作---->element.style、element.className

通过js修改元素的大小、颜色、位置等信息。

  • 语法
element.style.样式 = "样式";//行内样式操作
element.className = "类名";

element.style 行内样式操作

  • js里面的样式采取驼峰命名法,比如fontSize、backgroundColor
  • js修改style样式操作,产生的是行内样式,css权重较高,所以可以覆盖原先的样式
<body>
<div></div>
<script>
//要求:点击div之后,div的样式发生改变
//1. 获取元素
var div = document.querySelector('div');
//2. 注册事件 3. 处理程序
div.onclick = function() {
//div.style.backgroundColor
this.style.backgroundColor = 'purple';
this.style.width = '250px';
}
</script>
</body>
<style>
div {
width: 200px;
height: 200px;
background-color: pink;
}
</style>

案例:关闭二维码

思路:利用样式的显示和隐藏完成,display:none;隐藏元素。display:block;显示元素。

<body>
<div class="box">
淘宝二维码
<img src="images/tao.png" alt="">
<i class="close-btn">×</i>
</div>
<script>
//1. 获取元素
var btn = document.querySelector('.close-btn');
var box = document.querySelector('.box');
//2. 注册事件 3. 程序处理
btn.onclick = function() {
box.style.display = 'none';
}
</script>
</body>

已经省略相样式

案例:循环精灵图背景

  • 精灵图的排列有规律 竖着排列
  • 利用for循环修改精灵图片的位置背景background-position
  • 第一个图y坐标:0;第二个图y坐标:44px;第三个图y坐标: 88px;每个图的x坐标都是0
<body>
<div class="box">
<ul>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
</div>
<script>
//1. 获取元素 获取所有的小li
var lis = document.querySelectorAll('li');
for (var i = 0; i < lis.length; i++) {
var index = i * 44;
lis[i].style.backgroundPosition = '0 -' + index + 'px';
}
</script>
</body>

样式部分已经省略

案例:显示隐藏的文本框的内容

  • 首先表单需要两个新事件,获得焦点和失去焦点
  • 获得焦点之后,判断表单里的内容是否为默认文字,若是默认文字则清空表单内容
  • 失去焦点后,判断表单内容是否为空,如果为空则将表单内容还原为默认内容
<body>
<input type="text" value="手机">
<script>
//1. 获取元素
var text = document.querySelector('input');
//2. 注册事件
text.onfocus = function() {
//console.log('得到了焦点');
if (this.value === '手机') {
this.value = ''; //清空
}
//获得焦点需要把文本框里面的文字变黑
this.style.color = '#333';
}
//3. 注册事件 失去焦点事件
text.onblur = function() {
//console.log('失去了焦点');
if (this.value === '') {
this.value = '手机';
}
//获得焦点需要把文本框里面的文字色号复原
this.style.color = '#999';
}
</script>
</body>
<style>
input {
color: #999;
}
</style>

element.className 类名样式操作

在将要修改的样式比较少的情况下可用用element.style来修改样式,但是若修改的样式比较多则使用element.className来修改样式

<body>
<div>文本</div>
<script>
var text = document.querySelector('div');
text.onclick = function() {
//1. 使用element.style 修改元素样式 用于样式较少 或者功能简单的情况下使用
// this.style.backgroundColor = 'purple';
// this.style.color = '#fff';
// this.style.fontsize = '25px';
// this.style.marginTop = '100px'; // 2. 使用element.className 修改元素样式 用于样式较多 或者功能复杂的情况下使用
this.className = 'change'; //将当前元素的类名变成change,这里采取的是赋值的方式,就算原先有类名也会被覆盖掉
//3. 若又想保留原先的类名,又想添加新类名的技巧如下:
//利用多类名选择器this.className = 'first change'; 其中first为原先的类名;change为新添加的类名 }
</script>
</body>
<style>
div {
width: 100px;
height: 100px;
background-color: pink;
} .change {
background-color: purple;
color: #fff;
font-size: 25px;
margin-top: 100px;
}
</style>

案例:密码框格式提示错误信息

  • 首先判断的事件是表单失去焦点
  • 如果输入正确则提示正确信息,小图标为绿色
  • 如果输入不到6到16位,则提示错误信息,小图标为红色
  • 如果里面变化样式较多,采取className修改样式
<body>
<div class="register">
<input type="password" class="ipt">
<p class="message">请输入6~16位密码</p>
</div>
<script>
//1. 获取元素
var ipt = document.querySelector('.ipt');
var message = document.querySelector('.message');
//2. 注册事件 失去焦点
ipt.onblur = function() {
//根据表单里面值的长度ip.value.length
if (this.value.length < 6 || this.value.lengh > 16) {
message.className = 'message wrong';
message.innerHTML = '您输入的位数不对,要求0~16位';
} else {
message.className = 'message right';
message.innerHTML = '输入正确';
}
}
</script>
</body>
<style>
div {
width: 600px;
margin: 100px auto;
} .message {
display: inline-block;
font-size: 12px;
color: #999;
background: url(images/mess.png) no-repeat left center;
padding-left: 20px;
} .wrong {
color: red;
background: url(images/wrong.png) no-repeat left center;
} .right {
color: green;
background: url(images/right.png) no-repeat left center;
}
</style>

操作元素总结

作业:(1)世纪佳缘案例(2)JD关闭广告(3)新浪下拉菜单(4)开关灯

最新文章

  1. FusionCharts-堆栈图、xml格式、刷新数据、添加事件link、传参
  2. sql视图实例
  3. __attribute__特性介绍以及变量和函数特定布局设置
  4. JAVA类与对象(五)----对象的生成、使用
  5. yum安装软件时提示软件包没有签名
  6. HDU-2549 壮志难酬
  7. centos 彻底卸载mysql
  8. node场景
  9. 高级UIKit-05(CoreData)
  10. pig 的chararry不能用于比较的类型可以comparison operator
  11. Express安装入门与模版引擎ejs
  12. Unity3DGUI:Window
  13. echarts雷达图点击事件
  14. POJ3155 Hard Life [最大密度子图]
  15. Spring Cache扩展:注解失效时间+主动刷新缓存(二)
  16. sql中varchar(n),nvarchar(n) 长度性能及所占空间分析
  17. 朋友给的IE滚动条
  18. 【Shell实战】定期清理日志文件的shell脚本
  19. Python下载与安装配置
  20. iOS.ChangeIniOS7

热门文章

  1. Ant Design Vue Pro 项目实战-项目初始化(一)
  2. VFP CursorAdapter 起步二(作者:Doug Hennig 译者:fbilo)
  3. 学习CSS之用CSS实现时钟效果
  4. pycharm template 设置
  5. Linux Shell 计算脚本执行过程用了多长时间
  6. HDU 5234 背包。
  7. Leetcode:110. 平衡二叉树
  8. K8S集群入门:运行一个应用程序究竟需要多少集群?
  9. Vue.js 从源码理解v-for和v-if的优先级的高低
  10. SAP 事务代码 ME31K 报错 - 不含来自带工厂分配的供应商的物料的采购没有被定义 -